[Bf-blender-cvs] [10cf749] master: Fix T47023: Boolean w/ empty mesh didn't transform

Campbell Barton noreply at git.blender.org
Mon Dec 21 04:41:40 CET 2015


Commit: 10cf7499e7f63502b612e8731c2ef2923f1a85c9
Author: Campbell Barton
Date:   Mon Dec 21 14:37:42 2015 +1100
Branches: master
https://developer.blender.org/rB10cf7499e7f63502b612e8731c2ef2923f1a85c9

Fix T47023: Boolean w/ empty mesh didn't transform

===================================================================

M	source/blender/modifiers/intern/MOD_boolean.c

===================================================================

diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index 9257026..750fb47 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -127,24 +127,46 @@ static void updateDepsgraph(ModifierData *md,
 
 #if defined(USE_CARVE) || defined(USE_BMESH)
 
-static DerivedMesh *get_quick_derivedMesh(DerivedMesh *derivedData, DerivedMesh *dm, int operation)
+static DerivedMesh *get_quick_derivedMesh(
+        Object *ob_self,  DerivedMesh *dm_self,
+        Object *ob_other, DerivedMesh *dm_other,
+        int operation)
 {
 	DerivedMesh *result = NULL;
 
-	if (derivedData->getNumPolys(derivedData) == 0 || dm->getNumPolys(dm) == 0) {
+	if (dm_self->getNumPolys(dm_self) == 0 || dm_other->getNumPolys(dm_other) == 0) {
 		switch (operation) {
 			case eBooleanModifierOp_Intersect:
 				result = CDDM_new(0, 0, 0, 0, 0);
 				break;
 
 			case eBooleanModifierOp_Union:
-				if (derivedData->getNumPolys(derivedData)) result = derivedData;
-				else result = CDDM_copy(dm);
+				if (dm_self->getNumPolys(dm_self) != 0) {
+					result = dm_self;
+				}
+				else {
+					result = CDDM_copy(dm_other);
+
+					float imat[4][4];
+					float omat[4][4];
+
+					invert_m4_m4(imat, ob_self->obmat);
+					mul_m4_m4m4(omat, imat, ob_other->obmat);
+
+					const int mverts_len = result->getNumVerts(result);
+					MVert *mv = CDDM_get_verts(result);
+
+					for (int i = 0; i < mverts_len; i++, mv++) {
+						mul_m4_v3(omat, mv->co);
+					}
+
+					result->dirty |= DM_DIRTY_NORMALS;
+				}
 
 				break;
 
 			case eBooleanModifierOp_Difference:
-				result = derivedData;
+				result = dm_self;
 				break;
 		}
 	}
@@ -189,7 +211,7 @@ static DerivedMesh *applyModifier_bmesh(
 		/* 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 modifiers operation (sergey) */
-		result = get_quick_derivedMesh(dm, dm_other, bmd->operation);
+		result = get_quick_derivedMesh(ob, dm, bmd->object, dm_other, bmd->operation);
 
 		if (result == NULL) {
 			BMesh *bm;
@@ -335,7 +357,7 @@ static DerivedMesh *applyModifier_carve(
 		/* 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 modifiers operation (sergey) */
-		result = get_quick_derivedMesh(derivedData, dm, bmd->operation);
+		result = get_quick_derivedMesh(ob, derivedData, bmd->object, dm, bmd->operation);
 
 		if (result == NULL) {
 #ifdef DEBUG_TIME




More information about the Bf-blender-cvs mailing list