diff options
-rw-r--r-- | intern/boolop/intern/BOP_Interface.cpp | 6 | ||||
-rw-r--r-- | intern/boolop/intern/BOP_Mesh.cpp | 17 | ||||
-rw-r--r-- | intern/boolop/intern/BOP_Mesh.h | 3 | ||||
-rwxr-xr-x | 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; 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; +} /** *************************************************************************** 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<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 |