void LodInputProviderMesh::tuneContainerSize(LodData* data) { // Get Vertex count for container tuning. bool sharedVerticesAdded = false; size_t trianglesCount = 0; size_t vertexCount = 0; size_t vertexLookupSize = 0; size_t sharedVertexLookupSize = 0; size_t submeshCount = mMesh->getNumSubMeshes(); for (size_t i = 0; i < submeshCount; i++) { const SubMesh* submesh = mMesh->getSubMesh(i); trianglesCount += getTriangleCount(submesh->operationType , submesh->indexData->indexCount); if (!submesh->useSharedVertices) { size_t count = submesh->vertexData->vertexCount; vertexLookupSize = std::max(vertexLookupSize, count); vertexCount += count; } else if (!sharedVerticesAdded) { sharedVerticesAdded = true; sharedVertexLookupSize = mMesh->sharedVertexData->vertexCount; vertexCount += sharedVertexLookupSize; } } // Tune containers: data->mUniqueVertexSet.rehash(4 * vertexCount); // less then 0.25 item/bucket for low collision rate data->mTriangleList.reserve(trianglesCount); data->mVertexList.reserve(vertexCount); mSharedVertexLookup.reserve(sharedVertexLookupSize); mVertexLookup.reserve(vertexLookupSize); data->mIndexBufferInfoList.resize(submeshCount); }
void DelaunayChecker::checkEuler() { const int v = getVertexCount(); std::cout << "V: " << v; const int e = getSegmentCount(); std::cout << " E: " << e; const int f = getTriangleCount(); std::cout << " F: " << f; const int t = getTetraCount(); std::cout << " T: " << t; const int euler = v - e + f - t; std::cout << " Euler: " << euler << std::endl; std::cout << "Euler check: " << ( ( 0 != euler ) ? " ***Fail***" : " Pass" ) << std::endl; return; }
std::vector<vertex> mesh::getOuterMostVertices() const { // We initialise the list of vertices with the first vertex of the mesh; std::vector<vertex> vertices(6, m_triangles[0].getVertex(0)); for(int i = 0; i < getTriangleCount(); i++) for(int j = 0; j < 3; j++) { vertex this_vertex = m_triangles[i].getVertex(j); float4 vertex_pos = this_vertex.getPosition(); if(vertex_pos.getX() > vertices[0].getPosition().getX()) vertices[0] = this_vertex; if(vertex_pos.getX() < vertices[1].getPosition().getX()) vertices[1] = this_vertex; if(vertex_pos.getY() > vertices[2].getPosition().getY()) vertices[2] = this_vertex; if(vertex_pos.getY() < vertices[3].getPosition().getY()) vertices[3] = this_vertex; if(vertex_pos.getZ() > vertices[4].getPosition().getZ()) vertices[4] = this_vertex; if(vertex_pos.getZ() < vertices[5].getPosition().getZ()) vertices[5] = this_vertex; } return vertices; }
const TriangleAccessor & kDTree::getTriangle(uint32_t index) const { if (index >= getTriangleCount()) { throw std::out_of_range("Parameter index out of range."); } return triangleStorage->at(sorted[getSplitDimension()][index]); }