Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2015-12-21 06:37:42 +0300
committerCampbell Barton <ideasman42@gmail.com>2015-12-21 06:41:05 +0300
commit10cf7499e7f63502b612e8731c2ef2923f1a85c9 (patch)
tree131b750bedb9ff45953671795b665eef937d1df4 /source/blender/modifiers
parent580067769c82022f9c35292287ef7cab6378052e (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.c36
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