Browse Source

Lesson 24.11

Godzil 3 years ago
parent
commit
5faddfefff
1 changed files with 47 additions and 0 deletions
  1. 47 0
      source/clipping.c

+ 47 - 0
source/clipping.c

@@ -10,6 +10,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <assert.h>
 
 #include <clipping.h>
 
@@ -39,7 +40,53 @@ void initFrustumPlanes(double fov, double aspectRation, double zNear, double zFa
 
 static void clipPolygonAgainstPlane(polygon_t *poly, faceenum_t plane)
 {
+    int i;
+    vec3_t planePoint = frustum[plane].point;
+    vec3_t planeNormal = frustum[plane].normal;
+    vec3_t *currentVertex;
+    vec3_t *previousVertex;
+    double currentDot, previousDot;
 
+    vec3_t newVertices[MAX_NUM_POLYGON_VERTICES];
+    int newVerticesCount = 0;
+
+    previousVertex = &poly->vertices[poly->num_verticices - 1];
+
+    for(i = 0; i < poly->num_verticices; i++)
+    {
+        currentVertex = &poly->vertices[i];
+
+        currentDot = vec3Dot(vec3SubVectors(*currentVertex, planePoint), planeNormal);
+        previousDot = vec3Dot(vec3SubVectors(*previousVertex, planePoint), planeNormal);
+
+        if ((currentDot * previousDot) < 0.0)
+        {
+            double t;
+            /* we crossed the plane */
+            t = previousDot / (previousDot - currentDot);
+            newVertices[newVerticesCount] = vec3SubVectors(*currentVertex, *previousVertex);
+            vec3ScalarMult(newVertices[newVerticesCount], t);
+            newVertices[newVerticesCount] = vec3AddVectors(*currentVertex, newVertices[newVerticesCount]);
+            newVerticesCount++;
+        }
+
+        if (currentDot >= 0.0)
+        {
+            newVertices[newVerticesCount] = *currentVertex;
+            newVerticesCount++;
+        }
+
+        /* Just to be sure, should never trigger  */
+        assert(newVerticesCount < MAX_NUM_POLYGON_VERTICES);
+
+        previousVertex = currentVertex;
+    }
+
+    for(i = 0; i < newVerticesCount; i++)
+    {
+        poly->vertices[i] = newVertices[i];
+    }
+    poly->num_verticices = newVerticesCount;
 }
 
 void clipPolygon(polygon_t *poly)