Browse Source

Lesson 12.10

Godzil 3 years ago
parent
commit
713a683963
3 changed files with 32 additions and 12 deletions
  1. 1 0
      source/include/triangle.h
  2. 31 11
      source/main.c
  3. 0 1
      source/mesh.c

+ 1 - 0
source/include/triangle.h

@@ -10,6 +10,7 @@
 #ifndef THREEDENGINE_SOURCE_INCLUDE_TRIANGLE_H
 #define THREEDENGINE_SOURCE_INCLUDE_TRIANGLE_H
 
+#include <stdint.h>
 #include <vector.h>
 
 /***********************************************************************************************************************

+ 31 - 11
source/main.c

@@ -27,7 +27,7 @@ vec3_t cameraPosition =
 {
     .x = 0,
     .y = 0,
-    .z = -5,
+    .z = 0,
 };
 
 triangle_t *projectedTriangles = NULL;
@@ -52,7 +52,7 @@ void setup()
     }
 
     //loadCubeMeshData();
-    loadOBJFile("assets/f22.obj");
+    loadOBJFile("assets/cube.obj");
 
 exit:
     return;
@@ -113,8 +113,8 @@ void update()
     previousFrameTime = SDL_GetTicks();
 
     mesh.rotation.x += 0.01;
-    //mesh.rotation.y += 0.01;
-    //mesh.rotation.z += 0.01;
+    mesh.rotation.y += 0.01;
+    mesh.rotation.z += 0.02;
 
     arrayEmpty(projectedTriangles);
 
@@ -123,6 +123,8 @@ void update()
     for(i = 0; i < faceCount; i++)
     {
         triangle_t currentTriangle;
+        vec3_t transformed[3];
+
         vec3_t vertices[3] =
         {
             mesh.vertices[mesh.faces[i].a - 1],
@@ -132,23 +134,41 @@ void update()
 
         for(j = 0; j < 3; j++)
         {
-            vec3_t transformed = vertices[j];
+            transformed[j] = vertices[j];
+
+            transformed[j] = vec3RotateX(transformed[j], mesh.rotation.x);
+            transformed[j] = vec3RotateY(transformed[j], mesh.rotation.y);
+            transformed[j] = vec3RotateZ(transformed[j], mesh.rotation.z);
+
+            transformed[j].z += 5;
+        }
+
+        vec3_t vectorBA = vec3SubVectors(transformed[1], transformed[0]);
+        vec3_t vectorCA = vec3SubVectors(transformed[2], transformed[0]);
 
-            transformed = vec3RotateX(transformed, mesh.rotation.x);
-            transformed = vec3RotateY(transformed, mesh.rotation.y);
-            transformed = vec3RotateZ(transformed, mesh.rotation.z);
+        vec3_t triangleNormal = vec3Cross(vectorBA, vectorCA);
+        vec3_t cameraRay = vec3SubVectors(cameraPosition, transformed[0]);
 
-            transformed.z -= cameraPosition.z;
+        double cameraDotTriangle = vec3Dot(triangleNormal, cameraRay);
 
-            vec2_t projected = perspectivePointProjection(transformed);
 
-            projected.x += (windowWidth  / 2);
+        if (cameraDotTriangle < 0)
+        {
+            continue;
+        }
+
+        for (j = 0 ; j < 3 ; j++)
+        {
+            vec2_t projected = perspectivePointProjection(transformed[j]);
+
+            projected.x += (windowWidth / 2);
             projected.y += (windowHeight / 2);
 
             currentTriangle.points[j] = projected;
         }
 
         arrayAdd(projectedTriangles, currentTriangle);
+
     }
 }
 

+ 0 - 1
source/mesh.c

@@ -61,7 +61,6 @@ mesh_t mesh =
     .rotation = { 0, 0, 0 },
 };
 
-
 void loadCubeMeshData()
 {
     int i;