Browse Source

Lesson 18.2

Godzil 3 years ago
parent
commit
33540320ce
6 changed files with 57 additions and 15 deletions
  1. 1 1
      source/include/display.h
  2. 21 0
      source/include/light.h
  3. 9 0
      source/light.c
  4. 23 11
      source/main.c
  5. 1 1
      source/matrix.c
  6. 2 2
      source/mesh.c

+ 1 - 1
source/include/display.h

@@ -21,7 +21,7 @@ typedef uint32_t colour_t;
 /***********************************************************************************************************************
  * Constants
  **********************************************************************************************************************/
-#define FPS (30)
+#define FPS (60)
 #define FRAME_TARGET_TIME (1000 / FPS)
 
 /***********************************************************************************************************************

+ 21 - 0
source/include/light.h

@@ -0,0 +1,21 @@
+/*
+ * 3D Engine 
+ * light.h: 
+ * Based on pikuma.com 3D software renderer in C
+ * Copyright (c) 2021 986-Studio. All rights reserved.
+ *
+ * Created by Manoël Trapier on 06/03/2021.
+ */
+
+#ifndef THREEDENGINE_SOURCE_INCLUDE_LIGHT_H
+#define THREEDENGINE_SOURCE_INCLUDE_LIGHT_H
+
+/***********************************************************************************************************************
+ * Data types
+ **********************************************************************************************************************/
+
+/***********************************************************************************************************************
+ * Prototypes
+ **********************************************************************************************************************/
+
+#endif /* THREEDENGINE_SOURCE_INCLUDE_LIGHT_H */

+ 9 - 0
source/light.c

@@ -0,0 +1,9 @@
+/*
+ * 3D Engine 
+ * light.c: 
+ * Based on pikuma.com 3D software renderer in C
+ * Copyright (c) 2021 986-Studio. All rights reserved.
+ *
+ * Created by Manoël Trapier on 06/03/2021.
+ */
+

+ 23 - 11
source/main.c

@@ -21,6 +21,7 @@
 #include <display.h>
 #include <vector.h>
 #include <mesh.h>
+#include <light.h>
 
 bool isRunning = true;
 int previousFrameTime = 0;
@@ -35,6 +36,8 @@ bool displayVertex = false;
 bool doNotCull = false;
 enum displayMode_t currentDisplayMode = DISPLAY_MODE_SOLID;
 matrix4_t projectionMatrix;
+light_t globalLight;
+
 
 vec3_t cameraPosition =
 {
@@ -64,8 +67,13 @@ void setup()
 
     projectionMatrix = mat4Perspective((double)windowHeight / windowWidth, 90, 0.1, 100);
 
-    //loadOBJFile("assets/cube.obj");
-    loadCubeMeshData();
+    globalLight.direction.x = 0;
+    globalLight.direction.y = 0;
+    globalLight.direction.z = 1;
+    vec3Normalize(&globalLight.direction);
+
+    loadOBJFile("assets/f22.obj");
+    //loadCubeMeshData();
 
 exit:
     return;
@@ -136,7 +144,7 @@ void update()
     }
     previousFrameTime = SDL_GetTicks();
 
-    mesh.rotation.x += 0.01;
+    mesh.rotation.x += 0.001;
     mesh.translation.z = 5;
 
     worldMatrix = mat4Identity;
@@ -154,6 +162,7 @@ void update()
     {
         triangle_t currentTriangle;
         vec4_t transformedVertices[3];
+        vec3_t triangleNormal;
 
         vec3_t vertices[3] =
         {
@@ -169,15 +178,15 @@ void update()
             transformedVertices[j] = mat4ProdVec4(worldMatrix, transformedVertices[j]);
         }
 
+        vec3_t vectorBA = vec3SubVectors(vec3FromVec4(transformedVertices[1]), vec3FromVec4(transformedVertices[0]));
+        vec3_t vectorCA = vec3SubVectors(vec3FromVec4(transformedVertices[2]), vec3FromVec4(transformedVertices[0]));
+        vec3Normalize(&vectorBA);
+        vec3Normalize(&vectorCA);
+        triangleNormal = vec3Cross(vectorBA, vectorCA);
+        vec3Normalize(&triangleNormal);
+
         if (!doNotCull)
         {
-            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, vec3FromVec4(transformedVertices[0]));
             vec3Normalize(&cameraRay);
 
@@ -205,7 +214,10 @@ void update()
             currentTriangle.points[j].y = projected.y;
         }
 
-        currentTriangle.colour = mesh.faces[i].colour;
+        double lightLevel = -vec3Dot(triangleNormal, globalLight.direction);
+
+        currentTriangle.colour = applyLight(mesh.faces[i].colour, lightLevel);
+
         currentTriangle.averageDepth = (transformedVertices[0].z +
                                         transformedVertices[1].z +
                                         transformedVertices[2].z) / 3.0;

+ 1 - 1
source/matrix.c

@@ -56,7 +56,7 @@ vec4_t mat4ProdVec4Project(matrix4_t mat, vec4_t v)
 matrix4_t mat4ProdMat4(matrix4_t a, matrix4_t b)
 {
     matrix4_t ret;
-    int x, y, k;
+    int x, y;
     for (y = 0 ; y < 4 ; y++)
     {
         for (x = 0 ; x < 4 ; x++)

+ 2 - 2
source/mesh.c

@@ -348,7 +348,7 @@ int objFileLoaderExecuteLine(int argc, char *argv[], uint32_t currentLine)
             objFileLoaderTotalTri++;
             objFileLoaderLoadedFaces++;
 
-            face_t face = { v[1], v[2], v[3], .colour = MAKE_RGB(255, 0, 0) };
+            face_t face = { v[1], v[2], v[3], .colour = MAKE_RGB(45, 170, 10) };
             arrayAdd(mesh.faces, face);
             ret = 0;
         }
@@ -358,7 +358,7 @@ int objFileLoaderExecuteLine(int argc, char *argv[], uint32_t currentLine)
             /* This is not a triangle, so we need to fan it */
             for(i = 2; i < (argc - 1); i++)
             {
-                face_t face = { v[1], v[i], v[i + 1], .colour = MAKE_RGB(255, 0, 0) };
+                face_t face = { v[1], v[i], v[i + 1], .colour = MAKE_RGB(45, 170, 10) };
                 arrayAdd(mesh.faces, face);
 
                 objFileLoaderTotalTri++;