1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#pragma once
#include <string>
enum ShaderConstant {
kConstMatrixMVP, // model*view*proj
kConstMatrixMV, // model*view
kConstMatrixMV_IT, // model*view inverse transpose
kConstMatrixTexture,// texture matrix
kConstAmbient, // materialEmissive + sceneAmbient * materialAmbient
kConstColorMatAmbient, // various combos of kConstAmbient, based on color material mode
kConstLightMisc, // 0, 4, 1, 0.5
kConstMatDiffuse, // material diffuse
kConstMatSpecular, // material specular
kConstLightIndexes, // light start indexes * 4
kConstCount
};
extern const int kConstantLocations[kConstCount];
struct ShaderFragment
{
unsigned int inputs;
unsigned int constants;
unsigned int dependencies;
unsigned int options;
int temps;
const char* ins;
const char* outs;
const char* text;
};
class ShaderGenerator
{
public:
enum {
kMaxShaderFragments = 32,
kMaxTempRegisters = 12,
kMaxSavedRegisters = 16,
};
private:
struct FragmentData {
FragmentData() : fragment(NULL), inputNames(NULL), param(0) { }
FragmentData( const ShaderFragment* f, const char* inames, int p ) : fragment(f), inputNames(inames), param(p) { }
bool operator==( const FragmentData& rhs ) const {
return
fragment==rhs.fragment &&
param==rhs.param &&
((inputNames==NULL && rhs.inputNames==NULL) || (inputNames && rhs.inputNames && !strcmp(inputNames, rhs.inputNames)));
}
const ShaderFragment* fragment;
const char* inputNames;
int param;
};
public:
ShaderGenerator() : m_FragmentCount(0)
{
}
void AddFragment( const ShaderFragment* fragment, const char* inputNames = NULL, int param = -1 );
void GenerateShader( std::string& output, unsigned int& usedConstants );
private:
int m_FragmentCount;
FragmentData m_Fragments[kMaxShaderFragments];
};
extern const ShaderFragment kVS_Pos;
extern const ShaderFragment kVS_Light_Diffuse_Pre;
extern const ShaderFragment kVS_Light_Diffuse_Dir;
extern const ShaderFragment kVS_Light_Diffuse_Point;
extern const ShaderFragment kVS_Light_Diffuse_Spot;
extern const ShaderFragment kVS_Light_Specular_Pre;
extern const ShaderFragment kVS_Light_Specular_Dir;
extern const ShaderFragment kVS_Light_Specular_Point;
extern const ShaderFragment kVS_Light_Specular_Spot;
extern const ShaderFragment kVS_Out_Diffuse_Lighting;
extern const ShaderFragment kVS_Out_Specular_Lighting;
extern const ShaderFragment kVS_Out_Diffuse_Lighting_ColorDiffuseAmbient;
extern const ShaderFragment kVS_Out_Diffuse_Lighting_ColorEmission;
extern const ShaderFragment kVS_Out_Diffuse_VertexColor;
extern const ShaderFragment kVS_Out_Diffuse_White;
extern const ShaderFragment kVS_Load_UV0;
extern const ShaderFragment kVS_Load_UV1;
extern const ShaderFragment kVS_Load_Normal;
extern const ShaderFragment kVS_Normalize_Normal;
extern const ShaderFragment kVS_Out_TexCoord;
extern const ShaderFragment kVS_Out_Matrix2;
extern const ShaderFragment kVS_Out_Matrix3;
extern const ShaderFragment kVS_Temp_CamSpacePos;
extern const ShaderFragment kVS_Temp_CamSpaceN;
extern const ShaderFragment kVS_Temp_CamSpaceRefl;
extern const ShaderFragment kVS_Temp_ObjSpacePos;
extern const ShaderFragment kVS_Temp_SphereMap;
|