Browse Source

3DFileViewer: Calculate face-normal from vertex-normals of the triangle

This change calculates the face-normal of the triangle by adding
the three vertex-normals and then normalizing. This results in an
average of the three vertex-normals.
Pedro Pereira 3 years ago
parent
commit
ed41f48ea4

+ 24 - 4
Userland/Applications/3DFileViewer/Mesh.cpp

@@ -58,10 +58,30 @@ void Mesh::draw(float uv_scale)
             m_vertex_list.at(triangle.c).y,
             m_vertex_list.at(triangle.c).z);
 
-        // Compute the triangle normal
-        const FloatVector3 vec_ab = vertex_b - vertex_a;
-        const FloatVector3 vec_ac = vertex_c - vertex_a;
-        const FloatVector3 normal = vec_ab.cross(vec_ac).normalized();
+        FloatVector3 normal;
+        if (has_normals()) {
+            const FloatVector3 normal_a(
+                m_normal_list.at(triangle.normal_index0).x,
+                m_normal_list.at(triangle.normal_index0).y,
+                m_normal_list.at(triangle.normal_index0).z);
+
+            const FloatVector3 normal_b(
+                m_normal_list.at(triangle.normal_index1).x,
+                m_normal_list.at(triangle.normal_index1).y,
+                m_normal_list.at(triangle.normal_index1).z);
+
+            const FloatVector3 normal_c(
+                m_normal_list.at(triangle.normal_index2).x,
+                m_normal_list.at(triangle.normal_index2).y,
+                m_normal_list.at(triangle.normal_index2).z);
+
+            normal = (normal_a + normal_b + normal_c).normalized();
+        } else {
+            // Compute the triangle normal
+            const FloatVector3 vec_ab = vertex_b - vertex_a;
+            const FloatVector3 vec_ac = vertex_c - vertex_a;
+            normal = vec_ab.cross(vec_ac).normalized();
+        }
 
         // Compute lighting with a Lambertian color model
         const auto light_intensity = max(light_direction.dot(normal), 0.f);

+ 2 - 0
Userland/Applications/3DFileViewer/Mesh.h

@@ -27,6 +27,8 @@ public:
 
     bool is_textured() const { return m_tex_coords.size() > 0; }
 
+    bool has_normals() const { return m_normal_list.size() > 0; }
+
 private:
     Vector<Vertex> m_vertex_list;
     Vector<TexCoord> m_tex_coords;