[Racer-svn] SF.net SVN: racer:[346] trunk/libtrack/Mesh/MeshFaces.cpp
Status: Alpha
Brought to you by:
jlegg
From: <jl...@us...> - 2010-09-25 02:28:15
|
Revision: 346 http://racer.svn.sourceforge.net/racer/?rev=346&view=rev Author: jlegg Date: 2010-09-25 02:28:09 +0000 (Sat, 25 Sep 2010) Log Message: ----------- Smooth shade track edge pieces. Some themes need adjusting. Modified Paths: -------------- trunk/libtrack/Mesh/MeshFaces.cpp Modified: trunk/libtrack/Mesh/MeshFaces.cpp =================================================================== --- trunk/libtrack/Mesh/MeshFaces.cpp 2010-09-19 14:48:19 UTC (rev 345) +++ trunk/libtrack/Mesh/MeshFaces.cpp 2010-09-25 02:28:09 UTC (rev 346) @@ -361,21 +361,62 @@ void MeshFaces::copy_faces(const MeshFaces & other) { faces = other.faces; - // Set normals for each face vertex. - for (std::vector<Face>::iterator it = faces.begin(); it != faces.end(); it++) + // Smooth shading: calculate vertex normals for curved objects. + // For each vertex, find the average face normal of all faces using it, and renormalize. + for (unsigned int i = 0; i < vertices_position.size(); i++) { - // solid shading: face normals are consistant across a face - assert(it->fv1.vertex_index < vertices_position.size()); - assert(it->fv2.vertex_index < vertices_position.size()); - assert(it->fv3.vertex_index < vertices_position.size()); - btVector3 & v1 = vertices_position[it->fv1.vertex_index]; - btVector3 & v2 = vertices_position[it->fv2.vertex_index]; - btVector3 & v3 = vertices_position[it->fv3.vertex_index]; - btVector3 n = (v2-v1).cross(v3-v1).normalize(); - it->fv1.normal = n; - it->fv2.normal = n; - it->fv3.normal = n; - /// @todo smooth shading: calculate and use vertex normals for curved objects. + // find where the normal is used + std::vector<btVector3 *> normal_uses; + std::vector<btVector3> face_normals; + for (std::vector<Face>::iterator it = faces.begin(); it != faces.end(); it++) + { + bool use_this_face = false; + if (it->fv1.vertex_index == i) + { + normal_uses.push_back(&(it->fv1.normal)); + use_this_face = true; + } + if (it->fv2.vertex_index == i) + { + normal_uses.push_back(&(it->fv2.normal)); + use_this_face = true; + } + if (it->fv3.vertex_index == i) + { + normal_uses.push_back(&(it->fv3.normal)); + use_this_face = true; + } + if (use_this_face) + { + // calculate face normal. + btVector3 & v1 = vertices_position[it->fv1.vertex_index]; + btVector3 & v2 = vertices_position[it->fv2.vertex_index]; + btVector3 & v3 = vertices_position[it->fv3.vertex_index]; + // not normalised, so we get a weighted average by face area. + btVector3 n = (v2-v1).cross(v3-v1); + face_normals.push_back(n); + } + } + // find average face normal + btVector3 smooth_normal(0, 0, 0); + for (std::vector<btVector3>::iterator it = face_normals.begin(); + it != face_normals.end(); + it++) + { + smooth_normal += *it; + } + smooth_normal.normalize(); + // eh hum + /*btScalar ox = smooth_normal.x(); + smooth_normal.setX(smooth_normal.z()); + smooth_normal.setZ(ox);*/ + // now update all the faces that use this. + for (std::vector<btVector3 *>::iterator it = normal_uses.begin(); + it != normal_uses.end(); + it++) + { + **it = smooth_normal; + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |