[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44107] trunk/blender/intern/boolop: Carve fixes and optimizations:
Sergey Sharybin
sergey.vfx at gmail.com
Tue Feb 14 14:24:12 CET 2012
Revision: 44107
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44107
Author: nazgul
Date: 2012-02-14 13:24:04 +0000 (Tue, 14 Feb 2012)
Log Message:
-----------
Carve fixes and optimizations:
- Fixed memory lead in Carve_getIntersectedOperandMeshes
- Union manifolds only if they intersects second operand, leave manifolds
which doesn't intersect second operand as-is.
Modified Paths:
--------------
trunk/blender/intern/boolop/CMakeLists.txt
trunk/blender/intern/boolop/intern/BOP_CarveInterface.cpp
Modified: trunk/blender/intern/boolop/CMakeLists.txt
===================================================================
--- trunk/blender/intern/boolop/CMakeLists.txt 2012-02-14 12:24:17 UTC (rev 44106)
+++ trunk/blender/intern/boolop/CMakeLists.txt 2012-02-14 13:24:04 UTC (rev 44107)
@@ -23,6 +23,8 @@
#
# ***** END GPL LICENSE BLOCK *****
+remove_strict_flags()
+
set(INC
.
extern
Modified: trunk/blender/intern/boolop/intern/BOP_CarveInterface.cpp
===================================================================
--- trunk/blender/intern/boolop/intern/BOP_CarveInterface.cpp 2012-02-14 12:24:17 UTC (rev 44106)
+++ trunk/blender/intern/boolop/intern/BOP_CarveInterface.cpp 2012-02-14 13:24:04 UTC (rev 44107)
@@ -43,9 +43,6 @@
using namespace carve::geom;
typedef unsigned int uint;
-static void Carve_unionIntersections(MeshSet<3> **left_r, MeshSet<3> **right_r,
- carve::interpolate::FaceAttr<uint> &oface_num);
-
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)<(y)?(x):(y))
@@ -210,30 +207,35 @@
while(it != meshes.end()) {
MeshSet<3>::mesh_t *mesh = *it;
- bool isIntersect = false;
+ bool isAdded = false;
RTreeNode<3, Face<3> *> *rtree = RTreeNode<3, Face<3> *>::construct_STR(mesh->faces.begin(), mesh->faces.end(), 4, 4);
- std::vector<MeshSet<3>::mesh_t*>::iterator operand_it = operandMeshes.begin();
- std::vector<RTreeNode<3, Face<3> *> *>::iterator tree_it = meshRTree.begin();
- for(; operand_it!=operandMeshes.end(); operand_it++, tree_it++) {
- RTreeNode<3, Face<3> *> *operandRTree = *tree_it;
+ if (rtree->bbox.intersects(otherAABB)) {
+ bool isIntersect = false;
- if(operandRTree->bbox.intersects(otherAABB)) {
+ std::vector<MeshSet<3>::mesh_t*>::iterator operand_it = operandMeshes.begin();
+ std::vector<RTreeNode<3, Face<3> *> *>::iterator tree_it = meshRTree.begin();
+ for(; operand_it!=operandMeshes.end(); operand_it++, tree_it++) {
+ RTreeNode<3, Face<3> *> *operandRTree = *tree_it;
+
if(Carve_checkMeshSetInterseciton(rtree, operandRTree)) {
isIntersect = true;
break;
}
}
- }
- if(!isIntersect) {
- operandMeshes.push_back(mesh);
- meshRTree.push_back(rtree);
+ if(!isIntersect) {
+ operandMeshes.push_back(mesh);
+ meshRTree.push_back(rtree);
- it = meshes.erase(it);
+ it = meshes.erase(it);
+ isAdded = true;
+ }
}
- else {
+
+ if (!isAdded) {
+ delete rtree;
it++;
}
}
@@ -249,6 +251,9 @@
std::vector<MeshSet<3>::mesh_t*> operandMeshes;
Carve_getIntersectedOperandMeshes(meshes, otherAABB, operandMeshes);
+ if (operandMeshes.size() == 0)
+ return NULL;
+
return Carve_meshSetFromMeshes(operandMeshes);
}
@@ -269,9 +274,19 @@
MeshSet<3> *left = Carve_getIntersectedOperand(orig_meshes, otherAABB);
+ if (!left) {
+ /* no maniforlds which intersects another object at all */
+ return poly;
+ }
+
while(orig_meshes.size()) {
MeshSet<3> *right = Carve_getIntersectedOperand(orig_meshes, otherAABB);
+ if (!right) {
+ /* no more intersecting manifolds which intersects other object */
+ break;
+ }
+
try {
if(left->meshes.size()==0) {
delete left;
@@ -279,10 +294,6 @@
left = right;
}
else {
- /* there might be intersections between manifolds of one operand and another mesh which isn't
- * taking into accound in Carve_getIntersectedOperand because of optimization purposes */
- Carve_unionIntersections(&left, &right, oface_num);
-
MeshSet<3> *result = csg.compute(left, right, carve::csg::CSG::UNION, NULL, carve::csg::CSG::CLASSIFY_EDGE);
delete left;
@@ -309,6 +320,15 @@
}
}
+ /* append all meshes which doesn't have intersection with another operand as-is */
+ if (orig_meshes.size()) {
+ MeshSet<3> *result = Carve_meshSetFromTwoMeshes(left->meshes, orig_meshes);
+
+ delete left;
+
+ return result;
+ }
+
return left;
}
More information about the Bf-blender-cvs
mailing list