|
@@ -50,50 +50,71 @@ void createTriangleFromPolygon(polygon_t *polygon, triangle_t *triangleList, uin
|
|
|
triangleList[i - 1].points[1] = vec4FromVec3(polygon->vertices[i]);
|
|
|
triangleList[i - 1].points[2] = vec4FromVec3(polygon->vertices[i + 1]);
|
|
|
|
|
|
+ triangleList[i - 1].textureCoordinates[0] = polygon->textureCoords[0];
|
|
|
+ triangleList[i - 1].textureCoordinates[1] = polygon->textureCoords[i];
|
|
|
+ triangleList[i - 1].textureCoordinates[2] = polygon->textureCoords[i + 1];
|
|
|
+
|
|
|
(*outNumber)++;
|
|
|
assert(*outNumber < MAX_NUM_POLYGON_TRIANGLES);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/* Linear interpolation */
|
|
|
+static inline double floatLerp(double a, double b, double t)
|
|
|
+{
|
|
|
+ return a + t * (b - a);
|
|
|
+}
|
|
|
+
|
|
|
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;
|
|
|
+ vec3_t *currentVertex, *previousVertex;
|
|
|
+ tex2_t *currentTexCoord, *previousTexCoord;
|
|
|
double currentDot, previousDot;
|
|
|
|
|
|
vec3_t newVertices[MAX_NUM_POLYGON_VERTICES];
|
|
|
+ tex2_t newTexCoords[MAX_NUM_POLYGON_VERTICES];
|
|
|
int newVerticesCount = 0;
|
|
|
|
|
|
previousVertex = &poly->vertices[poly->num_vertices - 1];
|
|
|
+ previousTexCoord = &poly->textureCoords[poly->num_vertices - 1];
|
|
|
|
|
|
for(i = 0; i < poly->num_vertices; i++)
|
|
|
{
|
|
|
currentVertex = &poly->vertices[i];
|
|
|
+ currentTexCoord = &poly->textureCoords[i];
|
|
|
|
|
|
currentDot = vec3Dot(vec3SubVectors(*currentVertex, planePoint), planeNormal);
|
|
|
previousDot = vec3Dot(vec3SubVectors(*previousVertex, planePoint), planeNormal);
|
|
|
|
|
|
if ((currentDot * previousDot) < 0.0)
|
|
|
{
|
|
|
- double t;
|
|
|
+ double t = previousDot / (previousDot - currentDot);
|
|
|
/* we crossed the plane */
|
|
|
- vec3_t intersectionVertice;
|
|
|
- t = previousDot / (previousDot - currentDot);
|
|
|
- intersectionVertice = *currentVertex;
|
|
|
- intersectionVertice = vec3SubVectors(intersectionVertice, *previousVertex);
|
|
|
- intersectionVertice = vec3ScalarMult(intersectionVertice, t);
|
|
|
- intersectionVertice = vec3AddVectors(intersectionVertice, *previousVertex);
|
|
|
-
|
|
|
- newVertices[newVerticesCount] = intersectionVertice;
|
|
|
+ vec3_t intersectionVertex =
|
|
|
+ {
|
|
|
+ .x = floatLerp(previousVertex->x, currentVertex->x, t),
|
|
|
+ .y = floatLerp(previousVertex->y, currentVertex->y, t),
|
|
|
+ .z = floatLerp(previousVertex->z, currentVertex->z, t),
|
|
|
+ };
|
|
|
+ newVertices[newVerticesCount] = intersectionVertex;
|
|
|
+
|
|
|
+ tex2_t intersectionTexCoord =
|
|
|
+ {
|
|
|
+ .u = floatLerp(previousTexCoord->u, currentTexCoord->u, t),
|
|
|
+ .v = floatLerp(previousTexCoord->v, currentTexCoord->v, t),
|
|
|
+ };
|
|
|
+ newTexCoords[newVerticesCount] = intersectionTexCoord;
|
|
|
+
|
|
|
newVerticesCount++;
|
|
|
}
|
|
|
|
|
|
if (currentDot > 0.0)
|
|
|
{
|
|
|
newVertices[newVerticesCount] = *currentVertex;
|
|
|
+ newTexCoords[newVerticesCount] = *currentTexCoord;
|
|
|
newVerticesCount++;
|
|
|
}
|
|
|
|
|
@@ -101,11 +122,13 @@ static void clipPolygonAgainstPlane(polygon_t *poly, faceenum_t plane)
|
|
|
assert(newVerticesCount < MAX_NUM_POLYGON_VERTICES);
|
|
|
|
|
|
previousVertex = currentVertex;
|
|
|
+ previousTexCoord = currentTexCoord;
|
|
|
}
|
|
|
|
|
|
for(i = 0; i < newVerticesCount; i++)
|
|
|
{
|
|
|
poly->vertices[i] = newVertices[i];
|
|
|
+ poly->textureCoords[i] = newTexCoords[i];
|
|
|
}
|
|
|
poly->num_vertices = newVerticesCount;
|
|
|
}
|