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);
    }
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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]);
}