diff options
Diffstat (limited to 'src/core/shader.c')
-rw-r--r-- | src/core/shader.c | 261 |
1 files changed, 257 insertions, 4 deletions
diff --git a/src/core/shader.c b/src/core/shader.c index fe25408..b5d8407 100644 --- a/src/core/shader.c +++ b/src/core/shader.c @@ -1,8 +1,226 @@ +#include "../math/math.h" #include "shader.h" #include "vert.h" #include "device.h" -void ssrS_bcpcolor(Vec3* bc, Color A, Color B, Color C, Color* out) { +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; + +Register reg_num[4] = { + { 0, REGTYPE_NUM, NULL }, + { 0, REGTYPE_NUM, NULL }, + { 0, REGTYPE_NUM, NULL }, + { 0, REGTYPE_NUM, NULL }, +}; + +Register reg_v2[6] = { + { 0, REGTYPE_VEC2, NULL }, + { 0, REGTYPE_VEC2, NULL }, + { 0, REGTYPE_VEC2, NULL }, + { 0, REGTYPE_VEC2, NULL }, + { 0, REGTYPE_VEC2, NULL }, + { 0, REGTYPE_VEC2, NULL }, +}; + +Register reg_v3[8] = { + { 0, REGTYPE_VEC3, NULL }, + { 0, REGTYPE_VEC3, NULL }, + { 0, REGTYPE_VEC3, NULL }, + { 0, REGTYPE_VEC3, NULL }, + { 0, REGTYPE_VEC3, NULL }, + { 0, REGTYPE_VEC3, NULL }, + { 0, REGTYPE_VEC3, NULL }, + { 0, REGTYPE_VEC3, NULL }, +}; + +Register reg_v4[6] = { + { 0, REGTYPE_VEC4, NULL }, + { 0, REGTYPE_VEC4, NULL }, + { 0, REGTYPE_VEC4, NULL }, + { 0, REGTYPE_VEC4, NULL }, + { 0, REGTYPE_VEC4, NULL }, + { 0, REGTYPE_VEC4, NULL }, +}; + +void ssrS_setregisters(uint flag, int capacity) { +#define reg_scale_num(i) \ +if (flag & VARYING_NUM_##i) ssrM_rescalevector(float, reg_num[##i].num, reg_num[##i].length, capacity, FALSE) + +#define reg_scale_v2(i) \ +if (flag & VARYING_V2_##i) ssrM_rescalevector(float, reg_v2[##i].v2, reg_v2[##i].length, capacity, FALSE) + +#define reg_scale_v3(i) \ +if (flag & VARYING_V3_##i) ssrM_rescalevector(float, reg_v3[##i].v3, reg_v3[##i].length, capacity, FALSE) + +#define reg_scale_v4(i) \ +if (flag & VARYING_V4_##i) ssrM_rescalevector(float, reg_v4[##i].v4, reg_v4[##i].length, capacity, FALSE) + + if (!(flag & VARYING_EXTRA)) + return; + if (flag & VARYING_NUM) { + reg_scale_num(00); + reg_scale_num(01); + reg_scale_num(02); + reg_scale_num(03); + } + if (flag & VARYING_V2) { + reg_scale_v2(00); + reg_scale_v2(01); + reg_scale_v2(02); + reg_scale_v2(03); + reg_scale_v2(04); + reg_scale_v2(05); + } + if (flag & VARYING_V3) { + reg_scale_v3(00); + reg_scale_v3(01); + reg_scale_v3(02); + reg_scale_v3(03); + reg_scale_v3(04); + reg_scale_v3(05); + reg_scale_v3(06); + reg_scale_v3(07); + } + if (flag & VARYING_V4) { + reg_scale_v4(00); + reg_scale_v4(01); + reg_scale_v4(02); + reg_scale_v4(03); + reg_scale_v4(04); + reg_scale_v4(05); + } +} + +void ssrS_setupregisterpoints(uint extra_varying_flag, int idx) { +#define set_reg_num_pointer(i)\ + if (extra_varying_flag & VARYING_NUM_##i) reg_num_##i = ®_num[##i].num[idx]; + +#define set_reg_v2_pointer(i)\ + if (extra_varying_flag & VARYING_V2_##i) reg_v2_##i = ®_v2[##i].v2[idx]; + +#define set_reg_v3_pointer(i)\ + if (extra_varying_flag & VARYING_V3_##i) reg_v3_##i = ®_v3[##i].v3[idx]; + +#define set_reg_v4_pointer(i)\ + if (extra_varying_flag & VARYING_V4_##i) reg_v4_##i = ®_v4[##i].v4[idx]; + + if (!(extra_varying_flag & VARYING_EXTRA)) + return; + if (extra_varying_flag & VARYING_NUM) { + set_reg_num_pointer(00); + set_reg_num_pointer(01); + set_reg_num_pointer(02); + set_reg_num_pointer(03); + } + if (extra_varying_flag & VARYING_V2) { + set_reg_v2_pointer(00); + set_reg_v2_pointer(01); + set_reg_v2_pointer(02); + set_reg_v2_pointer(03); + set_reg_v2_pointer(04); + set_reg_v2_pointer(05); + } + if (extra_varying_flag & VARYING_V3) { + set_reg_v3_pointer(00); + set_reg_v3_pointer(01); + set_reg_v3_pointer(02); + set_reg_v3_pointer(03); + set_reg_v3_pointer(04); + set_reg_v3_pointer(05); + set_reg_v3_pointer(06); + set_reg_v3_pointer(07); + } + if (extra_varying_flag & VARYING_V4) { + set_reg_v4_pointer(00); + set_reg_v4_pointer(01); + set_reg_v4_pointer(02); + set_reg_v4_pointer(03); + set_reg_v4_pointer(04); + set_reg_v4_pointer(05); + } +} + +void ssrS_setregtofragin(uint extra_varying_flag, FragmentShaderIn* frag_in){ +#define set_reg_num_pointer_to_fragin(i)\ + if (extra_varying_flag & VARYING_NUM_##i) reg_num_##i = &frag_in->num[##i]; + +#define set_reg_v2_pointer_to_fragin(i)\ + if (extra_varying_flag & VARYING_V2_##i) reg_v2_##i = &frag_in->v2[##i]; + +#define set_reg_v3_pointer_to_fragin(i)\ + if (extra_varying_flag & VARYING_V3_##i) reg_v3_##i = &frag_in->v3[##i]; + +#define set_reg_v4_pointer_to_fragin(i)\ + if (extra_varying_flag & VARYING_V4_##i) reg_v4_##i = &frag_in->v4[##i]; + + if (!(extra_varying_flag & VARYING_EXTRA)) + return; + if (extra_varying_flag & VARYING_NUM) { + set_reg_num_pointer_to_fragin(00); + set_reg_num_pointer_to_fragin(01); + set_reg_num_pointer_to_fragin(02); + set_reg_num_pointer_to_fragin(03); + } + if (extra_varying_flag & VARYING_V2) { + set_reg_v2_pointer_to_fragin(00); + set_reg_v2_pointer_to_fragin(01); + set_reg_v2_pointer_to_fragin(02); + set_reg_v2_pointer_to_fragin(03); + set_reg_v2_pointer_to_fragin(04); + set_reg_v2_pointer_to_fragin(05); + } + if (extra_varying_flag & VARYING_V3) { + set_reg_v3_pointer_to_fragin(00); + set_reg_v3_pointer_to_fragin(01); + set_reg_v3_pointer_to_fragin(02); + set_reg_v3_pointer_to_fragin(03); + set_reg_v3_pointer_to_fragin(04); + set_reg_v3_pointer_to_fragin(05); + set_reg_v3_pointer_to_fragin(06); + set_reg_v3_pointer_to_fragin(07); + } + if (extra_varying_flag & VARYING_V4) { + set_reg_v4_pointer_to_fragin(00); + set_reg_v4_pointer_to_fragin(01); + set_reg_v4_pointer_to_fragin(02); + set_reg_v4_pointer_to_fragin(03); + set_reg_v4_pointer_to_fragin(04); + set_reg_v4_pointer_to_fragin(05); + } +} + +float* ssrS_bcpnum(Vec3* bc, float A, float B, float C, float* out) { + ssr_assert(bc && out); + *out = bc->A * A + bc->B * B + bc->C * C; + return out; +} + +Color* ssrS_bcpcolor(Vec3* bc, Color A, Color B, Color C, Color* out) { ssr_assert(bc && out); *out = ssr_color( bc->A * COLOR_R(A) + bc->B * COLOR_R(B) + bc->C * COLOR_R(C), @@ -10,25 +228,60 @@ void ssrS_bcpcolor(Vec3* bc, Color A, Color B, Color C, Color* out) { bc->A * COLOR_B(A) + bc->B * COLOR_B(B) + bc->C * COLOR_B(C), bc->A * COLOR_A(A) + bc->B * COLOR_A(B) + bc->C * COLOR_A(C) ); + return out; } -void ssrS_bcpvec2(Vec3* bc, Vec2* A, Vec2* B, Vec2* C, Vec2* out) { +Vec2* ssrS_bcpvec2(Vec3* bc, Vec2* A, Vec2* B, Vec2* C, Vec2* out) { ssr_assert(bc && A && B && C && out); out->x = bc->A * A->x + bc->B * B->x + bc->C * C->x; out->y = bc->A * A->y + bc->B * B->y + bc->C * C->y; + return out; } -void ssrS_bcpvec3(Vec3* bc, Vec3* A, Vec3* B, Vec3* C, Vec3* out) { +Vec3* ssrS_bcpvec3(Vec3* bc, Vec3* A, Vec3* B, Vec3* C, Vec3* out) { ssr_assert(bc && A && B && C && out); out->x = bc->A * A->x + bc->B * B->x + bc->C * C->x; out->y = bc->A * A->y + bc->B * B->y + bc->C * C->y; out->z = bc->A * A->z + bc->B * B->z + bc->C * C->z; + return out; } -void ssrS_bcpvec4(Vec3* bc, Vec4* A, Vec4* B, Vec4* C, Vec4* out) { +Vec4* ssrS_bcpvec4(Vec3* bc, Vec4* A, Vec4* B, Vec4* C, Vec4* out) { ssr_assert(bc && A && B && C && out); out->x = bc->A * A->x + bc->B * B->x + bc->C * C->x; out->y = bc->A * A->y + bc->B * B->y + bc->C * C->y; out->z = bc->A * A->z + bc->B * B->z + bc->C * C->z; out->w = bc->A * A->w + bc->B * B->w + bc->C * C->w; + return out; +} + +void ssrS_lerpnum(float t, float A, float B, float* out) { + *out = lerp(A, B, t); +} + +void ssrS_lerpcolor(float t, Color A, Color B, Color* out) { + *out = ssr_color( + lerp(COLOR_R(A), COLOR_R(B), t), + lerp(COLOR_G(A), COLOR_G(B), t), + lerp(COLOR_B(A), COLOR_B(B), t), + lerp(COLOR_A(A), COLOR_A(B), t) + ); +} + +void ssrS_lerpvec2(float t, Vec2* A, Vec2* B, Vec2* out) { + out->x = lerp(A->x, B->x, t); + out->y = lerp(A->y, B->y, t); +} + +void ssrS_lerpvec3(float t, Vec3* A, Vec3* B, Vec3* out) { + out->x = lerp(A->x, B->x, t); + out->y = lerp(A->y, B->y, t); + out->z = lerp(A->z, B->z, t); +} + +void ssrS_lerpvec4(float t, Vec4* A, Vec4* B, Vec4* out) { + out->x = lerp(A->x, B->x, t); + out->y = lerp(A->y, B->y, t); + out->z = lerp(A->z, B->z, t); + out->w = lerp(A->w, B->w, t); } |