Browse Source

Lesson 16.4

Godzil 3 years ago
parent
commit
aed8dbecd4
5 changed files with 37 additions and 10 deletions
  1. 2 0
      source/include/mesh.h
  2. 6 0
      source/include/vector.h
  3. 14 10
      source/main.c
  4. 2 0
      source/mesh.c
  5. 13 0
      source/vector.c

+ 2 - 0
source/include/mesh.h

@@ -24,6 +24,8 @@ typedef struct mesh_t
     face_t *faces;           /**< List of faces */
 
     vec3_t rotation;         /**< Rotation of the object */
+    vec3_t scale;            /**< Scaling of the object */
+    vec3_t translation;      /**< Translation of the object */
 } mesh_t;
 
 

+ 6 - 0
source/include/vector.h

@@ -51,8 +51,14 @@ vec3_t vec3Cross(vec3_t a, vec3_t b);
 double vec3Dot(vec3_t a, vec3_t b);
 void vec3Normalize(vec3_t *a);
 
+vec3_t vec3FromVec4(vec4_t v);
+
 vec3_t vec3RotateX(vec3_t original, double angle);
 vec3_t vec3RotateY(vec3_t original, double angle);
 vec3_t vec3RotateZ(vec3_t original, double angle);
 
+/* ---------------------------------------------- 4D Vectors operations --------------------------------------------- */
+vec4_t vec4FromVec3(vec3_t v);
+
+
 #endif /* THREEDENGINE_SOURCE_VECTOR_H */

+ 14 - 10
source/main.c

@@ -16,6 +16,7 @@
 #include <log.h>
 
 #include <array.h>
+#include <matrix.h>
 #include <triangle.h>
 #include <display.h>
 #include <vector.h>
@@ -149,6 +150,7 @@ void update()
     uint32_t i, j;
     uint32_t faceCount;
     uint32_t timeToWait = FRAME_TARGET_TIME - (SDL_GetTicks() - previousFrameTime);
+    matrix4_t scaleMatrix;
     if (timeToWait <= FRAME_TARGET_TIME)
     {
         SDL_Delay(timeToWait);
@@ -159,14 +161,18 @@ void update()
     mesh.rotation.y += 0.01;
     mesh.rotation.z += 0.02;
 
+    mesh.scale.x += 0.002;
+    mesh.scale.x += 0.001;
+
+    scaleMatrix = mat4Scale(mesh.scale.x, mesh.scale.y, mesh.scale.z);
+
     arrayEmpty(projectedTriangles);
 
     faceCount = arrayGetSize(mesh.faces);
-
     for(i = 0; i < faceCount; i++)
     {
         triangle_t currentTriangle;
-        vec3_t transformedVertices[3];
+        vec4_t transformedVertices[3];
 
         vec3_t vertices[3] =
         {
@@ -177,25 +183,23 @@ void update()
 
         for(j = 0; j < 3; j++)
         {
-            transformedVertices[j] = vertices[j];
+            transformedVertices[j] = vec4FromVec3(vertices[j]);
 
-            transformedVertices[j] = vec3RotateX(transformedVertices[j], mesh.rotation.x);
-            transformedVertices[j] = vec3RotateY(transformedVertices[j], mesh.rotation.y);
-            transformedVertices[j] = vec3RotateZ(transformedVertices[j], mesh.rotation.z);
+            transformedVertices[j] = mat4ProdVec4(scaleMatrix, transformedVertices[j]);
 
             transformedVertices[j].z += 5;
         }
 
         if (!doNotCull)
         {
-            vec3_t vectorBA = vec3SubVectors(transformedVertices[1], transformedVertices[0]);
-            vec3_t vectorCA = vec3SubVectors(transformedVertices[2], transformedVertices[0]);
+            vec3_t vectorBA = vec3SubVectors(vec3FromVec4(transformedVertices[1]), vec3FromVec4(transformedVertices[0]));
+            vec3_t vectorCA = vec3SubVectors(vec3FromVec4(transformedVertices[2]), vec3FromVec4(transformedVertices[0]));
             vec3Normalize(&vectorBA);
             vec3Normalize(&vectorCA);
             vec3_t triangleNormal = vec3Cross(vectorBA, vectorCA);
             vec3Normalize(&triangleNormal);
 
-            vec3_t cameraRay = vec3SubVectors(cameraPosition, transformedVertices[0]);
+            vec3_t cameraRay = vec3SubVectors(cameraPosition, vec3FromVec4(transformedVertices[0]));
             vec3Normalize(&cameraRay);
 
             double cameraDotTriangle = vec3Dot(triangleNormal, cameraRay);
@@ -209,7 +213,7 @@ void update()
 
         for (j = 0 ; j < 3 ; j++)
         {
-            vec2_t projected = perspectivePointProjection(transformedVertices[j]);
+            vec2_t projected = perspectivePointProjection(vec3FromVec4(transformedVertices[j]));
 
             projected.x += (windowWidth / 2);
             projected.y += (windowHeight / 2);

+ 2 - 0
source/mesh.c

@@ -61,6 +61,8 @@ mesh_t mesh =
     .vertices = NULL,
     .faces = NULL,
     .rotation = { 0, 0, 0 },
+    .scale = { 1, 1, 1 },
+    .translation = { 0, 0, 0 },
 };
 
 void loadCubeMeshData()

+ 13 - 0
source/vector.c

@@ -103,6 +103,12 @@ void vec3Normalize(vec3_t *a)
     *a = vec3ScalarDiv(*a, length);
 }
 
+vec3_t vec3FromVec4(vec4_t v)
+{
+    vec3_t ret = { v.x, v.y, v.z };
+    return ret;
+}
+
 vec3_t vec3RotateX(vec3_t original, double angle)
 {
     vec3_t ret = {
@@ -131,4 +137,11 @@ vec3_t vec3RotateZ(vec3_t original, double angle)
         .z = original.z,
     };
     return ret;
+}
+
+/* ---------------------------------------------- 4D Vectors operations --------------------------------------------- */
+vec4_t vec4FromVec3(vec3_t v)
+{
+    vec4_t ret = { v.x, v.y, v.z, 1 };
+    return ret;
 }