summaryrefslogtreecommitdiff
path: root/Runtime/GfxDevice/d3d/ShaderGenerator.h
blob: ccc52b72706144f11a29b2e6e632dde79ee5a620 (plain)
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;