Fix T51074: Boolean modifier inverts operation
Support for negative scaled objects.
This commit is contained in:
parent
d09c429e30
commit
a850d74312
Notes:
blender-bot
2023-02-14 07:06:09 +01:00
Referenced by issue #53683, 2.79a release Referenced by issue #51074, Boolean modifier inverts Difference and Union (sometimes + strange behavior)
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in New Issue