// A helper function to calculate face normals. It is included here to illustrate // how to inspect the coarse mesh, give an HbrMesh pointer. // static void calcNormals(OsdHbrMesh * mesh, std::vector<float> const & pos, std::vector<float> & result ) { // // Get the number of vertices and faces. Notice the naming convention is // different between coarse Vertices and Faces. This may change in the // future (it an artifact of the original renderman code). // int nverts = mesh->GetNumVertices(); int nfaces = mesh->GetNumCoarseFaces(); for (int i = 0; i < nfaces; ++i) { OsdHbrFace * f = mesh->GetFace(i); float const * p0 = &pos[f->GetVertex(0)->GetID()*3], * p1 = &pos[f->GetVertex(1)->GetID()*3], * p2 = &pos[f->GetVertex(2)->GetID()*3]; float n[3]; cross( n, p0, p1, p2 ); for (int j = 0; j < f->GetNumVertices(); j++) { int idx = f->GetVertex(j)->GetID() * 3; result[idx ] += n[0]; result[idx+1] += n[1]; result[idx+2] += n[2]; } } for (int i = 0; i < nverts; ++i) normalize(&result[i*3]); }
//------------------------------------------------------------------------------ static void createCoarseMesh( OsdHbrMesh * const hmesh, int nfaces ) { // save coarse topology (used for coarse mesh drawing) g_coarseEdges.clear(); g_coarseEdgeSharpness.clear(); g_coarseVertexSharpness.clear(); for(int i=0; i<nfaces; ++i) { OsdHbrFace *face = hmesh->GetFace(i); int nv = face->GetNumVertices(); for(int j=0; j<nv; ++j) { g_coarseEdges.push_back(face->GetVertex(j)->GetID()); g_coarseEdges.push_back(face->GetVertex((j+1)%nv)->GetID()); g_coarseEdgeSharpness.push_back(face->GetEdge(j)->GetSharpness()); } } int nv = hmesh->GetNumVertices(); for(int i=0; i<nv; ++i) { g_coarseVertexSharpness.push_back(hmesh->GetVertex(i)->GetSharpness()); } // assign a randomly generated color for each vertex ofthe mesh createRandomVaryingColors(nv, g_varyingColors); }