[Bf-blender-cvs] [a850d743121] master: Fix T51074: Boolean modifier inverts operation

Campbell Barton noreply at git.blender.org
Sat Sep 16 10:02:06 CEST 2017


Commit: a850d7431218d2c169f217e81a2cedc422319c30
Author: Campbell Barton
Date:   Sat Sep 16 18:10:25 2017 +1000
Branches: master
https://developer.blender.org/rBa850d7431218d2c169f217e81a2cedc422319c30

Fix T51074: Boolean modifier inverts operation

Support for negative scaled objects.

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

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 a5ce18b9668..f94ab777eb4 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -224,6 +224,8 @@ static DerivedMesh *applyModifier_bmesh(
 		result = get_quick_derivedMesh(ob, dm, bmd->object, dm_other, bmd->operation);
 
 		if (result == NULL) {
+			const bool is_flip = (is_negative_m4(ob->obmat) != is_negative_m4(bmd->object->obmat));
+
 			BMesh *bm;
 			const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_DM(dm, dm_other);
 
@@ -235,6 +237,16 @@ static DerivedMesh *applyModifier_bmesh(
 			         &((struct BMeshCreateParams){.use_toolflags = false,}));
 
 			DM_to_bmesh_ex(dm_other, bm, true);
+
+			if (UNLIKELY(is_flip)) {
+				const int cd_loop_mdisp_offset = CustomData_get_offset(&bm->ldata, CD_MDISPS);
+				BMIter iter;
+				BMFace *efa;
+				BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
+					BM_face_normal_flip_ex(bm, efa, cd_loop_mdisp_offset, true);
+				}
+			}
+
 			DM_to_bmesh_ex(dm, bm, true);
 
 			/* main bmesh intersection setup */
@@ -262,7 +274,6 @@ static DerivedMesh *applyModifier_bmesh(
 					invert_m4_m4(imat, ob->obmat);
 					mul_m4_m4m4(omat, imat, bmd->object->obmat);
 
-
 					BMVert *eve;
 					i = 0;
 					BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
@@ -275,8 +286,13 @@ static DerivedMesh *applyModifier_bmesh(
 					/* we need face normals because of 'BM_face_split_edgenet'
 					 * we could calculate on the fly too (before calling split). */
 					{
-						float nmat[4][4];
-						invert_m4_m4(nmat, omat);
+						float nmat[3][3];
+						copy_m3_m4(nmat, omat);
+						invert_m3(nmat);
+
+						if (UNLIKELY(is_flip)) {
+							negate_m3(nmat);
+						}
 
 						const short ob_src_totcol = bmd->object->totcol;
 						short *material_remap = BLI_array_alloca(material_remap, ob_src_totcol ? ob_src_totcol : 1);
@@ -286,7 +302,7 @@ static DerivedMesh *applyModifier_bmesh(
 						BMFace *efa;
 						i = 0;
 						BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
-							mul_transposed_mat3_m4_v3(nmat, efa->no);
+							mul_transposed_m3_v3(nmat, efa->no);
 							normalize_v3(efa->no);
 							BM_elem_flag_enable(efa, BM_FACE_TAG);  /* temp tag to test which side split faces are from */



More information about the Bf-blender-cvs mailing list