@@ -70,3 +70,42 @@ void OBJ::draw_obj() {
7070
7171 CHECK_GL (glEnd ());
7272}
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