|
@@ -40,8 +40,12 @@ static Vector3 make_vector3(float x, float y, float z)
|
|
|
return v3;
|
|
|
}
|
|
|
|
|
|
+#define EPSILON 1e-6
|
|
|
+
|
|
|
static Vector2 project_3d_2d(Vector3 v3)
|
|
|
{
|
|
|
+ if (v3.z < 0) v3.z = -v3.z;
|
|
|
+ if (v3.z < EPSILON) v3.z += EPSILON;
|
|
|
return make_vector2(v3.x/v3.z, v3.y/v3.z);
|
|
|
}
|
|
|
|
|
@@ -91,8 +95,9 @@ Olivec_Canvas vc_render(float dt)
|
|
|
if (olivec_barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det)) {
|
|
|
int u3 = det - u1 - u2;
|
|
|
float z = 1/v1.z*u1/det + 1/v2.z*u2/det + 1/v3.z*u3/det;
|
|
|
- // TODO: implement near/far clipping planes
|
|
|
- if (z > zbuffer[y*WIDTH + x]) {
|
|
|
+ float near = 0.1f;
|
|
|
+ float far = 5.0f;
|
|
|
+ if (1.0f/far < z && z < 1.0f/near && z > zbuffer[y*WIDTH + x]) {
|
|
|
zbuffer[y*WIDTH + x] = z;
|
|
|
OLIVEC_PIXEL(oc, x, y) = mix_colors3(0xFF1818FF, 0xFF18FF18, 0xFFFF1818, u1, u2, det);
|
|
|
|