From 7fcc5800aef8f6355730ef27eb70f49f0480a42a Mon Sep 17 00:00:00 2001 From: Ken Hughes Date: Sat, 10 Jun 2006 15:47:19 +0000 Subject: [PATCH] ===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. --- intern/boolop/intern/BOP_Interface.cpp | 6 ++++++ intern/boolop/intern/BOP_Mesh.cpp | 17 +++++++++++++++++ intern/boolop/intern/BOP_Mesh.h | 3 ++- intern/bsp/intern/CSG_BooleanOps.cpp | 12 ++++++++---- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/intern/boolop/intern/BOP_Interface.cpp b/intern/boolop/intern/BOP_Interface.cpp index 02945340d55..518ea69982c 100644 --- a/intern/boolop/intern/BOP_Interface.cpp +++ b/intern/boolop/intern/BOP_Interface.cpp @@ -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); diff --git a/intern/boolop/intern/BOP_Mesh.cpp b/intern/boolop/intern/BOP_Mesh.cpp index 595ccae6b93..6afd1caabaf 100644 --- a/intern/boolop/intern/BOP_Mesh.cpp +++ b/intern/boolop/intern/BOP_Mesh.cpp @@ -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; igetFaces(); + 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; +} /** *************************************************************************** diff --git a/intern/boolop/intern/BOP_Mesh.h b/intern/boolop/intern/BOP_Mesh.h index 644f9ab691c..d4403facde7 100644 --- a/intern/boolop/intern/BOP_Mesh.h +++ b/intern/boolop/intern/BOP_Mesh.h @@ -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(); diff --git a/intern/bsp/intern/CSG_BooleanOps.cpp b/intern/bsp/intern/CSG_BooleanOps.cpp index a0b4dc0078d..1a3a149adeb 100755 --- a/intern/bsp/intern/CSG_BooleanOps.cpp +++ b/intern/bsp/intern/CSG_BooleanOps.cpp @@ -118,8 +118,6 @@ CSG_PerformBooleanOperation( BSP_MeshInfo * mesh_info = static_cast(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