[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37005] trunk/blender/source/blender/ modifiers/intern/MOD_boolean.c: Fix #27392: boolean intersect's

Sergey Sharybin g.ulairi at gmail.com
Sun May 29 17:53:39 CEST 2011


Revision: 37005
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37005
Author:   nazgul
Date:     2011-05-29 15:53:38 +0000 (Sun, 29 May 2011)
Log Message:
-----------
Fix #27392: boolean intersect's

It was lag of optimization logic, which always retuns object's derivedMesh
if one of of boolean operation's meshes has got no faces.

Actually, result depends on operation and which mesh has got no faces.

Added small utility function to handle this.

Modified Paths:
--------------
    trunk/blender/source/blender/modifiers/intern/MOD_boolean.c

Modified: trunk/blender/source/blender/modifiers/intern/MOD_boolean.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_boolean.c	2011-05-29 15:32:51 UTC (rev 37004)
+++ trunk/blender/source/blender/modifiers/intern/MOD_boolean.c	2011-05-29 15:53:38 UTC (rev 37005)
@@ -92,20 +92,57 @@
 }
 
 #ifdef WITH_MOD_BOOLEAN
+static DerivedMesh *get_quick_derivedMesh(DerivedMesh *derivedData, DerivedMesh *dm, int operation)
+{
+	DerivedMesh *result = NULL;
+
+	if(derivedData->getNumFaces(derivedData) == 0 || dm->getNumFaces(dm) == 0) {
+		switch(operation) {
+			case eBooleanModifierOp_Intersect:
+				result = CDDM_new(0, 0, 0);
+				break;
+
+			case eBooleanModifierOp_Union:
+				if(derivedData->getNumFaces(derivedData)) result = derivedData;
+				else result = CDDM_copy(dm);
+
+				break;
+
+			case eBooleanModifierOp_Difference:
+				result = derivedData;
+				break;
+		}
+	}
+
+	return result;
+}
+
 static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 						DerivedMesh *derivedData,
 						int UNUSED(useRenderParams),
 						int UNUSED(isFinalCalc))
 {
 	BooleanModifierData *bmd = (BooleanModifierData*) md;
-	DerivedMesh *dm = bmd->object->derivedFinal;
+	DerivedMesh *dm;
 
-	/* we do a quick sanity check */
-	if(dm && (derivedData->getNumFaces(derivedData) > 3)
-			&& bmd->object && dm->getNumFaces(dm) > 3) {
-		DerivedMesh *result = NewBooleanDerivedMesh(dm, bmd->object, derivedData, ob,
-				1 + bmd->operation);
+	if(!bmd->object)
+		return derivedData;
 
+	dm = bmd->object->derivedFinal;
+
+	if(dm) {
+		DerivedMesh *result;
+
+		/* when one of objects is empty (has got no faces) we could speed up
+		   calculation a bit returning one of objects' derived meshes (or empty one)
+		   Returning mesh is depended on modifieier's operation (sergey) */
+		result = get_quick_derivedMesh(derivedData, dm, bmd->operation);
+
+		if(result == NULL) {
+			result = NewBooleanDerivedMesh(dm, bmd->object, derivedData, ob,
+					1 + bmd->operation);
+		}
+
 		/* if new mesh returned, return it; otherwise there was
 		* an error, so delete the modifier object */
 		if(result)




More information about the Bf-blender-cvs mailing list