summaryrefslogtreecommitdiff
path: root/src/core/shader.h
blob: 8da8ae33eb5275f480807b27964c7250eb89e039 (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
#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