diff options
author | chai <chaifix@163.com> | 2020-02-26 22:52:19 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-02-26 22:52:19 +0800 |
commit | 372d77e436d21312ef1a0df622964751716963a3 (patch) | |
tree | 1a71865fea6fb9f2f532422c4b83959fff17ea76 /src/core | |
parent | 27687536844ed3b045bba1abd1aae8bb3692f6cb (diff) |
*misc
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/clip.c | 2 | ||||
-rw-r--r-- | src/core/device.c | 6 | ||||
-rw-r--r-- | src/core/limits.h | 2 | ||||
-rw-r--r-- | src/core/rasterizer.c | 20 | ||||
-rw-r--r-- | src/core/shader.c | 15 | ||||
-rw-r--r-- | src/core/shader.h | 10 |
6 files changed, 32 insertions, 23 deletions
diff --git a/src/core/clip.c b/src/core/clip.c index 48c376d..eb42fb7 100644 --- a/src/core/clip.c +++ b/src/core/clip.c @@ -190,7 +190,7 @@ static bool clip_against_plane( , byte* dst_data[] , uint prim_vcount/*minimum number of primitive vertices*/ ) { - bool varying = varying_flag & VARYING_ANY; + bool varying = (varying_flag & VARYING_ANY) != 0; int idx = 0; ClippedVert *prev, *curr; uint previ, curri; diff --git a/src/core/device.c b/src/core/device.c index 70ae11f..6b2bb7c 100644 --- a/src/core/device.c +++ b/src/core/device.c @@ -22,7 +22,7 @@ typedef struct { } VertexAttr; static struct { - Mat4 matrices[3][MATRIXDEPTH]; + Mat4 matrices[3][MATRIX_DEPTH]; uint matrix_top[3]; ssr_MatrixMode matrix_mode; @@ -155,13 +155,13 @@ void ssr_loadidentity() { } void ssr_pushmatrix() { - ssr_assert(MATRIXTOP < MATRIXDEPTH - 1); + ssr_assert(MATRIXTOP < MATRIX_DEPTH - 1); ++MATRIXTOP; MATRIX = MATRIXSTACK[MATRIXTOP - 1]; } void ssr_popmatrix() { - MATRIXTOP = clamp(--MATRIXTOP, 0, MATRIXDEPTH - 1); + MATRIXTOP = clamp(--MATRIXTOP, 0, MATRIX_DEPTH - 1); } /*http://warmcat.org/chai/blog/?p=559*/ diff --git a/src/core/limits.h b/src/core/limits.h index 4ef0b75..229f535 100644 --- a/src/core/limits.h +++ b/src/core/limits.h @@ -1,6 +1,6 @@ #ifndef _SOFTSHADEROOM_LIMITS_H_ #define _SOFTSHADEROOM_LIMITS_H_ -#define MATRIXDEPTH 32 +#define MATRIX_DEPTH 32 #endif
\ No newline at end of file diff --git a/src/core/rasterizer.c b/src/core/rasterizer.c index d6a9fc1..d926cb0 100644 --- a/src/core/rasterizer.c +++ b/src/core/rasterizer.c @@ -237,15 +237,15 @@ void ssrR_line( ) { ssr_assert(CA && CB && program && uniforms); - Vec3 SA, SB; - vec4_dividew(CA, &SA); ssrU_viewport(&SA, &SA); - vec4_dividew(CB, &SB); ssrU_viewport(&SB, &SB); + Vec4 SA, SB; + vec4_dividewnoz(CA, &SA); ssrU_viewport(&SA, &SA); + vec4_dividewnoz(CB, &SB); ssrU_viewport(&SB, &SB); FragmentShader frag_shader = program->fragmentshader; int x0 = SA.x, y0 = SA.y; int x1 = SB.x, y1 = SB.y; - float wA = 1 / CA->w, wB = 1 / CB->w; + float wA = SA.w, wB = SB.w; float zA = SA.z, zB = SB.z; bool steep = FALSE; @@ -262,6 +262,8 @@ void ssrR_line( swapf(zA, zB); } + float inv_wA = 1 / wA, inv_wB = 1 / wB; + bool depth_test = ssr_isenable(ENABLE_DEPTHTEST); bool blend = ssr_isenable(ENABLE_BLEND); bool write_depth = ssr_isenable(ENABLE_WRITEDEPTH); @@ -274,15 +276,15 @@ void ssrR_line( #define discardif(condition) if(condition) continue - float t, depth; + float t, z, w, depth; Vec2 c; int x, y, px, py; for (x = x0; x <= x1; ++x) { t = (x - x0) / (float)(x1 - x0); y = y0 + (y1 - y0)*t; /*caculate center*/ - c.x = (1 - t) * wA; - c.y = t * wB; + c.x = (1 - t) * inv_wA; + c.y = t * inv_wB; discardif(compare(c.x+c.y, 0)); c.x /= (c.x + c.y); t = 1 - c.x; @@ -295,7 +297,9 @@ void ssrR_line( py = y; } if (depth_test) { - ssrS_lerpnum(t, &zA, &zB, &depth); + ssrS_lerpnum(t, &zA, &zB, &z); + ssrS_lerpnum(t, &wA, &wB, &w); + depth = z / w; pass_depth_test = ssr_testdepth(px, py, depth); } if (stencil_test) { diff --git a/src/core/shader.c b/src/core/shader.c index 899a160..b523df7 100644 --- a/src/core/shader.c +++ b/src/core/shader.c @@ -267,35 +267,40 @@ Vec4* ssrS_bcpvec4(Vec3* bc, Vec4* A, Vec4* B, Vec4* C, Vec4* out) { return out; } -void ssrS_lerpnum(float t, float* A, float* B, float* out) { +float* ssrS_lerpnum(float t, float* A, float* B, float* out) { *out = lerp(*A, *B, t); + return out; } -void ssrS_lerpcolor(float t, Color A, Color B, Color* out) { +Color* 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) ); + return out; } -void ssrS_lerpvec2(float t, Vec2* A, Vec2* B, Vec2* out) { +Vec2* 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); + return out; } -void ssrS_lerpvec3(float t, Vec3* A, Vec3* B, Vec3* out) { +Vec3* 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); + return out; } -void ssrS_lerpvec4(float t, Vec4* A, Vec4* B, Vec4* out) { +Vec4* 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); + return out; } static Color32 _out_color[RENDER_TARGET_COUNT]; diff --git a/src/core/shader.h b/src/core/shader.h index 26606b8..70b4ce9 100644 --- a/src/core/shader.h +++ b/src/core/shader.h @@ -113,11 +113,11 @@ 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_lerpcolor(float t, Color A, Color B, Color* out); -void ssrS_lerpnum(float t, float* A, float* B, float* 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); +Color* ssrS_lerpcolor(float t, Color A, Color B, Color* out); +float* ssrS_lerpnum(float t, float* A, float* B, float* out); +Vec2* ssrS_lerpvec2(float t, Vec2* A, Vec2* B, Vec2* out); +Vec3* ssrS_lerpvec3(float t, Vec3* A, Vec3* B, Vec3* out); +Vec4* ssrS_lerpvec4(float t, Vec4* A, Vec4* B, Vec4* out); typedef enum { REGTYPE_NUM = 1, |