summaryrefslogtreecommitdiff
path: root/src/core/shader.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/shader.h')
-rw-r--r--src/core/shader.h161
1 files changed, 135 insertions, 26 deletions
diff --git a/src/core/shader.h b/src/core/shader.h
index 15dfc26..3024a0d 100644
--- a/src/core/shader.h
+++ b/src/core/shader.h
@@ -11,17 +11,21 @@ typedef struct UniformCollection {
Mat4* projection;
Mat4* mvp;
Mat4* mv;
- /*userside variables*/
+ /*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;
@@ -30,58 +34,163 @@ typedef struct VertexShaderIn {
typedef void(*VertexShader)(UniformCollection* uniforms, VertexShaderIn* in, Vec4* homocoord);
typedef struct FragmentShaderIn {
- Vert *A, *B, *C;
- Vec3* bc;
+ /*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;
+ VertexShader vertexshader;
FragmentShader fragmentshader;
+ uint varying_flag;
} Program;
-void ssrS_bcpcolor(Vec3* bc, Color A, Color B, Color C, Color* out);
-void ssrS_bcpvec2(Vec3* bc, Vec2* A, Vec2* B, Vec2* C, Vec2* out);
-void ssrS_bcpvec3(Vec3* bc, Vec3* A, Vec3* B, Vec3* C, Vec3* out);
-void ssrS_bcpvec4(Vec3* bc, Vec4* A, Vec4* B, Vec4* C, Vec4* out);
+#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_VEC2 = 1,
- REGTYPE_VEC4 = 2,
- REGTYPE_VEC3 = 3,
+ REGTYPE_NUM = 1,
+ REGTYPE_VEC2,
+ REGTYPE_VEC4,
+ REGTYPE_VEC3,
};
typedef struct Register {
uint length;
uint type;
union {
- Vec4* v4;
+ float* num;
Vec2* v2;
+ Vec4* v4;
Vec3* v3;
};
} Register;
-void ssrS_setregvec4_01(Vert* vert, Vec4* value);
-void ssrS_setregvec4_02(Vert* vert, Vec4* value);
-void ssrS_setregvec2_01(Vert* vert, Vec2* value);
-void ssrS_setregvec2_02(Vert* vert, Vec2* value);
-void ssrS_setregvec3_01(Vert* vert, Vec3* value);
-void ssrS_setregvec3_02(Vert* vert, Vec3* value);
-
-Vec4* ssrS_getregvec4_01(Vert* vert);
-Vec4* ssrS_getregvec4_02(Vert* vert);
-Vec2* ssrS_getregvec2_01(Vert* vert);
-Vec2* ssrS_getregvec2_02(Vert* vert);
-Vec3* ssrS_getregvec3_01(Vert* vert);
-Vec3* ssrS_getregvec3_02(Vert* vert);
+#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 \ No newline at end of file