|
@@ -24,6 +24,16 @@
|
|
|
bool isRunning = true;
|
|
|
int previousFrameTime = 0;
|
|
|
|
|
|
+typedef enum displayMode_t
|
|
|
+{
|
|
|
+ DISPLAY_MODE_WIREFRAME,
|
|
|
+ DISPLAY_MODE_SOLID,
|
|
|
+ DISPLAY_MODE_BOTH,
|
|
|
+} displayMode_t;
|
|
|
+bool displayVertex = false;
|
|
|
+bool doNotCull = false;
|
|
|
+enum displayMode_t currentDisplayMode = DISPLAY_MODE_SOLID;
|
|
|
+
|
|
|
vec3_t cameraPosition =
|
|
|
{
|
|
|
.x = 0,
|
|
@@ -52,8 +62,7 @@ void setup()
|
|
|
goto exit;
|
|
|
}
|
|
|
|
|
|
- //loadCubeMeshData();
|
|
|
- loadOBJFile("assets/cube.obj");
|
|
|
+ loadOBJFile("assets/f22.obj");
|
|
|
|
|
|
exit:
|
|
|
return;
|
|
@@ -70,9 +79,39 @@ void processInput()
|
|
|
break;
|
|
|
|
|
|
case SDL_KEYDOWN:
|
|
|
- if (event.key.keysym.sym == SDLK_ESCAPE)
|
|
|
+ switch(event.key.keysym.sym)
|
|
|
{
|
|
|
+ case SDLK_ESCAPE:
|
|
|
isRunning = false;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_1:
|
|
|
+ displayVertex = true;
|
|
|
+ currentDisplayMode = DISPLAY_MODE_WIREFRAME;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_2:
|
|
|
+ displayVertex = false;
|
|
|
+ currentDisplayMode = DISPLAY_MODE_WIREFRAME;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_3:
|
|
|
+ displayVertex = false;
|
|
|
+ currentDisplayMode = DISPLAY_MODE_SOLID;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_4:
|
|
|
+ displayVertex = false;
|
|
|
+ currentDisplayMode = DISPLAY_MODE_BOTH;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_c:
|
|
|
+ doNotCull = false;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SDLK_d:
|
|
|
+ doNotCull = true;
|
|
|
+ break;
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -146,22 +185,25 @@ void update()
|
|
|
transformed[j].z += 5;
|
|
|
}
|
|
|
|
|
|
- vec3_t vectorBA = vec3SubVectors(transformed[1], transformed[0]);
|
|
|
- vec3_t vectorCA = vec3SubVectors(transformed[2], transformed[0]);
|
|
|
- vec3Normalize(&vectorBA);
|
|
|
- vec3Normalize(&vectorCA);
|
|
|
- vec3_t triangleNormal = vec3Cross(vectorBA, vectorCA);
|
|
|
- vec3Normalize(&triangleNormal);
|
|
|
+ if (!doNotCull)
|
|
|
+ {
|
|
|
+ vec3_t vectorBA = vec3SubVectors(transformed[1], transformed[0]);
|
|
|
+ vec3_t vectorCA = vec3SubVectors(transformed[2], transformed[0]);
|
|
|
+ vec3Normalize(&vectorBA);
|
|
|
+ vec3Normalize(&vectorCA);
|
|
|
+ vec3_t triangleNormal = vec3Cross(vectorBA, vectorCA);
|
|
|
+ vec3Normalize(&triangleNormal);
|
|
|
|
|
|
- vec3_t cameraRay = vec3SubVectors(cameraPosition, transformed[0]);
|
|
|
- vec3Normalize(&cameraRay);
|
|
|
+ vec3_t cameraRay = vec3SubVectors(cameraPosition, transformed[0]);
|
|
|
+ vec3Normalize(&cameraRay);
|
|
|
|
|
|
- double cameraDotTriangle = vec3Dot(triangleNormal, cameraRay);
|
|
|
+ double cameraDotTriangle = vec3Dot(triangleNormal, cameraRay);
|
|
|
|
|
|
|
|
|
- if (cameraDotTriangle < 0)
|
|
|
- {
|
|
|
- continue;
|
|
|
+ if (cameraDotTriangle < 0)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
for (j = 0 ; j < 3 ; j++)
|
|
@@ -190,14 +232,46 @@ void render()
|
|
|
|
|
|
for(i = 0; i < triangleCount; i++)
|
|
|
{
|
|
|
- drawFilledTriangle(projectedTriangles[i].points[0].x, projectedTriangles[i].points[0].y,
|
|
|
- projectedTriangles[i].points[1].x, projectedTriangles[i].points[1].y,
|
|
|
- projectedTriangles[i].points[2].x, projectedTriangles[i].points[2].y,
|
|
|
- 0xFFFFFFFF);
|
|
|
- drawTriangle(projectedTriangles[i].points[0].x, projectedTriangles[i].points[0].y,
|
|
|
- projectedTriangles[i].points[1].x, projectedTriangles[i].points[1].y,
|
|
|
- projectedTriangles[i].points[2].x, projectedTriangles[i].points[2].y,
|
|
|
- 0xFF000000);
|
|
|
+ switch(currentDisplayMode)
|
|
|
+ {
|
|
|
+ case DISPLAY_MODE_SOLID:
|
|
|
+ drawFilledTriangle(projectedTriangles[i].points[0].x, projectedTriangles[i].points[0].y,
|
|
|
+ projectedTriangles[i].points[1].x, projectedTriangles[i].points[1].y,
|
|
|
+ projectedTriangles[i].points[2].x, projectedTriangles[i].points[2].y,
|
|
|
+ 0xFFFFFFFF);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case DISPLAY_MODE_WIREFRAME:
|
|
|
+ drawTriangle(projectedTriangles[i].points[0].x, projectedTriangles[i].points[0].y,
|
|
|
+ projectedTriangles[i].points[1].x, projectedTriangles[i].points[1].y,
|
|
|
+ projectedTriangles[i].points[2].x, projectedTriangles[i].points[2].y,
|
|
|
+ 0xFFFFFFFF);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case DISPLAY_MODE_BOTH:
|
|
|
+ drawFilledTriangle(projectedTriangles[i].points[0].x, projectedTriangles[i].points[0].y,
|
|
|
+ projectedTriangles[i].points[1].x, projectedTriangles[i].points[1].y,
|
|
|
+ projectedTriangles[i].points[2].x, projectedTriangles[i].points[2].y,
|
|
|
+ 0xFFFFFFFF);
|
|
|
+ drawTriangle(projectedTriangles[i].points[0].x, projectedTriangles[i].points[0].y,
|
|
|
+ projectedTriangles[i].points[1].x, projectedTriangles[i].points[1].y,
|
|
|
+ projectedTriangles[i].points[2].x, projectedTriangles[i].points[2].y,
|
|
|
+ 0xFF000000);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (displayVertex)
|
|
|
+ {
|
|
|
+ int j;
|
|
|
+ for(j = 0; j < 3; j++)
|
|
|
+ {
|
|
|
+ drawRectangle(projectedTriangles[i].points[j].x - 1,
|
|
|
+ projectedTriangles[i].points[j].y - 1,
|
|
|
+ 3, 3,
|
|
|
+ 0xFFFF0000);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
#else
|
|
|
drawTriangle(300, 100, 50, 400, 500, 700, 0xFF00FF00);
|