Browse Source

Lesson 13.11

Godzil 3 years ago
parent
commit
5926cd8995
1 changed files with 97 additions and 23 deletions
  1. 97 23
      source/main.c

+ 97 - 23
source/main.c

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