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:
authorBastien Montagne <montagne29@wanadoo.fr>2019-02-11 22:20:12 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2019-02-11 22:24:07 +0300
commit7cca0f9998a3d12e0046009c643038c9faa45767 (patch)
tree2178763ed908b018c29408268a612559fab8ad34
parentd8888b2f48bc3146eeb490de4544fadd5fc37386 (diff)
Fix T61391: MeshDeform Modifier does not work on a solidified planar mesh.
`BKE_modifier_get_evaluated_mesh_from_evaluated_object()` used by modifiers needing access to other objects' geometry probably skipped out of the radar when cage and final evaluated meshes were added to BMEditMesh? In any case, we do not need to duplicate (and then free!) a temp mesh from editdata anymore, and we can even add instead a parameter to get cage instead of final. Also makes modifiers code a bit simpler.
-rw-r--r--source/blender/blenkernel/BKE_modifier.h2
-rw-r--r--source/blender/blenkernel/intern/modifier.c15
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c13
-rw-r--r--source/blender/modifiers/intern/MOD_array.c11
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c7
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c6
-rw-r--r--source/blender/modifiers/intern/MOD_surfacedeform.c16
-rw-r--r--source/blender/modifiers/intern/MOD_weightvgproximity.c7
8 files changed, 21 insertions, 56 deletions
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index dcc55fa2445..d04d413571c 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -426,6 +426,6 @@ struct DerivedMesh *modifier_applyModifier_DM_deprecated(
struct DerivedMesh *dm);
struct Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(
- struct Object *ob_eval, bool *r_free_mesh);
+ struct Object *ob_eval, const bool get_cage_mesh);
#endif
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 511f5d01461..9e24131ddd3 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -899,23 +899,24 @@ struct DerivedMesh *modifier_applyModifier_DM_deprecated(
* Get evaluated mesh for other evaluated object, which is used as an operand for the modifier,
* e.g. second operand for boolean modifier.
* Note that modifiers in stack always get fully evaluated COW ID pointers, never original ones. Makes things simpler.
+ *
+ * \param get_cage_mesh Return evaluated mesh with only deforming modifiers applied
+ * (i.e. mesh topology remains the same as original one, a.k.a. 'cage' mesh).
*/
-Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, bool *r_free_mesh)
+Mesh *BKE_modifier_get_evaluated_mesh_from_evaluated_object(Object *ob_eval, const bool get_cage_mesh)
{
Mesh *me = NULL;
if ((ob_eval->type == OB_MESH) && (ob_eval->mode & OB_MODE_EDIT)) {
- /* Note: currently we have no equivalent to derived cagemesh or even final dm in BMEditMesh...
- * This is TODO in core depsgraph/modifier stack code still. */
+ /* In EditMode, evaluated mesh is stored in BMEditMesh, not the object... */
BMEditMesh *em = BKE_editmesh_from_object(ob_eval);
if (em != NULL) { /* em might not exist yet in some cases, just after loading a .blend file, see T57878. */
- me = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
- *r_free_mesh = true;
+ me = (get_cage_mesh && em->mesh_eval_cage != NULL) ? em->mesh_eval_cage : em->mesh_eval_final;
}
}
if (me == NULL) {
- me = ob_eval->runtime.mesh_eval;
- *r_free_mesh = false;
+ me = (get_cage_mesh && ob_eval->runtime.mesh_deform_eval != NULL) ? ob_eval->runtime.mesh_deform_eval :
+ ob_eval->runtime.mesh_eval;
}
return me;
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index e2a4dc6f852..d095320f49d 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -624,7 +624,6 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc)
/* auxiliary target */
Mesh *auxMesh = NULL;
- bool auxMesh_free;
ShrinkwrapTreeData *aux_tree = NULL;
ShrinkwrapTreeData aux_tree_stack;
SpaceTransform local2aux;
@@ -654,7 +653,7 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc)
}
if (calc->aux_target) {
- auxMesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(calc->aux_target, &auxMesh_free);
+ auxMesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(calc->aux_target, false);
if (!auxMesh)
return;
BLI_SPACE_TRANSFORM_SETUP(&local2aux, calc->ob, calc->aux_target);
@@ -683,9 +682,6 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc)
if (aux_tree) {
BKE_shrinkwrap_free_tree(aux_tree);
}
- if (auxMesh != NULL && auxMesh_free) {
- BKE_id_free(NULL, auxMesh);
- }
}
/*
@@ -1285,7 +1281,6 @@ void shrinkwrapModifier_deform(
DerivedMesh *ss_mesh = NULL;
ShrinkwrapCalcData calc = NULL_ShrinkwrapCalcData;
- bool target_free = false;
/* remove loop dependencies on derived meshes (TODO should this be done elsewhere?) */
if (smd->target == ob) smd->target = NULL;
@@ -1303,7 +1298,7 @@ void shrinkwrapModifier_deform(
if (smd->target != NULL) {
Object *ob_target = DEG_get_evaluated_object(ctx->depsgraph, smd->target);
- calc.target = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_target, &target_free);
+ calc.target = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_target, false);
/* TODO there might be several "bugs" on non-uniform scales matrixs
* because it will no longer be nearest surface, not sphere projection
@@ -1374,8 +1369,4 @@ void shrinkwrapModifier_deform(
/* free memory */
if (ss_mesh)
ss_mesh->release(ss_mesh);
-
- if (target_free && calc.target) {
- BKE_id_free(NULL, calc.target);
- }
}
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index 5fdfe1ef7cf..e0ae1cc3500 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -359,7 +359,6 @@ static Mesh *arrayModifier_doArray(
int first_chunk_start, first_chunk_nverts, last_chunk_start, last_chunk_nverts;
Mesh *result, *start_cap_mesh = NULL, *end_cap_mesh = NULL;
- bool start_cap_mesh_free, end_cap_mesh_free;
int *vgroup_start_cap_remap = NULL;
int vgroup_start_cap_remap_len = 0;
@@ -378,7 +377,7 @@ static Mesh *arrayModifier_doArray(
vgroup_start_cap_remap = BKE_object_defgroup_index_map_create(
start_cap_ob, ctx->object, &vgroup_start_cap_remap_len);
- start_cap_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(start_cap_ob, &start_cap_mesh_free);
+ start_cap_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(start_cap_ob, false);
if (start_cap_mesh) {
start_cap_nverts = start_cap_mesh->totvert;
start_cap_nedges = start_cap_mesh->totedge;
@@ -391,7 +390,7 @@ static Mesh *arrayModifier_doArray(
vgroup_end_cap_remap = BKE_object_defgroup_index_map_create(
end_cap_ob, ctx->object, &vgroup_end_cap_remap_len);
- end_cap_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(end_cap_ob, &end_cap_mesh_free);
+ end_cap_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(end_cap_ob, false);
if (end_cap_mesh) {
end_cap_nverts = end_cap_mesh->totvert;
end_cap_nedges = end_cap_mesh->totedge;
@@ -727,12 +726,6 @@ static Mesh *arrayModifier_doArray(
if (vgroup_end_cap_remap) {
MEM_freeN(vgroup_end_cap_remap);
}
- if (start_cap_mesh != NULL && start_cap_mesh_free) {
- BKE_id_free(NULL, start_cap_mesh);
- }
- if (end_cap_mesh != NULL && end_cap_mesh_free) {
- BKE_id_free(NULL, end_cap_mesh);
- }
return result;
}
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index d26aaf622a3..d7fca5c12f3 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -157,14 +157,13 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
Mesh *result = mesh;
Mesh *mesh_other;
- bool mesh_other_free;
if (bmd->object == NULL) {
return result;
}
Object *other = DEG_get_evaluated_object(ctx->depsgraph, bmd->object);
- mesh_other = BKE_modifier_get_evaluated_mesh_from_evaluated_object(other, &mesh_other_free);
+ mesh_other = BKE_modifier_get_evaluated_mesh_from_evaluated_object(other, false);
if (mesh_other) {
Object *object = ctx->object;
@@ -318,10 +317,6 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
modifier_setError(md, "Cannot execute boolean operation");
}
- if (mesh_other != NULL && mesh_other_free) {
- BKE_id_free(NULL, mesh_other);
- }
-
return result;
}
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index d789f964b6e..8013a015997 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -279,7 +279,6 @@ static void meshdeformModifier_do(
int a, totvert, totcagevert, defgrp_index;
float (*cagecos)[3] = NULL;
MeshdeformUserdata data;
- bool free_cagemesh = false;
static int recursive_bind_sentinel = 0;
@@ -297,7 +296,7 @@ static void meshdeformModifier_do(
* We'll support this case once granular dependency graph is landed.
*/
Object *ob_target = DEG_get_evaluated_object(ctx->depsgraph, mmd->object);
- cagemesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_target, &free_cagemesh);
+ cagemesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_target, false);
#if 0 /* This shall not be needed if we always get evaluated target object... */
if (cagemesh == NULL && mmd->bindcagecos == NULL && ob == DEG_get_original_object(ob)) {
/* Special case, binding happens outside of depsgraph evaluation, so we can build our own
@@ -399,9 +398,6 @@ static void meshdeformModifier_do(
finally:
MEM_SAFE_FREE(dco);
MEM_SAFE_FREE(cagecos);
- if (cagemesh != NULL && free_cagemesh) {
- BKE_id_free(NULL, cagemesh);
- }
}
static void deformVerts(
diff --git a/source/blender/modifiers/intern/MOD_surfacedeform.c b/source/blender/modifiers/intern/MOD_surfacedeform.c
index cb04d7fc307..d3910a04dfb 100644
--- a/source/blender/modifiers/intern/MOD_surfacedeform.c
+++ b/source/blender/modifiers/intern/MOD_surfacedeform.c
@@ -1124,7 +1124,6 @@ static void surfacedeformModifier_do(
float (*vertexCos)[3], unsigned int numverts, Object *ob)
{
SurfaceDeformModifierData *smd = (SurfaceDeformModifierData *)md;
- bool free_target;
Mesh *target;
unsigned int tnumverts, tnumpoly;
@@ -1145,7 +1144,7 @@ static void surfacedeformModifier_do(
}
Object *ob_target = DEG_get_evaluated_object(ctx->depsgraph, smd->target);
- target = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_target, &free_target);
+ target = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob_target, false);
#if 0 /* Should not be needed anymore since we always get that mesh from eval object ? */
if (target == NULL && smd->verts == NULL && ob == DEG_get_original_object(ob)) {
/* Special case, binding happens outside of depsgraph evaluation, so we can build our own
@@ -1169,7 +1168,7 @@ static void surfacedeformModifier_do(
if (ob != DEG_get_original_object(ob)) {
BLI_assert(!"Trying to bind inside of depsgraph evaluation");
modifier_setError(md, "Trying to bind inside of depsgraph evaluation");
- goto finally;
+ return;
}
float tmp_mat[4][4];
@@ -1180,17 +1179,17 @@ static void surfacedeformModifier_do(
smd->flags &= ~MOD_SDEF_BIND;
}
/* Early abort, this is binding 'call', no need to perform whole evaluation. */
- goto finally;
+ return;
}
/* Poly count checks */
if (smd->numverts != numverts) {
modifier_setError(md, "Verts changed from %u to %u", smd->numverts, numverts);
- goto finally;
+ return;
}
else if (smd->numpoly != tnumpoly) {
modifier_setError(md, "Target polygons changed from %u to %u", smd->numpoly, tnumpoly);
- goto finally;
+ return;
}
/* Actual vertex location update starts here */
@@ -1217,11 +1216,6 @@ static void surfacedeformModifier_do(
MEM_freeN(data.targetCos);
}
-
-finally:
- if (target != NULL && free_target) {
- BKE_id_free(NULL, target);
- }
}
static void deformVerts(
diff --git a/source/blender/modifiers/intern/MOD_weightvgproximity.c b/source/blender/modifiers/intern/MOD_weightvgproximity.c
index 7f710967ec1..63b8055220d 100644
--- a/source/blender/modifiers/intern/MOD_weightvgproximity.c
+++ b/source/blender/modifiers/intern/MOD_weightvgproximity.c
@@ -484,8 +484,7 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
const bool use_trgt_faces = (wmd->proximity_flags & MOD_WVG_PROXIMITY_GEOM_FACES) != 0;
if (use_trgt_verts || use_trgt_edges || use_trgt_faces) {
- bool target_mesh_free;
- Mesh *target_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(obr, &target_mesh_free);
+ Mesh *target_mesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(obr, false);
/* We must check that we do have a valid target_mesh! */
if (target_mesh != NULL) {
@@ -508,10 +507,6 @@ static Mesh *applyModifier(ModifierData *md, const ModifierEvalContext *ctx, Mes
MEM_SAFE_FREE(dists_v);
MEM_SAFE_FREE(dists_e);
MEM_SAFE_FREE(dists_f);
-
- if (target_mesh_free) {
- BKE_id_free(NULL, target_mesh);
- }
}
/* Else, fall back to default obj2vert behavior. */
else {