@@ -70,3 +70,42 @@ void OBJ::draw_obj() {
70
70
71
71
CHECK_GL (glEnd ());
72
72
}
73
+
74
+ void OBJ::draw_obj_smooth () {
75
+ std::vector<glm::vec3> faceNormalBuffer;
76
+ std::vector<glm::vec3> vertexNormalBuffer (vertices.size ());
77
+
78
+ for (auto & face : faces) {
79
+ auto const & a = vertices.at (face[0 ]);
80
+ auto const & b = vertices.at (face[1 ]);
81
+ auto const & c = vertices.at (face[2 ]);
82
+
83
+ glm::vec3 fn = compute_normal (a, b, c);
84
+ faceNormalBuffer.push_back (fn);
85
+ vertexNormalBuffer[face[0 ]] += fn;
86
+ vertexNormalBuffer[face[1 ]] += fn;
87
+ vertexNormalBuffer[face[2 ]] += fn;
88
+ }
89
+ for (auto & vn : vertexNormalBuffer) {
90
+ vn = glm::normalize (vn);
91
+ }
92
+
93
+ glBegin (GL_TRIANGLES);
94
+ for (auto const & face : faces) {
95
+ auto const & a = vertices.at (face[0 ]);
96
+ auto const & b = vertices.at (face[1 ]);
97
+ auto const & c = vertices.at (face[2 ]);
98
+
99
+ auto const & n1 = vertexNormalBuffer.at (face[0 ]);
100
+ auto const & n2 = vertexNormalBuffer.at (face[1 ]);
101
+ auto const & n3 = vertexNormalBuffer.at (face[2 ]);
102
+
103
+ glNormal3fv (glm::value_ptr (n1));
104
+ glVertex3fv (glm::value_ptr (a));
105
+ glNormal3fv (glm::value_ptr (n2));
106
+ glVertex3fv (glm::value_ptr (b));
107
+ glNormal3fv (glm::value_ptr (n3));
108
+ glVertex3fv (glm::value_ptr (c));
109
+ }
110
+ CHECK_GL (glEnd ());
111
+ }
0 commit comments