diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-12-21 06:37:42 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-12-21 06:41:05 +0300 |
commit | 10cf7499e7f63502b612e8731c2ef2923f1a85c9 (patch) | |
tree | 131b750bedb9ff45953671795b665eef937d1df4 /source/blender/modifiers | |
parent | 580067769c82022f9c35292287ef7cab6378052e (diff) |
Fix T47023: Boolean w/ empty mesh didn't transform
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r-- | source/blender/modifiers/intern/MOD_boolean.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c index 92570263856..750fb472cc8 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 |