[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43741] trunk/blender/intern/boolop/intern /BOP_CarveInterface.cpp: Fixed some possible issues and access non-initialized variable in Carve BOP interface .
Sergey Sharybin
sergey.vfx at gmail.com
Fri Jan 27 09:17:54 CET 2012
Revision: 43741
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43741
Author: nazgul
Date: 2012-01-27 08:17:53 +0000 (Fri, 27 Jan 2012)
Log Message:
-----------
Fixed some possible issues and access non-initialized variable in Carve BOP interface.
Discovered when was investigating some crashes caused by Carve's triangulator.
Modified Paths:
--------------
trunk/blender/intern/boolop/intern/BOP_CarveInterface.cpp
Modified: trunk/blender/intern/boolop/intern/BOP_CarveInterface.cpp
===================================================================
--- trunk/blender/intern/boolop/intern/BOP_CarveInterface.cpp 2012-01-27 08:15:30 UTC (rev 43740)
+++ trunk/blender/intern/boolop/intern/BOP_CarveInterface.cpp 2012-01-27 08:17:53 UTC (rev 43741)
@@ -150,12 +150,19 @@
MeshSet<3> *right = Carve_getIntersectedOperand(orig_meshes, precomputedAABB, otherAABB);
try {
- MeshSet<3> *result = csg.compute(left, right, carve::csg::CSG::UNION, NULL, carve::csg::CSG::CLASSIFY_EDGE);
+ if(left->meshes.size()==0) {
+ delete left;
- delete left;
- delete right;
+ left = right;
+ }
+ else {
+ MeshSet<3> *result = csg.compute(left, right, carve::csg::CSG::UNION, NULL, carve::csg::CSG::CLASSIFY_EDGE);
- left = result;
+ delete left;
+ delete right;
+
+ left = result;
+ }
}
catch(carve::exception e) {
std::cerr << "CSG failed, exception " << e.str() << std::endl;
@@ -492,7 +499,7 @@
CSG_VertexIteratorDescriptor obBVertices)
{
carve::csg::CSG::OP op;
- MeshSet<3> *left, *right, *output;
+ MeshSet<3> *left, *right, *output = NULL;
carve::csg::CSG csg;
carve::geom3d::Vector min, max;
carve::interpolate::FaceAttr<uint> oface_num;
@@ -517,6 +524,17 @@
Carve_prepareOperands(&left, &right, oface_num);
+ if(left->meshes.size() == 0 || right->meshes.size()==0) {
+ // normally sohuldn't happen (zero-faces objects are handled by modifier itself), but
+ // unioning intersecting meshes which doesn't have consistent normals might lead to
+ // empty result which wouldn't work here
+
+ delete left;
+ delete right;
+
+ return BOP_ERROR;
+ }
+
min.x = max.x = left->vertex_storage[0].v.x;
min.y = max.y = left->vertex_storage[0].v.y;
min.z = max.z = left->vertex_storage[0].v.z;
More information about the Bf-blender-cvs
mailing list