|
@@ -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)
|