static HdMeshTopology _GenerateCapsuleMeshTopology() { int numCounts = _slices * (_stacks + 2 * _hemisphereStacks); int numIndices = 4 * _slices * _stacks // cylinder quads + 4 * 2 * _slices * (_hemisphereStacks-1) // hemisphere quads + 3 * 2 * _slices; // end cap tris VtIntArray countsArray(numCounts); int * counts = countsArray.data(); VtIntArray indicesArray(numIndices); int * indices = indicesArray.data(); // populate face counts and face indices int face = 0, index = 0, p = 0; // base hemisphere end cap triangles int base = p++; for (int i=0; i<_slices; ++i) { counts[face++] = 3; indices[index++] = p + (i+1)%_slices; indices[index++] = p + i; indices[index++] = base; } // middle and hemisphere quads for (int i=0; i<_stacks+2*(_hemisphereStacks-1); ++i) { for (int j=0; j<_slices; ++j) { float x0 = 0; float x1 = x0 + _slices; float y0 = j; float y1 = (j + 1) % _slices; counts[face++] = 4; indices[index++] = p + x0 + y0; indices[index++] = p + x0 + y1; indices[index++] = p + x1 + y1; indices[index++] = p + x1 + y0; } p += _slices; } // top hemisphere end cap triangles int top = p + _slices; for (int i=0; i<_slices; ++i) { counts[face++] = 3; indices[index++] = p + i; indices[index++] = p + (i+1)%_slices; indices[index++] = top; } TF_VERIFY(face == numCounts && index == numIndices); return HdMeshTopology(PxOsdOpenSubdivTokens->catmark, HdTokens->rightHanded, countsArray, indicesArray); }
static HdMeshTopology _GenerateConeMeshTopology() { int numCounts = _slices * _stacks + _slices; int numIndices = 4 * _slices * _stacks // cone quads + 3 * _slices; // end cap triangles VtIntArray countsArray(numCounts); int * counts = countsArray.data(); VtIntArray indicesArray(numIndices); int * indices = indicesArray.data(); // populate face counts and face indices int face = 0, index = 0, p = 0; // base end cap triangles int base = p++; for (int i=0; i<_slices; ++i) { counts[face++] = 3; indices[index++] = p + (i+1)%_slices; indices[index++] = p + i; indices[index++] = base; } p += _slices; // cone quads for (int i=0; i<_stacks; ++i) { for (int j=0; j<_slices; ++j) { float x0 = 0; float x1 = x0 + _slices; float y0 = j; float y1 = (j + 1) % _slices; counts[face++] = 4; indices[index++] = p + x0 + y0; indices[index++] = p + x0 + y1; indices[index++] = p + x1 + y1; indices[index++] = p + x1 + y0; } p += _slices; } TF_VERIFY(face == numCounts and index == numIndices); return HdMeshTopology(PxOsdOpenSubdivTokens->catmark, HdTokens->rightHanded, countsArray, indicesArray); }