Removed old and redundant Mesh* classes.
This commit is contained in:
parent
83b2f84529
commit
3205ce6c30
@ -30,8 +30,6 @@ freely, subject to the following restrictions:
|
|||||||
#include "MeshDecimator.h"
|
#include "MeshDecimator.h"
|
||||||
#include "SurfaceExtractor.h"
|
#include "SurfaceExtractor.h"
|
||||||
|
|
||||||
#include "Mesh.h"
|
|
||||||
|
|
||||||
//Some namespaces we need
|
//Some namespaces we need
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace PolyVox;
|
using namespace PolyVox;
|
||||||
@ -98,47 +96,15 @@ void OpenGLWidget::setVolume(PolyVox::Volume<MaterialDensityPair44>* volData)
|
|||||||
MeshDecimator<PositionMaterialNormal> decimator(mesh.get(), decimatedMesh.get(), 0.95f);
|
MeshDecimator<PositionMaterialNormal> decimator(mesh.get(), decimatedMesh.get(), 0.95f);
|
||||||
decimator.execute();
|
decimator.execute();
|
||||||
|
|
||||||
//computeNormalsForVertices(m_volData, *(mesh.get()), SOBEL_SMOOTHED);
|
decimatedMesh->generateAveragedFaceNormals(true);
|
||||||
|
|
||||||
|
//computeNormalsForVertices(m_volData, *(decimatedMesh.get()), SOBEL_SMOOTHED);
|
||||||
//*meshCurrent = getSmoothedSurface(*meshCurrent);
|
//*meshCurrent = getSmoothedSurface(*meshCurrent);
|
||||||
//mesh->smooth(0.3f);
|
//mesh->smooth(0.3f);
|
||||||
//meshCurrent->generateAveragedFaceNormals(true);
|
//meshCurrent->generateAveragedFaceNormals(true);
|
||||||
|
|
||||||
if(mesh->m_vecTriangleIndices.size() > 0)
|
if(mesh->m_vecTriangleIndices.size() > 0)
|
||||||
{
|
{
|
||||||
//mesh->makeProgressiveMesh();
|
|
||||||
|
|
||||||
/*RenderDynamicMesh rdm;
|
|
||||||
rdm.buildFromSurfaceMesh(*mesh);*/
|
|
||||||
|
|
||||||
//computeNormalsForVertices(m_volData, *(mesh.get()), SOBEL_SMOOTHED);
|
|
||||||
|
|
||||||
//mesh->smoothPositions(0.3f);
|
|
||||||
//mesh->generateAveragedFaceNormals(true);
|
|
||||||
|
|
||||||
/*for(int ct = 0; ct < 20; ct ++)
|
|
||||||
{
|
|
||||||
//cout << "Before: " << mesh->noOfDegenerateTris() << endl;
|
|
||||||
mesh->decimate();
|
|
||||||
//cout << "After: " << mesh->noOfDegenerateTris() << endl;
|
|
||||||
mesh->removeDegenerateTris();
|
|
||||||
//cout << "After Remove: " << mesh->noOfDegenerateTris() << endl << endl;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
//For decimation built into Mesh
|
|
||||||
//mesh->generateAveragedFaceNormals(true);
|
|
||||||
|
|
||||||
//mesh->decimate(0.999f);
|
|
||||||
|
|
||||||
//mesh->generateAveragedFaceNormals(true);
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
/*mesh->generateAveragedFaceNormals(true);
|
|
||||||
Mesh mesh;
|
|
||||||
mesh.buildFromMesh(mesh.get());
|
|
||||||
//mesh.removeEdge(*(mesh.m_edges.begin()));
|
|
||||||
mesh.decimateAll();
|
|
||||||
mesh.fillMesh(mesh.get());*/
|
|
||||||
|
|
||||||
|
|
||||||
Vector3DUint8 v3dRegPos(uRegionX,uRegionY,uRegionZ);
|
Vector3DUint8 v3dRegPos(uRegionX,uRegionY,uRegionZ);
|
||||||
|
@ -8,10 +8,6 @@ SET(CORE_SRC_FILES
|
|||||||
source/AStarPathfinder.cpp
|
source/AStarPathfinder.cpp
|
||||||
source/GradientEstimators.cpp
|
source/GradientEstimators.cpp
|
||||||
source/Log.cpp
|
source/Log.cpp
|
||||||
source/Mesh.cpp
|
|
||||||
source/MeshEdge.cpp
|
|
||||||
source/MeshFace.cpp
|
|
||||||
source/MeshVertex.cpp
|
|
||||||
source/Region.cpp
|
source/Region.cpp
|
||||||
source/VertexTypes.cpp
|
source/VertexTypes.cpp
|
||||||
source/VoxelFilters.cpp
|
source/VoxelFilters.cpp
|
||||||
@ -35,12 +31,8 @@ SET(CORE_INC_FILES
|
|||||||
include/Log.h
|
include/Log.h
|
||||||
include/Material.h
|
include/Material.h
|
||||||
include/MaterialDensityPair.h
|
include/MaterialDensityPair.h
|
||||||
include/Mesh.h
|
|
||||||
include/MeshDecimator.h
|
include/MeshDecimator.h
|
||||||
include/MeshDecimator.inl
|
include/MeshDecimator.inl
|
||||||
include/MeshEdge.h
|
|
||||||
include/MeshFace.h
|
|
||||||
include/MeshVertex.h
|
|
||||||
include/PolyVoxForwardDeclarations.h
|
include/PolyVoxForwardDeclarations.h
|
||||||
include/Region.h
|
include/Region.h
|
||||||
include/SurfaceExtractor.h
|
include/SurfaceExtractor.h
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
Copyright (c) 2005-2009 David Williams
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __PolyVox_Mesh_H__
|
|
||||||
#define __PolyVox_Mesh_H__
|
|
||||||
|
|
||||||
#include "MeshEdge.h"
|
|
||||||
#include "MeshFace.h"
|
|
||||||
#include "MeshVertex.h"
|
|
||||||
|
|
||||||
#include "PolyVoxImpl/TypeDef.h"
|
|
||||||
|
|
||||||
#include <set>
|
|
||||||
|
|
||||||
namespace PolyVox
|
|
||||||
{
|
|
||||||
class POLYVOXCORE_API Mesh
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
void buildFromMesh(SurfaceMesh<PositionMaterialNormal>* pMesh);
|
|
||||||
void fillMesh(SurfaceMesh<PositionMaterialNormal>* pMesh);
|
|
||||||
void matchEdgePairs(void);
|
|
||||||
void computeEdgeCosts(void);
|
|
||||||
|
|
||||||
void removeEdge(MeshEdge* pMeshEdge);
|
|
||||||
|
|
||||||
void decimateAll(void);
|
|
||||||
bool decimateOne(void);
|
|
||||||
|
|
||||||
bool isSane(void);
|
|
||||||
|
|
||||||
std::set<MeshEdge*> m_edges;
|
|
||||||
std::set<MeshFace*> m_faces;
|
|
||||||
std::set<MeshVertex*> m_vertices;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,59 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
Copyright (c) 2005-2009 David Williams
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __PolyVox_MeshEdge_H__
|
|
||||||
#define __PolyVox_MeshEdge_H__
|
|
||||||
|
|
||||||
#include "PolyVoxForwardDeclarations.h"
|
|
||||||
|
|
||||||
#include "PolyVoxImpl/TypeDef.h"
|
|
||||||
|
|
||||||
namespace PolyVox
|
|
||||||
{
|
|
||||||
class POLYVOXCORE_API MeshEdge
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MeshEdge();
|
|
||||||
|
|
||||||
bool isSane(void);
|
|
||||||
|
|
||||||
void computeEdgeCost(Mesh* pParentMesh);
|
|
||||||
|
|
||||||
MeshEdge* m_pOtherEdge;
|
|
||||||
MeshEdge* m_pNextEdge;
|
|
||||||
MeshEdge* m_pPreviousEdge;
|
|
||||||
|
|
||||||
MeshVertex* m_pSrc;
|
|
||||||
MeshVertex* m_pDest;
|
|
||||||
|
|
||||||
MeshFace* m_pFace;
|
|
||||||
|
|
||||||
float m_fCost;
|
|
||||||
};
|
|
||||||
|
|
||||||
//FIXME - Rather than being global, these should just be used to sort within the set.
|
|
||||||
bool operator==(const MeshEdge& lhs, const MeshEdge& rhs);
|
|
||||||
bool operator<(const MeshEdge& lhs, const MeshEdge& rhs);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,47 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
Copyright (c) 2005-2009 David Williams
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __PolyVox_MeshFace_H__
|
|
||||||
#define __PolyVox_MeshFace_H__
|
|
||||||
|
|
||||||
#include "MeshEdge.h"
|
|
||||||
|
|
||||||
#include "PolyVoxImpl/TypeDef.h"
|
|
||||||
|
|
||||||
namespace PolyVox
|
|
||||||
{
|
|
||||||
class POLYVOXCORE_API MeshFace
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MeshFace();
|
|
||||||
bool isSane(void);
|
|
||||||
|
|
||||||
MeshEdge* m_pEdge;
|
|
||||||
|
|
||||||
Vector3DFloat getNormal(void);
|
|
||||||
bool collapseFlipsFace(MeshEdge* pEdgeToCollapse);
|
|
||||||
bool collapseFlipsFaceImpl(Vector3DFloat fixed0, Vector3DFloat fixed1, Vector3DFloat oldPos, Vector3DFloat newPos);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,50 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
Copyright (c) 2005-2009 David Williams
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#ifndef __PolyVox_MeshVertex_H__
|
|
||||||
#define __PolyVox_MeshVertex_H__
|
|
||||||
|
|
||||||
#include "PolyVoxForwardDeclarations.h"
|
|
||||||
#include "VertexTypes.h"
|
|
||||||
|
|
||||||
#include "PolyVoxImpl/TypeDef.h"
|
|
||||||
|
|
||||||
#include <set>
|
|
||||||
|
|
||||||
namespace PolyVox
|
|
||||||
{
|
|
||||||
class POLYVOXCORE_API MeshVertex
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
MeshVertex();
|
|
||||||
PositionMaterialNormal m_vertexData;
|
|
||||||
//MeshEdge* m_pEdge;
|
|
||||||
//std::set<MeshFace*> m_faces;
|
|
||||||
//std::set<MeshEdge*> m_edges; //Edges which have this vertex as the src
|
|
||||||
long int m_index; //Bit wasteful to store this the whle time, as it's only used when converting to Meshs?
|
|
||||||
|
|
||||||
bool isSane(void);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,446 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
Copyright (c) 2005-2009 David Williams
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#include "Mesh.h"
|
|
||||||
|
|
||||||
#include "SurfaceMesh.h"
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace PolyVox
|
|
||||||
{
|
|
||||||
void Mesh::buildFromMesh(SurfaceMesh<PositionMaterialNormal>* pMesh)
|
|
||||||
{
|
|
||||||
//First we copy the vertices across.
|
|
||||||
//We also keep track of where each vertex went
|
|
||||||
std::vector< std::set<MeshVertex*>::iterator > vertexMapper(pMesh->getNoOfVertices());
|
|
||||||
|
|
||||||
for(int ct = 0; ct < pMesh->getNoOfVertices(); ct++)
|
|
||||||
{
|
|
||||||
MeshVertex* pMeshVertex = new MeshVertex;
|
|
||||||
pMeshVertex->m_vertexData = pMesh->m_vecVertices[ct];
|
|
||||||
vertexMapper[ct] = m_vertices.insert(pMeshVertex).first;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Next, we add each triangle to the mesh
|
|
||||||
for(int triCt = 0; triCt < pMesh->getNoOfIndices() / 3; triCt++)
|
|
||||||
{
|
|
||||||
int index0 = pMesh->m_vecTriangleIndices[triCt * 3];
|
|
||||||
int index1 = pMesh->m_vecTriangleIndices[triCt * 3 + 1];
|
|
||||||
int index2 = pMesh->m_vecTriangleIndices[triCt * 3 + 2];
|
|
||||||
|
|
||||||
MeshVertex* meshVertex0 = *(vertexMapper[index0]);
|
|
||||||
MeshVertex* meshVertex1 = *(vertexMapper[index1]);
|
|
||||||
MeshVertex* meshVertex2 = *(vertexMapper[index2]);
|
|
||||||
|
|
||||||
MeshEdge* v0v1 = new MeshEdge;
|
|
||||||
v0v1->m_pSrc = meshVertex0;
|
|
||||||
v0v1->m_pDest = meshVertex1;
|
|
||||||
//meshVertex0->m_edges.insert(v0v1);
|
|
||||||
|
|
||||||
MeshEdge* v1v2 = new MeshEdge;
|
|
||||||
v1v2->m_pSrc = meshVertex1;
|
|
||||||
v1v2->m_pDest = meshVertex2;
|
|
||||||
//meshVertex1->m_edges.insert(v1v2);
|
|
||||||
|
|
||||||
MeshEdge* v2v0 = new MeshEdge;
|
|
||||||
v2v0->m_pSrc = meshVertex2;
|
|
||||||
v2v0->m_pDest = meshVertex0;
|
|
||||||
//meshVertex2->m_edges.insert(v2v0);
|
|
||||||
|
|
||||||
v0v1->m_pNextEdge = v1v2;
|
|
||||||
v1v2->m_pNextEdge = v2v0;
|
|
||||||
v2v0->m_pNextEdge = v0v1;
|
|
||||||
|
|
||||||
v0v1->m_pPreviousEdge = v2v0;
|
|
||||||
v1v2->m_pPreviousEdge = v0v1;
|
|
||||||
v2v0->m_pPreviousEdge = v1v2;
|
|
||||||
|
|
||||||
v0v1->m_pOtherEdge = 0;
|
|
||||||
v1v2->m_pOtherEdge = 0;
|
|
||||||
v2v0->m_pOtherEdge = 0;
|
|
||||||
|
|
||||||
m_edges.insert(v0v1);
|
|
||||||
m_edges.insert(v1v2);
|
|
||||||
m_edges.insert(v2v0);
|
|
||||||
|
|
||||||
//Create the face
|
|
||||||
MeshFace* meshFace = new MeshFace;
|
|
||||||
|
|
||||||
v0v1->m_pFace = meshFace;
|
|
||||||
v1v2->m_pFace = meshFace;
|
|
||||||
v2v0->m_pFace = meshFace;
|
|
||||||
|
|
||||||
meshFace->m_pEdge = v0v1; //Just use the first edge
|
|
||||||
|
|
||||||
m_faces.insert(meshFace);
|
|
||||||
|
|
||||||
//The the vertices they are used by the face
|
|
||||||
//meshVertex0->m_faces.insert(meshFace);
|
|
||||||
//meshVertex1->m_faces.insert(meshFace);
|
|
||||||
//meshVertex2->m_faces.insert(meshFace);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Loop over the edges and try to match up any pairs.
|
|
||||||
/*for(std::set<MeshEdge*>::iterator edgeIter = m_edges.begin(); edgeIter != m_edges.end(); edgeIter++)
|
|
||||||
{
|
|
||||||
MeshEdge* pMeshEdge = *edgeIter;
|
|
||||||
|
|
||||||
if(pMeshEdge->m_pOtherEdge == 0)
|
|
||||||
{
|
|
||||||
//Let's see if we can find the other edge somewhere.
|
|
||||||
//Create an example of what we are looking for...
|
|
||||||
MeshEdge otherEdgeExample;
|
|
||||||
otherEdgeExample.m_pSrc = pMeshEdge->m_pDest;
|
|
||||||
otherEdgeExample.m_pDest = pMeshEdge->m_pSrc;
|
|
||||||
|
|
||||||
m_edges.find(
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
/*int counter = 0;
|
|
||||||
|
|
||||||
//Lastly, we loop over the edges and determine all those which should be adjacent
|
|
||||||
for(std::set<MeshEdge*>::iterator outerIter = m_edges.begin(); outerIter != m_edges.end(); outerIter++)
|
|
||||||
{
|
|
||||||
std::cout << counter++ << std::endl;
|
|
||||||
|
|
||||||
for(std::set<MeshEdge*>::iterator innerIter = m_edges.begin(); innerIter != m_edges.end(); innerIter++)
|
|
||||||
{
|
|
||||||
MeshEdge* edge0 = *outerIter;
|
|
||||||
MeshEdge* edge1 = *innerIter;
|
|
||||||
|
|
||||||
if((edge0->m_pSrc == edge1->m_pDest) && (edge0->m_pDest == edge1->m_pSrc))
|
|
||||||
{
|
|
||||||
edge0->m_pOtherEdge = edge1;
|
|
||||||
edge1->m_pOtherEdge = edge0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//Match up the edge pains
|
|
||||||
matchEdgePairs();
|
|
||||||
|
|
||||||
//Compute the edge costs
|
|
||||||
computeEdgeCosts();
|
|
||||||
|
|
||||||
//Check sanity
|
|
||||||
isSane();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::matchEdgePairs(void)
|
|
||||||
{
|
|
||||||
std::set<MeshEdge*> matchedEdges;
|
|
||||||
while(m_edges.empty() == false)
|
|
||||||
{
|
|
||||||
std::set<MeshEdge*>::iterator firstEdgeIter = m_edges.begin();
|
|
||||||
MeshEdge* firstEdgePtr = *firstEdgeIter;
|
|
||||||
m_edges.erase(firstEdgeIter);
|
|
||||||
matchedEdges.insert(firstEdgePtr);
|
|
||||||
|
|
||||||
//Attempt to find the opposite edge
|
|
||||||
for(std::set<MeshEdge*>::iterator edgeIter = m_edges.begin(); edgeIter != m_edges.end(); edgeIter++)
|
|
||||||
{
|
|
||||||
MeshEdge* candidate = *edgeIter;
|
|
||||||
if((firstEdgePtr->m_pSrc == candidate->m_pDest) && (firstEdgePtr->m_pDest == candidate->m_pSrc))
|
|
||||||
{
|
|
||||||
m_edges.erase(edgeIter);
|
|
||||||
matchedEdges.insert(candidate);
|
|
||||||
|
|
||||||
firstEdgePtr->m_pOtherEdge = candidate;
|
|
||||||
candidate->m_pOtherEdge = firstEdgePtr;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_edges = matchedEdges;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::computeEdgeCosts(void)
|
|
||||||
{
|
|
||||||
for(std::set<MeshEdge*>::iterator edgeIter = m_edges.begin(); edgeIter != m_edges.end(); edgeIter++)
|
|
||||||
{
|
|
||||||
(*edgeIter)->computeEdgeCost(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::fillMesh(SurfaceMesh<PositionMaterialNormal>* pMesh)
|
|
||||||
{
|
|
||||||
pMesh->clear();
|
|
||||||
|
|
||||||
for(std::set<MeshVertex*>::iterator vertItor = m_vertices.begin(); vertItor != m_vertices.end(); vertItor++)
|
|
||||||
{
|
|
||||||
MeshVertex* meshVertex = *vertItor;
|
|
||||||
meshVertex->m_index = pMesh->addVertex(meshVertex->m_vertexData);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(std::set<MeshFace*>::iterator faceItor = m_faces.begin(); faceItor != m_faces.end(); faceItor++)
|
|
||||||
{
|
|
||||||
MeshFace* meshFace = *faceItor;
|
|
||||||
MeshVertex* v0 = meshFace->m_pEdge->m_pSrc;
|
|
||||||
MeshVertex* v1 = meshFace->m_pEdge->m_pNextEdge->m_pSrc;
|
|
||||||
MeshVertex* v2 = meshFace->m_pEdge->m_pNextEdge->m_pNextEdge->m_pSrc;
|
|
||||||
|
|
||||||
pMesh->addTriangle(v0->m_index, v1->m_index, v2->m_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
pMesh->m_vecLodRecords.clear();
|
|
||||||
LodRecord lodRecord;
|
|
||||||
lodRecord.beginIndex = 0;
|
|
||||||
lodRecord.endIndex = pMesh->getNoOfIndices();
|
|
||||||
pMesh->m_vecLodRecords.push_back(lodRecord);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::removeEdge(MeshEdge* pMeshEdge)
|
|
||||||
{
|
|
||||||
//Get the src and dest vertices
|
|
||||||
MeshVertex* pSrc = pMeshEdge->m_pSrc;
|
|
||||||
MeshVertex* pDest = pMeshEdge->m_pDest;
|
|
||||||
|
|
||||||
//Get the other half of the edge
|
|
||||||
MeshEdge* pOtherEdge = pMeshEdge->m_pOtherEdge;
|
|
||||||
|
|
||||||
//Get the faces
|
|
||||||
MeshFace* pMeshFace = pMeshEdge->m_pFace;
|
|
||||||
MeshFace* pOtherFace = 0;
|
|
||||||
if(pOtherEdge != 0)
|
|
||||||
{
|
|
||||||
pOtherFace = pOtherEdge->m_pFace;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Remove the faces (the edges keep pointers to the faces, but those edges will be deleted soon anyway...)
|
|
||||||
m_faces.erase(pMeshFace);
|
|
||||||
delete pMeshFace;
|
|
||||||
pMeshFace = 0;
|
|
||||||
|
|
||||||
if(pOtherFace)
|
|
||||||
{
|
|
||||||
m_faces.erase(pOtherFace);
|
|
||||||
delete pOtherFace;
|
|
||||||
pOtherFace = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Erase the edges
|
|
||||||
m_edges.erase(pMeshEdge);
|
|
||||||
m_edges.erase(pMeshEdge->m_pNextEdge);
|
|
||||||
m_edges.erase(pMeshEdge->m_pPreviousEdge);
|
|
||||||
|
|
||||||
/*pMeshEdge->m_pSrc->m_edges.erase(pMeshEdge);
|
|
||||||
pMeshEdge->m_pNextEdge->m_pSrc->m_edges.erase(pMeshEdge->m_pNextEdge);
|
|
||||||
pMeshEdge->m_pPreviousEdge->m_pSrc->m_edges.erase(pMeshEdge->m_pPreviousEdge);*/
|
|
||||||
|
|
||||||
delete pMeshEdge->m_pNextEdge;
|
|
||||||
pMeshEdge->m_pNextEdge = 0;
|
|
||||||
delete pMeshEdge->m_pPreviousEdge;
|
|
||||||
pMeshEdge->m_pPreviousEdge = 0;
|
|
||||||
delete pMeshEdge;
|
|
||||||
//pMeshEdge = 0;
|
|
||||||
|
|
||||||
|
|
||||||
if(pOtherEdge)
|
|
||||||
{
|
|
||||||
m_edges.erase(pOtherEdge);
|
|
||||||
m_edges.erase(pOtherEdge->m_pNextEdge);
|
|
||||||
m_edges.erase(pOtherEdge->m_pPreviousEdge);
|
|
||||||
|
|
||||||
/*pOtherEdge->m_pSrc->m_edges.erase(pOtherEdge);
|
|
||||||
pOtherEdge->m_pNextEdge->m_pSrc->m_edges.erase(pOtherEdge->m_pNextEdge);
|
|
||||||
pOtherEdge->m_pPreviousEdge->m_pSrc->m_edges.erase(pOtherEdge->m_pPreviousEdge);*/
|
|
||||||
|
|
||||||
delete pOtherEdge->m_pNextEdge;
|
|
||||||
pOtherEdge->m_pNextEdge = 0;
|
|
||||||
delete pOtherEdge->m_pPreviousEdge;
|
|
||||||
pOtherEdge->m_pPreviousEdge = 0;
|
|
||||||
delete pOtherEdge;
|
|
||||||
//pOtherEdge = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Find the affected edges
|
|
||||||
/*std::set<MeshEdge*> affectedEdges = edgesStartingatEitherVertex;
|
|
||||||
for(std::set<MeshEdge*>::iterator edgeIter = edgesStartingatEitherVertex.begin(); edgeIter != edgesStartingatEitherVertex.end(); edgeIter++)
|
|
||||||
{
|
|
||||||
affectedEdges.insert((*edgeIter)->m_pNextEdge);
|
|
||||||
affectedEdges.insert((*edgeIter)->m_pPreviousEdge);
|
|
||||||
//if((*edgeIter)->m_pOtherEdge != 0)
|
|
||||||
//{
|
|
||||||
// affectedEdges.insert((*edgeIter)->m_pOtherEdge);
|
|
||||||
//}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//Update the source and destinations
|
|
||||||
for(std::set<MeshEdge*>::iterator edgeIter = m_edges.begin(); edgeIter != m_edges.end(); edgeIter++)
|
|
||||||
{
|
|
||||||
MeshEdge* pEdge = *edgeIter;
|
|
||||||
if(pEdge->m_pSrc == pSrc)
|
|
||||||
{
|
|
||||||
pEdge->m_pSrc = pDest;
|
|
||||||
}
|
|
||||||
if(pEdge->m_pDest == pSrc)
|
|
||||||
{
|
|
||||||
pEdge->m_pDest = pDest;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*for(std::set<MeshVertex*>::iterator vertexIter = m_vertices.begin(); vertexIter != m_vertices.end(); vertexIter++)
|
|
||||||
{
|
|
||||||
(*vertexIter)->m_edges.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
for(std::set<MeshEdge*>::iterator edgeIter = m_edges.begin(); edgeIter != m_edges.end(); edgeIter++)
|
|
||||||
{
|
|
||||||
MeshEdge* pEdge = *edgeIter;
|
|
||||||
pEdge->m_pSrc->m_edges.insert(pEdge);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
/*for(std::set<MeshEdge*>::iterator edgeIter = affectedEdges.begin(); edgeIter != affectedEdges.end(); edgeIter++)
|
|
||||||
{
|
|
||||||
MeshEdge* pEdge = *edgeIter;
|
|
||||||
if(pEdge->m_pSrc == pSrc)
|
|
||||||
{
|
|
||||||
pEdge->m_pSrc = pDest;
|
|
||||||
}
|
|
||||||
if(pEdge->m_pDest == pSrc)
|
|
||||||
{
|
|
||||||
pEdge->m_pDest = pDest;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//Deal with the vertices
|
|
||||||
/*pSrc->m_edges.erase(pMeshEdge);
|
|
||||||
if(pOtherEdge)
|
|
||||||
{
|
|
||||||
pDest->m_edges.erase(pOtherEdge);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//Find the edges starting at either vertex
|
|
||||||
/*std::set<MeshEdge*> edgesStartingatEitherVertex;
|
|
||||||
std::set_union(pSrc->m_edges.begin(), pSrc->m_edges.end(),
|
|
||||||
pDest->m_edges.begin(), pDest->m_edges.end(),
|
|
||||||
std::inserter(edgesStartingatEitherVertex, edgesStartingatEitherVertex.begin()));*/
|
|
||||||
|
|
||||||
//Remove the old vertex
|
|
||||||
//pDest->m_edges = edgesStartingatEitherVertex;
|
|
||||||
m_vertices.erase(pSrc);
|
|
||||||
delete pSrc; //Don't set to 0 yet as we will use the value
|
|
||||||
|
|
||||||
//Update any pairings
|
|
||||||
matchEdgePairs();
|
|
||||||
/*for(std::set<MeshEdge*>::iterator outerIter = affectedEdges.begin(); outerIter != affectedEdges.end(); outerIter++)
|
|
||||||
{
|
|
||||||
for(std::set<MeshEdge*>::iterator innerIter = affectedEdges.begin(); innerIter != affectedEdges.end(); innerIter++)
|
|
||||||
{
|
|
||||||
MeshEdge* edge0 = *outerIter;
|
|
||||||
MeshEdge* edge1 = *innerIter;
|
|
||||||
|
|
||||||
if((edge0->m_pSrc == edge1->m_pDest) && (edge0->m_pDest == edge1->m_pSrc))
|
|
||||||
{
|
|
||||||
edge0->m_pOtherEdge = edge1;
|
|
||||||
edge1->m_pOtherEdge = edge0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//Recompute the affected edge costs
|
|
||||||
computeEdgeCosts();
|
|
||||||
/*for(std::set<MeshEdge*>::iterator edgeIter = affectedEdges.begin(); edgeIter != affectedEdges.end(); edgeIter++)
|
|
||||||
{
|
|
||||||
(*edgeIter)->computeEdgeCost();
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::decimateAll(void)
|
|
||||||
{
|
|
||||||
for(int ct = 0; ct < 100; ct++)
|
|
||||||
{
|
|
||||||
std::cout << ct << std::endl;
|
|
||||||
decimateOne();
|
|
||||||
//isSane();
|
|
||||||
}
|
|
||||||
/*int ct = 0;
|
|
||||||
while(decimateOne())
|
|
||||||
{
|
|
||||||
std::cout << ct++ << std::endl;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//decimateOne();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Mesh::decimateOne(void)
|
|
||||||
{
|
|
||||||
for(std::set<MeshEdge*>::iterator edgeIter = m_edges.begin(); edgeIter != m_edges.end(); edgeIter++)
|
|
||||||
{
|
|
||||||
/*for(int ct = 0; ct < 30; ct++)
|
|
||||||
{
|
|
||||||
edgeIter++;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
MeshEdge* pMeshEdge = *edgeIter;
|
|
||||||
if(pMeshEdge->m_fCost < 1.0)
|
|
||||||
{
|
|
||||||
removeEdge(pMeshEdge);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Mesh::isSane(void)
|
|
||||||
{
|
|
||||||
for(std::set<MeshVertex*>::iterator vertexIter = m_vertices.begin(); vertexIter != m_vertices.end(); vertexIter++)
|
|
||||||
{
|
|
||||||
//This would be eaiser if we just propergated exceptions?
|
|
||||||
if((*vertexIter)->isSane() == false)
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Problem found in vertex set" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(std::set<MeshFace*>::iterator faceIter = m_faces.begin(); faceIter != m_faces.end(); faceIter++)
|
|
||||||
{
|
|
||||||
//This would be eaiser if we just propergated exceptions?
|
|
||||||
if((*faceIter)->isSane() == false)
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Problem found in face set" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(std::set<MeshEdge*>::iterator edgeIter = m_edges.begin(); edgeIter != m_edges.end(); edgeIter++)
|
|
||||||
{
|
|
||||||
//This would be eaiser if we just propergated exceptions?
|
|
||||||
if((*edgeIter)->isSane() == false)
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Problem found in edge set" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << "SANITY CHECK SUCCESS" << std::endl;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,156 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
Copyright (c) 2005-2009 David Williams
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#include "MeshEdge.h"
|
|
||||||
|
|
||||||
#include "Mesh.h"
|
|
||||||
#include "MeshFace.h"
|
|
||||||
#include "MeshVertex.h"
|
|
||||||
#include "VertexTypes.h"
|
|
||||||
|
|
||||||
#include <set>
|
|
||||||
|
|
||||||
namespace PolyVox
|
|
||||||
{
|
|
||||||
|
|
||||||
bool operator==(const MeshEdge& lhs, const MeshEdge& rhs)
|
|
||||||
{
|
|
||||||
return lhs.m_pSrc == rhs.m_pSrc && lhs.m_pDest == rhs.m_pDest;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator<(const MeshEdge& lhs, const MeshEdge& rhs)
|
|
||||||
{
|
|
||||||
if(lhs == rhs)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (lhs.m_pSrc < rhs.m_pSrc)
|
|
||||||
return true;
|
|
||||||
if (rhs.m_pSrc < lhs.m_pSrc)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (lhs.m_pDest < rhs.m_pDest)
|
|
||||||
return true;
|
|
||||||
if (rhs.m_pDest < lhs.m_pDest)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
MeshEdge::MeshEdge()
|
|
||||||
{
|
|
||||||
m_pOtherEdge = 0;
|
|
||||||
m_pNextEdge = 0;
|
|
||||||
m_pPreviousEdge = 0;
|
|
||||||
|
|
||||||
m_pSrc = 0;
|
|
||||||
m_pDest = 0;
|
|
||||||
|
|
||||||
m_pFace = 0;
|
|
||||||
|
|
||||||
m_fCost = 1000000.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MeshEdge::computeEdgeCost(Mesh* pParentMesh)
|
|
||||||
{
|
|
||||||
PositionMaterialNormal v0Data = m_pSrc->m_vertexData;
|
|
||||||
PositionMaterialNormal v1Data = m_pDest->m_vertexData;
|
|
||||||
|
|
||||||
m_fCost = 1000000.0f;
|
|
||||||
|
|
||||||
//For now, don't collapse vertices on material edges...
|
|
||||||
if(v0Data.isOnMaterialEdge() || v1Data.isOnMaterialEdge())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//...or those on geometry (region) edges.
|
|
||||||
if(v0Data.isOnGeometryEdge() || v1Data.isOnGeometryEdge())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check the normals are within the threshold.
|
|
||||||
if(v0Data.getNormal().dot(v1Data.getNormal()) < 0.999)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Test for face flips
|
|
||||||
for(std::set<MeshFace*>::iterator faceIter = pParentMesh->m_faces.begin(); faceIter != pParentMesh->m_faces.end(); faceIter++)
|
|
||||||
{
|
|
||||||
if((*faceIter)->collapseFlipsFace(this))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_fCost = 0.0f;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MeshEdge::isSane(void)
|
|
||||||
{
|
|
||||||
if(m_pSrc == 0)
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Edge has no source vertex" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(m_pDest == 0)
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Edge has no destination vertex" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(m_pFace == 0)
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Edge has no face attached" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Check loops
|
|
||||||
if(this != m_pNextEdge->m_pNextEdge->m_pNextEdge)
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Next edge loop is broken" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(this != m_pPreviousEdge->m_pPreviousEdge->m_pPreviousEdge)
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Previous edge loop is broken" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Make sure the other edge points back here
|
|
||||||
if(m_pOtherEdge != 0)
|
|
||||||
{
|
|
||||||
if(this != m_pOtherEdge->m_pOtherEdge)
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Other edge exists but does not point back here." << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,112 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
Copyright (c) 2005-2009 David Williams
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#include "MeshFace.h"
|
|
||||||
|
|
||||||
#include "MeshEdge.h"
|
|
||||||
#include "MeshVertex.h"
|
|
||||||
|
|
||||||
#include "Vector.h"
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
namespace PolyVox
|
|
||||||
{
|
|
||||||
MeshFace::MeshFace()
|
|
||||||
{
|
|
||||||
m_pEdge = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MeshFace::isSane(void)
|
|
||||||
{
|
|
||||||
if(m_pEdge == 0)
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Face has no edge attached" << std::endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector3DFloat MeshFace::getNormal(void)
|
|
||||||
{
|
|
||||||
//Find the three vertices
|
|
||||||
Vector3DFloat pV0 = m_pEdge->m_pSrc->m_vertexData.getPosition();
|
|
||||||
Vector3DFloat pV1 = m_pEdge->m_pNextEdge->m_pSrc->m_vertexData.getPosition();
|
|
||||||
Vector3DFloat pV2 = m_pEdge->m_pNextEdge->m_pNextEdge->m_pSrc->m_vertexData.getPosition();
|
|
||||||
|
|
||||||
Vector3DFloat crossProduct = (pV1 - pV0).cross(pV2 - pV0);
|
|
||||||
|
|
||||||
assert(crossProduct.length() > 0.001);
|
|
||||||
|
|
||||||
crossProduct.normalise();
|
|
||||||
|
|
||||||
return crossProduct;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MeshFace::collapseFlipsFace(MeshEdge* pEdgeToCollapse)
|
|
||||||
{
|
|
||||||
MeshVertex* pSrc = pEdgeToCollapse->m_pSrc;
|
|
||||||
MeshVertex* pDest = pEdgeToCollapse->m_pDest;
|
|
||||||
|
|
||||||
MeshVertex* pV0 = m_pEdge->m_pSrc;
|
|
||||||
MeshVertex* pV1 = m_pEdge->m_pNextEdge->m_pSrc;
|
|
||||||
MeshVertex* pV2 = m_pEdge->m_pNextEdge->m_pNextEdge->m_pSrc;
|
|
||||||
|
|
||||||
if(pSrc == pV0)
|
|
||||||
{
|
|
||||||
return collapseFlipsFaceImpl(pV1->m_vertexData.getPosition(), pV2->m_vertexData.getPosition(), pSrc->m_vertexData.getPosition(), pDest->m_vertexData.getPosition());
|
|
||||||
}
|
|
||||||
if(pSrc == pV1)
|
|
||||||
{
|
|
||||||
return collapseFlipsFaceImpl(pV0->m_vertexData.getPosition(), pV2->m_vertexData.getPosition(), pSrc->m_vertexData.getPosition(), pDest->m_vertexData.getPosition());
|
|
||||||
}
|
|
||||||
if(pSrc == pV2)
|
|
||||||
{
|
|
||||||
return collapseFlipsFaceImpl(pV0->m_vertexData.getPosition(), pV1->m_vertexData.getPosition(), pSrc->m_vertexData.getPosition(), pDest->m_vertexData.getPosition());
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MeshFace::collapseFlipsFaceImpl(Vector3DFloat fixed0, Vector3DFloat fixed1, Vector3DFloat oldPos, Vector3DFloat newPos)
|
|
||||||
{
|
|
||||||
Vector3DFloat oldCrossProduct = (fixed0 - oldPos).cross(fixed1 - oldPos);
|
|
||||||
Vector3DFloat newCrossProduct = (fixed0 - newPos).cross(fixed1 - newPos);
|
|
||||||
|
|
||||||
if(oldCrossProduct.length() < 0.001f)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(newCrossProduct.length() < 0.001f)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
oldCrossProduct.normalise();
|
|
||||||
newCrossProduct.normalise();
|
|
||||||
|
|
||||||
return oldCrossProduct.dot(newCrossProduct) < 0.999f;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
Copyright (c) 2005-2009 David Williams
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
|
|
||||||
3. This notice may not be removed or altered from any source
|
|
||||||
distribution.
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
#include "MeshVertex.h"
|
|
||||||
|
|
||||||
namespace PolyVox
|
|
||||||
{
|
|
||||||
MeshVertex::MeshVertex()
|
|
||||||
{
|
|
||||||
m_index = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MeshVertex::isSane(void)
|
|
||||||
{
|
|
||||||
/*if(m_edges.empty())
|
|
||||||
{
|
|
||||||
std::cout << "SANITY CHECK FAIL: Vertex has no edges attached" << std::endl;
|
|
||||||
return false;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user