summaryrefslogtreecommitdiff
path: root/src/core/shader.h
blob: 3024a0d985158eccc3d65f1c6ddc2697bb80a6d2 (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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#ifndef _SOFTSHADEROOM_SHADER_H_
#define _SOFTSHADEROOM_SHADER_H_

#include "../math/math.h"
#include "vert.h"

typedef struct UniformCollection {
	/*built in varaibles*/
	Mat4* model;
	Mat4* view;
	Mat4* projection;
	Mat4* mvp;
	Mat4* mv;
	/*extra variables*/
	Mat4 var_mat4[8];
	Vec4 var_vec4[8];
	Vec3 var_vec3[8];
	Vec2 var_vec2[8];
	float var_num[8];
	/*userdata*/
	void* userdata;
} UniformCollection;

#define UM4(i) (&uniforms->var_mat4[i])
#define UV2(i) (&uniforms->var_vec2[i])
#define UV3(i) (&uniforms->var_vec3[i])
#define UV4(i) (&uniforms->var_vec4[i])
#define UN(i) (&uniforms->var_num[i])

typedef struct VertexShaderIn {
	Vert* vertex;
} VertexShaderIn;

typedef void(*VertexShader)(UniformCollection* uniforms, VertexShaderIn* in, Vec4* homocoord);

typedef struct FragmentShaderIn {
	/*value from vertices interpolation*/
	Vec3 position;
	Vec3 normal; 
	Vec3 tangent; 
	Vec2 texcoord; 
	Color color; 
	Vec4 joint;
	Vec4 weight;
	/*value from registers interpolation*/
	float num[4];
	Vec2 v2[6];
	Vec3 v3[8];
	Vec4 v4[6];
} FragmentShaderIn;

typedef bool(*FragmentShader)(UniformCollection* uniforms, FragmentShaderIn* in, Color* color);

typedef struct Program {
	VertexShader vertexshader;
	FragmentShader fragmentshader; 
	uint varying_flag;
} Program;

#define VARYING_NONE     (0)

#define VARYING_POSITION (1 << 31)
#define VARYING_NORMAL   (1 << 30)
#define VARYING_TANGENT  (1 << 29)
#define VARYING_TEXCOORD (1 << 28)
#define VARYING_COLOR		 (1 << 27)
#define VARYING_JOINT		 (1 << 26)
#define VARYING_WEIGHT   (1 << 25)

#define VARYING_UNUSED   (1 << 24) 

#define VARYING_BASIC  ( VARYING_UNUSED | VARYING_POSITION | VARYING_NORMAL | VARYING_TANGENT | VARYING_TEXCOORD | VARYING_COLOR | VARYING_JOINT | VARYING_WEIGHT )

#define VARYING_NUM_00		 (1 << 20)
#define VARYING_NUM_01		 (1 << 21)
#define VARYING_NUM_02		 (1 << 22)
#define VARYING_NUM_03		 (1 << 23)

#define VARYING_NUM      (VARYING_NUM_00 | VARYING_NUM_01 | VARYING_NUM_02 | VARYING_NUM_03 )
												 
#define VARYING_V2_00		 (1)
#define VARYING_V2_01		 (1 << 1)
#define VARYING_V2_02		 (1 << 2)
#define VARYING_V2_03		 (1 << 3)
#define VARYING_V2_04		 (1 << 4)
#define VARYING_V2_05		 (1 << 5)

#define VARYING_V2       (VARYING_V2_00 | VARYING_V2_01 | VARYING_V2_02 | VARYING_V2_03 | VARYING_V2_04 | VARYING_V2_05)
												 
#define VARYING_V3_00		 (1 << 6)
#define VARYING_V3_01		 (1 << 7)
#define VARYING_V3_02		 (1 << 8)
#define VARYING_V3_03		 (1 << 9)
#define VARYING_V3_04		 (1 << 10)
#define VARYING_V3_05		 (1 << 11)
#define VARYING_V3_06		 (1 << 12)
#define VARYING_V3_07		 (1 << 13)

#define VARYING_V3       (VARYING_V3_00 | VARYING_V3_01 | VARYING_V3_02 | VARYING_V3_03 | VARYING_V3_04 | VARYING_V3_05| VARYING_V3_06| VARYING_V3_07)
												 
#define VARYING_V4_00		 (1 << 14)
#define VARYING_V4_01		 (1 << 15)
#define VARYING_V4_02		 (1 << 16)
#define VARYING_V4_03		 (1 << 17)
#define VARYING_V4_04		 (1 << 18)
#define VARYING_V4_05		 (1 << 19)

#define VARYING_V4       (VARYING_V4_00 | VARYING_V4_01 | VARYING_V4_02 | VARYING_V4_03 | VARYING_V4_04 | VARYING_V4_05)

#define VARYING_EXTRA    (~VARYING_BASIC)

float* ssrS_bcpnum(Vec3* bc, float A, float B, float C, float* out);
Color* ssrS_bcpcolor(Vec3* bc, Color A, Color B, Color C, Color* out);
Vec2*  ssrS_bcpvec2(Vec3* bc, Vec2* A, Vec2* B, Vec2* C, Vec2* out);
Vec3* ssrS_bcpvec3(Vec3* bc, Vec3* A, Vec3* B, Vec3* C, Vec3* out);
Vec4* ssrS_bcpvec4(Vec3* bc, Vec4* A, Vec4* B, Vec4* C, Vec4* out);

void ssrS_lerpnum(float t, float A, float B, float* out);
void ssrS_lerpcolor(float t, Color A, Color B, Color* out);
void ssrS_lerpvec2(float t, Vec2* A, Vec2* B, Vec2* out);
void ssrS_lerpvec3(float t, Vec3* A, Vec3* B, Vec3* out);
void ssrS_lerpvec4(float t, Vec4* A, Vec4* B, Vec4* out);

void ssrS_setregisters(uint flag, int capacity);

/*
** 顶点数据外,还提供额外的寄存器用来存储vertex shader输出的顶点额外数据
** 共24个
*/
enum RegisterType {
	REGTYPE_NUM = 1,
	REGTYPE_VEC2,
	REGTYPE_VEC4,
	REGTYPE_VEC3,
};

typedef struct Register {
	uint length;
	uint type;
	union {
		float* num;
		Vec2* v2;
		Vec4* v4;
		Vec3* v3;
	};
} Register;

#define REG_NUM_COUNT 4
#define REG_V2_COUNT 6 
#define REG_V3_COUNT 8
#define REG_V4_COUNT 6

Register reg_num[4];
Register reg_v2[6];
Register reg_v3[8];
Register reg_v4[6];

void reg_all_wipe(); /*标记清空所有寄存器*/

/*寄存器指针,使用错误可能会出现野指针*/

float* reg_num_00;
float* reg_num_01;
float* reg_num_02;
float* reg_num_03;

Vec2* reg_v2_00;
Vec2* reg_v2_01;
Vec2* reg_v2_02;
Vec2* reg_v2_03;
Vec2* reg_v2_04;
Vec2* reg_v2_05;

Vec3* reg_v3_00;
Vec3* reg_v3_01;
Vec3* reg_v3_02;
Vec3* reg_v3_03;
Vec3* reg_v3_04;
Vec3* reg_v3_05;
Vec3* reg_v3_06;
Vec3* reg_v3_07;

Vec4* reg_v4_00;
Vec4* reg_v4_01;
Vec4* reg_v4_02;
Vec4* reg_v4_03;
Vec4* reg_v4_04;
Vec4* reg_v4_05;

/*设置寄存器指针,指向寄存器(注意在fragment阶段,指针会指向fragmentIn结构)*/
void ssrS_setupregisterpoints(uint extra_varying_flag, int idx);

/*设置寄存器指针,指向fragIn结构*/
void ssrS_setregtofragin(uint extra_varying_flag, FragmentShaderIn* frag_in);

#endif