Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/boolop/intern/BOP_Interface.cpp6
-rw-r--r--intern/boolop/intern/BOP_Mesh.cpp17
-rw-r--r--intern/boolop/intern/BOP_Mesh.h3
-rwxr-xr-xintern/bsp/intern/CSG_BooleanOps.cpp12
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