32 POLYVOX_API void MeshDecimator<PositionMaterial>::fillInitialVertexMetadata(std::vector<InitialVertexMetadata>& vecVertexMetadata)
34 vecVertexMetadata.clear();
35 vecVertexMetadata.resize(m_pOutputMesh->m_vecVertices.size());
37 for(uint32_t ct = 0; ct < vecVertexMetadata.size(); ct++)
39 vecVertexMetadata[ct].normal.setElements(0,0,0);
40 vecVertexMetadata[ct].isOnMaterialEdge =
false;
41 vecVertexMetadata[ct].isOnRegionFace.reset();
47 std::vector<IntVertex> intVertices;
48 intVertices.reserve(m_pOutputMesh->m_vecVertices.size());
49 for(uint32_t ct = 0; ct < m_pOutputMesh->m_vecVertices.size(); ct++)
51 const Vector3DFloat& floatPos = m_pOutputMesh->m_vecVertices[ct].position;
52 IntVertex intVertex(static_cast<uint32_t>(floatPos.getX()), static_cast<uint32_t>(floatPos.getY()), static_cast<uint32_t>(floatPos.getZ()), ct);
53 intVertices.push_back(intVertex);
57 sort(intVertices.begin(), intVertices.end());
60 for(uint32_t ct = 0; ct < intVertices.size() - 1; ct++)
62 const IntVertex& v0 = intVertices[ct+0];
63 const IntVertex& v1 = intVertices[ct+1];
65 if((v0.x == v1.x) && (v0.y == v1.y) && (v0.z == v1.z))
67 vecVertexMetadata[v0.index].isOnMaterialEdge =
true;
68 vecVertexMetadata[v1.index].isOnMaterialEdge =
true;
73 for(uint32_t ct = 0; ct < m_pOutputMesh->m_vecVertices.size(); ct++)
76 for(vector<uint32_t>::iterator iter = trianglesUsingVertex[ct].begin(); iter != trianglesUsingVertex[ct].end(); iter++)
78 sumOfNormals += m_vecTriangles[*iter].normal;
81 vecVertexMetadata[ct].normal = sumOfNormals;
82 vecVertexMetadata[ct].normal.normalise();
86 for(uint32_t ct = 0; ct < vecVertexMetadata.size(); ct++)
88 Region regTransformed = m_pOutputMesh->m_Region;
89 regTransformed.shift(regTransformed.getLowerCorner() *
static_cast<int32_t>(-1));
92 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_NEG_X, m_pOutputMesh->m_vecVertices[ct].getPosition().getX() < regTransformed.getLowerCorner().getX() + 0.001f);
93 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_POS_X, m_pOutputMesh->m_vecVertices[ct].getPosition().getX() > regTransformed.getUpperCorner().getX() - 0.001f);
95 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_NEG_Y, m_pOutputMesh->m_vecVertices[ct].getPosition().getY() < regTransformed.getLowerCorner().getY() + 0.001f);
96 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_POS_Y, m_pOutputMesh->m_vecVertices[ct].getPosition().getY() > regTransformed.getUpperCorner().getY() - 0.001f);
98 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_NEG_Z, m_pOutputMesh->m_vecVertices[ct].getPosition().getZ() < regTransformed.getLowerCorner().getZ() + 0.001f);
99 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_POS_Z, m_pOutputMesh->m_vecVertices[ct].getPosition().getZ() > regTransformed.getUpperCorner().getZ() - 0.001f);
104 POLYVOX_API void MeshDecimator<PositionMaterialNormal>::fillInitialVertexMetadata(std::vector<InitialVertexMetadata>& vecVertexMetadata)
106 vecVertexMetadata.clear();
107 vecVertexMetadata.resize(m_pOutputMesh->m_vecVertices.size());
110 for(uint32_t ct = 0; ct < vecVertexMetadata.size(); ct++)
112 vecVertexMetadata[ct].isOnRegionFace.reset();
113 vecVertexMetadata[ct].isOnMaterialEdge =
false;
114 vecVertexMetadata[ct].normal = m_pOutputMesh->m_vecVertices[ct].normal;
118 for(uint32_t ct = 0; ct < vecVertexMetadata.size(); ct++)
120 Region regTransformed = m_pOutputMesh->m_Region;
121 regTransformed.shift(regTransformed.getLowerCorner() *
static_cast<int32_t>(-1));
124 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_NEG_X, m_pOutputMesh->m_vecVertices[ct].getPosition().getX() < regTransformed.getLowerCorner().getX() + 0.001f);
125 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_POS_X, m_pOutputMesh->m_vecVertices[ct].getPosition().getX() > regTransformed.getUpperCorner().getX() - 0.001f);
127 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_NEG_Y, m_pOutputMesh->m_vecVertices[ct].getPosition().getY() < regTransformed.getLowerCorner().getY() + 0.001f);
128 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_POS_Y, m_pOutputMesh->m_vecVertices[ct].getPosition().getY() > regTransformed.getUpperCorner().getY() - 0.001f);
130 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_NEG_Z, m_pOutputMesh->m_vecVertices[ct].getPosition().getZ() < regTransformed.getLowerCorner().getZ() + 0.001f);
131 vecVertexMetadata[ct].isOnRegionFace.set(RFF_ON_REGION_FACE_POS_Z, m_pOutputMesh->m_vecVertices[ct].getPosition().getZ() > regTransformed.getUpperCorner().getZ() - 0.001f);
137 for(uint32_t ct = 0; ct < m_vecTriangles.size(); ct++)
139 uint32_t v0 = m_vecTriangles[ct].v0;
140 uint32_t v1 = m_vecTriangles[ct].v1;
141 uint32_t v2 = m_vecTriangles[ct].v2;
144 (m_pOutputMesh->m_vecVertices[v0].material - m_pOutputMesh->m_vecVertices[v1].material < 0.001f) &&
145 (m_pOutputMesh->m_vecVertices[v1].material - m_pOutputMesh->m_vecVertices[v2].material < 0.001f);
149 vecVertexMetadata[v0].isOnMaterialEdge =
true;
150 vecVertexMetadata[v1].isOnMaterialEdge =
true;
151 vecVertexMetadata[v2].isOnMaterialEdge =
true;
157 POLYVOX_API bool MeshDecimator<PositionMaterialNormal>::canCollapseNormalEdge(uint32_t uSrc, uint32_t uDst)
159 if(m_vecInitialVertexMetadata[uSrc].normal.dot(m_vecInitialVertexMetadata[uDst].normal) < m_fMinDotProductForCollapse)
165 return !collapseChangesFaceNormals(uSrc, uDst, m_fMinDotProductForCollapse);
169 POLYVOX_API bool MeshDecimator<PositionMaterial>::canCollapseNormalEdge(uint32_t uSrc, uint32_t uDst)
179 return !collapseChangesFaceNormals(uSrc, uDst, 0.999f);