//------------------------------------------------------------------------------ // generate display IDs for Vtr faces static void createFaceNumbers(OpenSubdiv::Far::TopologyRefiner const & refiner, std::vector<Vertex> const & vertexBuffer) { static char buf[16]; if (refiner.IsUniform()) { int maxlevel = refiner.GetMaxLevel(), firstvert = 0; for (int i=0; i<maxlevel; ++i) { firstvert += refiner.GetNumVertices(i); } for (int face=0; face<refiner.GetNumFaces(maxlevel); ++face) { Vertex center(0.0f, 0.0f, 0.0f); OpenSubdiv::Far::IndexArray const verts = refiner.GetFaceVertices(maxlevel, face); float weight = 1.0f / (float)verts.size(); for (int vert=0; vert<verts.size(); ++vert) { center.AddWithWeight(vertexBuffer[firstvert+verts[vert]], weight); } snprintf(buf, 16, "%d", face); g_font->Print3D(center.GetPos(), buf, 2); } } else { int maxlevel = refiner.GetMaxLevel(), // patch = refiner.GetNumFaces(0), firstvert = refiner.GetNumVertices(0); for (int level=1; level<=maxlevel; ++level) { int nfaces = refiner.GetNumFaces(level); for (int face=0; face<nfaces; ++face /*, ++patch */) { Vertex center(0.0f, 0.0f, 0.0f); OpenSubdiv::Far::IndexArray const verts = refiner.GetFaceVertices(level, face); float weight = 1.0f / (float)verts.size(); for (int vert=0; vert<verts.size(); ++vert) { center.AddWithWeight(vertexBuffer[firstvert+verts[vert]], weight); } snprintf(buf, 16, "%d", face); g_font->Print3D(center.GetPos(), buf, 2); } firstvert+=refiner.GetNumVertices(level); } } }