@@ -30,8 +30,8 @@ typedef struct {
3030
3131std::vector<DrawObject> gDrawObjects ;
3232
33- int width = 512 ;
34- int height = 512 ;
33+ int width = 768 ;
34+ int height = 768 ;
3535
3636double prevMouseX, prevMouseY;
3737bool mouseLeftPressed;
@@ -92,16 +92,19 @@ bool LoadObjAndConvert(float bmin[3], float bmax[3], std::vector<DrawObject>& dr
9292 return false ;
9393 }
9494
95+ printf (" # of vertices = %d\n " , (int )(attrib.vertices .size ()) / 3 );
96+ printf (" # of normals = %d\n " , (int )(attrib.normals .size ()) / 3 );
97+ printf (" # of texcoords = %d\n " , (int )(attrib.texcoords .size ()) / 2 );
9598 printf (" # of materials = %d\n " , (int )materials.size ());
96- printf (" # of shapes = %d\n " , (int )shapes.size ());
99+ printf (" # of shapes = %d\n " , (int )shapes.size ());
97100
98101 bmin[0 ] = bmin[1 ] = bmin[2 ] = std::numeric_limits<float >::max ();
99102 bmax[0 ] = bmax[1 ] = bmax[2 ] = -std::numeric_limits<float >::max ();
100103
101104 {
102105 for (size_t s = 0 ; s < shapes.size (); s++) {
103106 DrawObject o;
104- std::vector<float > vb; // pos(3float), normal(3float)
107+ std::vector<float > vb; // pos(3float), normal(3float), color(3float)
105108 for (size_t f = 0 ; f < shapes[s].mesh .indices .size ()/3 ; f++) {
106109
107110 tinyobj::index_t idx0 = shapes[s].mesh .indices [3 *f+0 ];
@@ -150,6 +153,19 @@ bool LoadObjAndConvert(float bmin[3], float bmax[3], std::vector<DrawObject>& dr
150153 vb.push_back (n[k][0 ]);
151154 vb.push_back (n[k][1 ]);
152155 vb.push_back (n[k][2 ]);
156+ // Use normal as color.
157+ float c[3 ] = {n[k][0 ], n[k][1 ], n[k][2 ]};
158+ float len2 = c[0 ] * c[0 ] + c[1 ] * c[1 ] + c[2 ] * c[2 ];
159+ if (len2 > 0 .0f ) {
160+ float len = sqrtf (len2);
161+
162+ c[0 ] /= len;
163+ c[1 ] /= len;
164+ c[2 ] /= len;
165+ }
166+ vb.push_back (c[0 ] * 0.5 + 0.5 );
167+ vb.push_back (c[1 ] * 0.5 + 0.5 );
168+ vb.push_back (c[2 ] * 0.5 + 0.5 );
153169 }
154170
155171 }
@@ -160,7 +176,8 @@ bool LoadObjAndConvert(float bmin[3], float bmax[3], std::vector<DrawObject>& dr
160176 glGenBuffers (1 , &o.vb );
161177 glBindBuffer (GL_ARRAY_BUFFER, o.vb );
162178 glBufferData (GL_ARRAY_BUFFER, vb.size () * sizeof (float ), &vb.at (0 ), GL_STATIC_DRAW);
163- o.numTriangles = vb.size () / 6 / 3 ;
179+ o.numTriangles = vb.size () / 9 / 3 ;
180+ printf (" shape[%d] # of triangles = %d\n " , static_cast <int >(s), o.numTriangles );
164181 }
165182
166183 gDrawObjects .push_back (o);
@@ -243,8 +260,8 @@ void motionFunc(GLFWwindow* window, double mouse_x, double mouse_y){
243260
244261 add_quats (prev_quat, curr_quat, curr_quat);
245262 } else if (mouseMiddlePressed) {
246- eye[0 ] + = transScale * (mouse_x - prevMouseX) / (float )width;
247- lookat[0 ] + = transScale * (mouse_x - prevMouseX) / (float )width;
263+ eye[0 ] - = transScale * (mouse_x - prevMouseX) / (float )width;
264+ lookat[0 ] - = transScale * (mouse_x - prevMouseX) / (float )width;
248265 eye[1 ] += transScale * (mouse_y - prevMouseY) / (float )height;
249266 lookat[1 ] += transScale * (mouse_y - prevMouseY) / (float )height;
250267 } else if (mouseRightPressed) {
@@ -274,8 +291,10 @@ void Draw(const std::vector<DrawObject>& drawObjects)
274291 glBindBuffer (GL_ARRAY_BUFFER, o.vb );
275292 glEnableClientState (GL_VERTEX_ARRAY);
276293 glEnableClientState (GL_NORMAL_ARRAY);
277- glVertexPointer (3 , GL_FLOAT, 24 , (const void *)0 );
278- glNormalPointer (GL_FLOAT, 24 , (const void *)(sizeof (float )*3 ));
294+ glEnableClientState (GL_COLOR_ARRAY);
295+ glVertexPointer (3 , GL_FLOAT, 36 , (const void *)0 );
296+ glNormalPointer (GL_FLOAT, 36 , (const void *)(sizeof (float )*3 ));
297+ glColorPointer (3 , GL_FLOAT, 36 , (const void *)(sizeof (float )*6 ));
279298
280299 glDrawArrays (GL_TRIANGLES, 0 , 3 * o.numTriangles );
281300 CheckErrors (" drawarrays" );
@@ -296,8 +315,9 @@ void Draw(const std::vector<DrawObject>& drawObjects)
296315 glBindBuffer (GL_ARRAY_BUFFER, o.vb );
297316 glEnableClientState (GL_VERTEX_ARRAY);
298317 glEnableClientState (GL_NORMAL_ARRAY);
299- glVertexPointer (3 , GL_FLOAT, 24 , (const void *)0 );
300- glNormalPointer (GL_FLOAT, 24 , (const void *)(sizeof (float )*3 ));
318+ glDisableClientState (GL_COLOR_ARRAY);
319+ glVertexPointer (3 , GL_FLOAT, 36 , (const void *)0 );
320+ glNormalPointer (GL_FLOAT, 36 , (const void *)(sizeof (float )*3 ));
301321
302322 glDrawArrays (GL_TRIANGLES, 0 , 3 * o.numTriangles );
303323 CheckErrors (" drawarrays" );
0 commit comments