瀏覽代碼

Implement near/far clipping planes for model3d demos

rexim 2 年之前
父節點
當前提交
faae10447a
共有 1 個文件被更改,包括 7 次插入2 次删除
  1. 7 2
      demos/model3d.c

+ 7 - 2
demos/model3d.c

@@ -40,8 +40,12 @@ static Vector3 make_vector3(float x, float y, float z)
     return v3;
     return v3;
 }
 }
 
 
+#define EPSILON 1e-6
+
 static Vector2 project_3d_2d(Vector3 v3)
 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);
     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)) {
                     if (olivec_barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det)) {
                         int u3 = det - u1 - u2;
                         int u3 = det - u1 - u2;
                         float z = 1/v1.z*u1/det + 1/v2.z*u2/det + 1/v3.z*u3/det;
                         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;
                             zbuffer[y*WIDTH + x] = z;
                             OLIVEC_PIXEL(oc, x, y) = mix_colors3(0xFF1818FF, 0xFF18FF18, 0xFFFF1818, u1, u2, det);
                             OLIVEC_PIXEL(oc, x, y) = mix_colors3(0xFF1818FF, 0xFF18FF18, 0xFFFF1818, u1, u2, det);