summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/clip.c2
-rw-r--r--src/core/device.c6
-rw-r--r--src/core/limits.h2
-rw-r--r--src/core/rasterizer.c20
-rw-r--r--src/core/shader.c15
-rw-r--r--src/core/shader.h10
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,