===Tools===

Adding back some code to booleans that got lost in the Orange merge.

I've also added back the code which checked that meshes were solid
("manifolds") but have the actual check in
intern/boolop/intern/BOP_Interface.cpp, since from my testing it was
not causing crashes or hangs.  It *can* give odd results depending on
what you're trying to intersect, but seems useful.  Additionally, since
existing bugs in the current code can create non-solid/non-manifold
meshes, seems hypocritical to create a mesh that can't later be used in
another boolean operation.
This commit is contained in:
Ken Hughes
2006-06-10 15:47:19 +00:00
parent 3d47bb56fa
commit 7fcc5800ae
4 changed files with 33 additions and 5 deletions

View File

@@ -121,6 +121,12 @@ BoolOpState BOP_performBooleanOperation(BoolOpType opType,
// Add B-mesh into C-mesh
BOP_addMesh(&meshC, &meshBFacesId, &materials, obBProps, obBFaces, obBVertices, invertMeshB);
// for now, allow operations on non-manifold (non-solid) meshes
#if 0
if (!meshC.isClosedMesh())
return BOP_NO_SOLID;
#endif
// Perform the intersection boolean operation.
BoolOpState result = BOP_intersectionBoolOp(&meshC, &meshAFacesId, &meshBFacesId,
invertMeshA, invertMeshB);

View File

@@ -555,6 +555,23 @@ BOP_Index BOP_Mesh::replaceVertexIndex(BOP_Index oldIndex, BOP_Index newIndex)
return newIndex;
}
bool BOP_Mesh::isClosedMesh()
{
for(unsigned int i=0; i<m_edges.size(); i++) {
BOP_Edge *edge = m_edges[i];
BOP_Indexs faces = edge->getFaces();
unsigned int count = 0;
const BOP_IT_Indexs facesEnd = faces.end();
for(BOP_IT_Indexs it = faces.begin();it!=facesEnd;it++) {
if (m_faces[*it]->getTAG()!=BROKEN)
count++;
}
if ((count%2)!=0) return false;
}
return true;
}
/** ***************************************************************************

View File

@@ -83,7 +83,8 @@ public:
unsigned int getNumVertexs(BOP_TAG tag);
unsigned int getNumFaces(BOP_TAG tag);
BOP_Index replaceVertexIndex(BOP_Index oldIndex, BOP_Index newIndex);
bool BOP_Mesh::isClosedMesh();
// Debug functions
void print();
void printFormat();

View File

@@ -118,8 +118,6 @@ CSG_PerformBooleanOperation(
BSP_MeshInfo * mesh_info = static_cast<BSP_MeshInfo *>(operation->CSG_info);
if (mesh_info == NULL) return 0;
bool success = 1;
obAFaces.Reset(obAFaces.it);
obBFaces.Reset(obBFaces.it);
obAVertices.Reset(obAVertices.it);
@@ -139,8 +137,9 @@ CSG_PerformBooleanOperation(
break;
}
BoolOpState boolOpResult;
try {
BOP_performBooleanOperation( boolType,
boolOpResult = BOP_performBooleanOperation( boolType,
mesh_info->output_descriptor,
(BSP_CSGMesh**) &(mesh_info->output_mesh),
mesh_info->obB_descriptor,
@@ -155,7 +154,12 @@ CSG_PerformBooleanOperation(
return 0;
}
return success;
switch (boolOpResult) {
case BOP_OK: return 1;
case BOP_NO_SOLID: return -2;
case BOP_ERROR: return 0;
default: return 1;
}
}
int