summaryrefslogtreecommitdiff
path: root/src/core/shader.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-12-04 00:07:32 +0800
committerchai <chaifix@163.com>2019-12-04 00:07:32 +0800
commit2e82e2ddd0852b8063a3d6645366f53ee844e273 (patch)
tree41ec10760f2d2c9f1f782a918f48e1287da2a4b4 /src/core/shader.h
+init
Diffstat (limited to 'src/core/shader.h')
-rw-r--r--src/core/shader.h89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/core/shader.h b/src/core/shader.h
new file mode 100644
index 0000000..8da8ae3
--- /dev/null
+++ b/src/core/shader.h
@@ -0,0 +1,89 @@
+#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;
+ /*userside variables*/
+ Mat4 var_mat4[8];
+ Vec4 var_vec4[8];
+ Vec3 var_vec3[8];
+ Vec2 var_vec2[8];
+} UniformCollection;
+
+#define ssrum4(i) (uniforms->var_mat4[i])
+#define ssruv2(i) (uniforms->var_vec2[i])
+#define ssruv3(i) (uniforms->var_vec3[i])
+#define ssruv4(i) (uniforms->var_vec4[i])
+
+typedef struct VertexShaderIn {
+ Vert* vertex;
+} VertexShaderIn;
+
+typedef void(*VertexShader)(UniformCollection* uniforms, VertexShaderIn* in, Vec4* homocoord);
+
+typedef struct FragmentShaderIn {
+ Vert *A, *B, *C;
+ Vec3* bc;
+} FragmentShaderIn;
+
+typedef bool(*FragmentShader)(UniformCollection* uniforms, FragmentShaderIn* in, Color* color);
+
+typedef struct Program {
+ VertexShader vertexshader;
+ FragmentShader fragmentshader;
+} 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);
+
+/*
+** 顶点数据外,还提供额外的寄存器
+*/
+enum RegisterType {
+ REGTYPE_VEC2 = 1,
+ REGTYPE_VEC4 = 2,
+ REGTYPE_VEC3 = 3,
+};
+
+typedef struct Register {
+ uint length;
+ uint type;
+ union {
+ Vec4* v4;
+ Vec2* v2;
+ Vec3* v3;
+ };
+} Register;
+
+void ssrS_setregvec4_01i(uint idx, Vec4* value);
+void ssrS_setregvec4_02i(uint idx, Vec4* value);
+void ssrS_setregvec2_01i(uint idx, Vec2* value);
+void ssrS_setregvec2_02i(uint idx, Vec2* value);
+void ssrS_setregvec3_01i(uint idx, Vec3* value);
+void ssrS_setregvec3_02i(uint idx, Vec3* value);
+
+Vec4* ssrS_getregvec4_01i(uint idx);
+Vec4* ssrS_getregvec4_02i(uint idx);
+Vec2* ssrS_getregvec2_01i(uint idx);
+Vec2* ssrS_getregvec2_02i(uint idx);
+Vec3* ssrS_getregvec3_01i(uint idx);
+Vec3* ssrS_getregvec3_02i(uint idx);
+
+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);
+
+#endif \ No newline at end of file