Refactoring smoothing and normal generation code.

This commit is contained in:
David Williams
2009-05-27 21:36:52 +00:00
parent 6e9c31d6bc
commit 5682b204a6
9 changed files with 80 additions and 350 deletions

View File

@ -114,5 +114,78 @@ namespace PolyVox
return (getNoOfVertices() == 0) || (getNoOfIndices() == 0);
}
void IndexedSurfacePatch::smooth(float fAmount, bool bIncludeEdgeVertices)
{
std::vector<SurfaceVertex> vecOriginalVertices = m_vecVertices;
for(vector<uint32_t>::iterator iterIndex = m_vecTriangleIndices.begin(); iterIndex != m_vecTriangleIndices.end();)
{
SurfaceVertex& v0 = vecOriginalVertices[*iterIndex];
SurfaceVertex& v0New = m_vecVertices[*iterIndex];
iterIndex++;
SurfaceVertex& v1 = vecOriginalVertices[*iterIndex];
SurfaceVertex& v1New = m_vecVertices[*iterIndex];
iterIndex++;
SurfaceVertex& v2 = vecOriginalVertices[*iterIndex];
SurfaceVertex& v2New = m_vecVertices[*iterIndex];
iterIndex++;
//FIXME - instead of finding these opposite points (Opp) we could just use the midpoint?
Vector3DFloat v0Opp = (v1.position + v2.position) / 2.0f;
Vector3DFloat v1Opp = (v0.position + v2.position) / 2.0f;
Vector3DFloat v2Opp = (v0.position + v1.position) / 2.0f;
Vector3DFloat v0ToOpp = v0Opp - v0.position;
v0ToOpp.normalise();
Vector3DFloat v1ToOpp = v1Opp - v1.position;
v1ToOpp.normalise();
Vector3DFloat v2ToOpp = v2Opp - v2.position;
v2ToOpp.normalise();
Vector3DFloat n0 = v0.getNormal();
n0.normalise();
Vector3DFloat n1 = v1.getNormal();
n1.normalise();
Vector3DFloat n2 = v2.getNormal();
n2.normalise();
v0New.position += (n0 * (n0.dot(v0ToOpp)) * fAmount);
v1New.position += (n1 * (n1.dot(v1ToOpp)) * fAmount);
v2New.position += (n2 * (n2.dot(v2ToOpp)) * fAmount);
}
}
void IndexedSurfacePatch::generateAveragedFaceNormals(bool bNormalise, bool bIncludeEdgeVertices)
{
for(vector<SurfaceVertex>::iterator iterVertex = m_vecVertices.begin(); iterVertex != m_vecVertices.end(); iterVertex++)
{
iterVertex->setNormal(Vector3DFloat(0.0f,0.0f,0.0f));
}
for(vector<uint32_t>::iterator iterIndex = m_vecTriangleIndices.begin(); iterIndex != m_vecTriangleIndices.end();)
{
SurfaceVertex& v0 = m_vecVertices[*iterIndex];
iterIndex++;
SurfaceVertex& v1 = m_vecVertices[*iterIndex];
iterIndex++;
SurfaceVertex& v2 = m_vecVertices[*iterIndex];
iterIndex++;
Vector3DFloat triangleNormal = (v1.getPosition()-v0.getPosition()).cross(v2.getPosition()-v0.getPosition());
v0.setNormal(v0.getNormal() + triangleNormal);
v1.setNormal(v1.getNormal() + triangleNormal);
v2.setNormal(v2.getNormal() + triangleNormal);
}
if(bNormalise)
{
for(vector<SurfaceVertex>::iterator iterVertex = m_vecVertices.begin(); iterVertex != m_vecVertices.end(); iterVertex++)
{
Vector3DFloat normal = iterVertex->getNormal();
normal.normalise();
iterVertex->setNormal(normal);
}
}
}
}