diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/clip.c | 15 | ||||
-rw-r--r-- | src/core/device.c | 19 | ||||
-rw-r--r-- | src/core/device.h | 2 | ||||
-rw-r--r-- | src/core/mem.h | 2 | ||||
-rw-r--r-- | src/core/rasterizer.c | 11 | ||||
-rw-r--r-- | src/core/shader.h | 80 | ||||
-rw-r--r-- | src/core/texture.h | 17 |
7 files changed, 90 insertions, 56 deletions
diff --git a/src/core/clip.c b/src/core/clip.c index 071b14b..382c766 100644 --- a/src/core/clip.c +++ b/src/core/clip.c @@ -1,8 +1,6 @@ #include "clip.h" #include "shader.h" -/*from mesa3d*/ - typedef enum { POSITIVE_W, POSITIVE_X, @@ -131,12 +129,11 @@ static bool clip_against_plane(Plane plane, uint varying_flag, ClippedBuffer* sr } #define CLIP(plane, from, to) \ -do { \ -is_cull = clip_against_plane(plane, varying_flag, from, to); \ -if (is_cull) { \ - buffer->count = 0;/*cull this triangle*/ \ - return 1; \ -} \ +do { \ + if (clip_against_plane(plane, varying_flag, from, to)) { \ + buffer->count = 0;/*cull this triangle*/ \ + return 1; \ + } \ }while(0) bool clip_triangle(Vec4* c0, Vec4* c1, Vec4* c2, Vert* v0, Vert* v1, Vert* v2, uint varying_flag, ClippedBuffer* buffer) { @@ -189,8 +186,6 @@ bool clip_triangle(Vec4* c0, Vec4* c1, Vec4* c2, Vert* v0, Vert* v1, Vert* v2, u INIT_CLIP_VERT(2); #undef INIT_CLIP_VERT - bool is_cull = FALSE; - CLIP(POSITIVE_W, &temp, buffer); CLIP(POSITIVE_X, buffer, &temp); CLIP(NEGATIVE_X, &temp, buffer); diff --git a/src/core/device.c b/src/core/device.c index b9c024c..9e4a6eb 100644 --- a/src/core/device.c +++ b/src/core/device.c @@ -75,6 +75,10 @@ void ssr_init(ssr_Config* conf) { memset(state.zbuffer, 0xff, sizeof(uint)*config.width*config.height); } +float ssr_getaspect() { + return (float)config.width / config.height; +} + int ssr_getframebufferw() { return config.width; } @@ -204,8 +208,11 @@ void ssr_clearcolor(Color color) { memset(state.framebuffer, 0, state.buffersize); } else { - for (int i = 0; i < config.width*config.height; ++i) - state.framebuffer[i] = color; + uint size = config.width * sizeof(Color); + for(int x = 0; x < config.width; ++x) + state.framebuffer[x] = color; + for (int y = 1; y < config.height; ++y) + ssrM_copy(&state.framebuffer[config.width * y], state.framebuffer, size); } } @@ -242,10 +249,10 @@ bool ssr_testdepthf(uint x, uint y, float depth) { void ssrU_viewport(Vec2* p, Vec2* out) { ssr_assert(p && out); float halfw = config.width / 2.f, halfh = config.height / 2.f; - out->x = (int)(p->x * halfw + halfw); - out->y = (int)(halfh - p->y * halfh); - //out->x = (int)((p->x + 1) * (halfw - 0.5f)); - //out->y = (int)((1 - p->y) * (halfh - 0.5f)); + //out->x = (int)round(p->x * halfw + halfw); + //out->y = (int)round(halfh - p->y * halfh); + out->x = (int)round((p->x + 1) * (halfw - 0.5f)); + out->y = (int)round((1 - p->y) * (halfh - 0.5f)); } void ssr_bindvertices(Vert* verts, int nverts, uint* indices, int nprims) { diff --git a/src/core/device.h b/src/core/device.h index 10db509..5cf9c4a 100644 --- a/src/core/device.h +++ b/src/core/device.h @@ -34,6 +34,8 @@ typedef enum ssr_EnableMask { void ssr_init(ssr_Config* config); +float ssr_getaspect(); + int ssr_getframebufferw(); int ssr_getframebufferh(); diff --git a/src/core/mem.h b/src/core/mem.h index e6cc714..dd6beca 100644 --- a/src/core/mem.h +++ b/src/core/mem.h @@ -6,6 +6,8 @@ void ssrM_freemem(); void ssrM_realloc(); +#define ssrM_copy memcpy + #define ssrM_zero(obj, size) memset(obj, 0, size) #define ssrM_new(T) (T*)malloc(sizeof(T)) #define ssrM_newvector(T, c) ((T*)calloc(c, sizeof(T))) diff --git a/src/core/rasterizer.c b/src/core/rasterizer.c index d39e246..bf210b7 100644 --- a/src/core/rasterizer.c +++ b/src/core/rasterizer.c @@ -210,7 +210,7 @@ void ssrR_triangle( s[1].x = sc->y - sa->y; s[1].y = sb->y - sa->y; #define RENDER_TRIANGLE \ - for (p.y = FROM->y; p.y < TO->y; ++p.y) { \ + for (p.y = FROM->y; p.y < TO->y + OFFSET; ++p.y) { \ SET_FROM_AND_TO \ s[1].z = sa->y - p.y; \ for (p.x = from; order * (p.x - to) <= 0; p.x += order) { \ @@ -226,8 +226,10 @@ void ssrR_triangle( bcp.x *= CAw; bcp.y *= CBw; bcp.z *= CCw; \ vec3_scale(&bcp, 1.f / (bcp.x + bcp.y + bcp.z), &bcp); \ /*depth test*/ \ - depth = (bcp.x*sa->z+bcp.y*sb->z+bcp.z*sc->z) * 0.5f + 0.5f; \ - discardif(!ssr_testdepthf(p.x, p.y, depth)); \ + if(ssr_isenable(ENABLEMASK_DEPTHTEST)){ \ + depth = (bcp.x*sa->z+bcp.y*sb->z+bcp.z*sc->z) * 0.5f + 0.5f;\ + discardif(!ssr_testdepthf(p.x, p.y, depth)); \ + } \ /*set varying variables*/ \ DO_INTERPOLATION \ if(program->fragmentshader(uniforms, &ssr_frag_in, &color)) \ @@ -239,6 +241,7 @@ void ssrR_triangle( #define TO sb #define FROMK invkAC #define TOK invkAB +#define OFFSET 0 #define SET_FROM_AND_TO \ from = (int)(invkAC * (p.y - sa->y) + sa->x); \ to = (int)(invkAB * (p.y - sa->y) + sa->x); \ @@ -249,6 +252,7 @@ void ssrR_triangle( #define TO sc #define FROMK invkAC #define TOK invkBC +#define OFFSET 1 #define SET_FROM_AND_TO \ if (p.y == sb->y && sb->y == sc->y) { \ from = sc->x; \ @@ -265,6 +269,7 @@ void ssrR_triangle( #undef TO #undef FROMK #undef TOK +#undef OFFSET #undef SET_FROM_AND_TO #undef RENDER_TRIANGLE } diff --git a/src/core/shader.h b/src/core/shader.h index 224ebb4..f663a47 100644 --- a/src/core/shader.h +++ b/src/core/shader.h @@ -3,6 +3,7 @@ #include "../math/math.h" #include "vert.h" +#include "texture.h" typedef struct UniformCollection { /*built in varaibles*/ @@ -12,6 +13,7 @@ typedef struct UniformCollection { Mat4* mvp; Mat4* mv; /*extra variables*/ + Texture* var_tex[12]; Mat4 var_mat4[8]; Vec4 var_vec4[8]; Vec3 var_vec3[8]; @@ -21,6 +23,7 @@ typedef struct UniformCollection { void* userdata; } UniformCollection; +#define TEX(i) (&uniforms->var_tex[i]) #define UM4(i) (&uniforms->var_mat4[i]) #define UV2(i) (&uniforms->var_vec2[i]) #define UV3(i) (&uniforms->var_vec3[i]) @@ -59,56 +62,55 @@ typedef struct 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_POSITION (1U << 31) +#define VARYING_NORMAL (1U << 30) +#define VARYING_TANGENT (1U << 29) +#define VARYING_TEXCOORD (1U << 28) +#define VARYING_COLOR (1U << 27) +#define VARYING_JOINT (1U << 26) +#define VARYING_WEIGHT (1U << 25) -#define VARYING_UNUSED (1 << 24) +#define VARYING_UNUSED (1U << 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_00 (1U << 20) +#define VARYING_NUM_01 (1U << 21) +#define VARYING_NUM_02 (1U << 22) +#define VARYING_NUM_03 (1U << 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_00 (1U) +#define VARYING_V2_01 (1U << 1) +#define VARYING_V2_02 (1U << 2) +#define VARYING_V2_03 (1U << 3) +#define VARYING_V2_04 (1U << 4) +#define VARYING_V2_05 (1U << 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_00 (1U << 6) +#define VARYING_V3_01 (1U << 7) +#define VARYING_V3_02 (1U << 8) +#define VARYING_V3_03 (1U << 9) +#define VARYING_V3_04 (1U << 10) +#define VARYING_V3_05 (1U << 11) +#define VARYING_V3_06 (1U << 12) +#define VARYING_V3_07 (1U << 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_00 (1U << 14) +#define VARYING_V4_01 (1U << 15) +#define VARYING_V4_02 (1U << 16) +#define VARYING_V4_03 (1U << 17) +#define VARYING_V4_04 (1U << 18) +#define VARYING_V4_05 (1U << 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_NUM | VARYING_V2 | VARYING_V3 | VARYING_V4) - 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); @@ -193,4 +195,10 @@ void ssrS_setupregisterpoints(uint extra_varying_flag, int idx); /*设置寄存器指针,指向fragIn结构*/ void ssrS_setregtofragin(uint extra_varying_flag, FragmentShaderIn* frag_in); + +/* +** texture +*/ +Color32 texture2d(float x, float y); + #endif
\ No newline at end of file diff --git a/src/core/texture.h b/src/core/texture.h index d6aee82..20a0228 100644 --- a/src/core/texture.h +++ b/src/core/texture.h @@ -4,8 +4,23 @@ #include "vert.h" typedef struct Texture{ - uint id;/*identifier*/ uint width, height; + Color* pixels; }Texture; +void texture_loadfromfile(const char* path, Texture* out); + +typedef enum FilterMode { + FILTERMODE_POINT, + FILTERMODE_BILINEAR, + FILTERMODE_TRILINEAR, +} FilterMode; + +typedef enum WrapMode{ + WRAPMODE_REPEAT, + WRAPMODE_CLAMP, +} WrapMode; + +Color32 texture_sampling(Texture* tex, FilterMode filter_mode, WrapMode wrap_mode, float x, float y); + #endif
\ No newline at end of file |