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>2018-05-30 12:34:08 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2018-05-30 13:04:06 +0300
commit72f4ac99c70b02e095cc9a71d501d6b1dc85ac3e (patch)
tree940c598d4efb2246eb7b523840e2b7337a59bc1b /source/blender/modifiers/intern/MOD_meshdeform.c
parente55c1a9b5a089f3c688a0b47cba363cb0d6f92d0 (diff)
Cleanup/fix wrong modifiers targets handling in COW context.
Modifiers stack only get COW/evaluated IDs, so no need to go auery again DEG for those. Further more, now unified handling of EditBMesh case (was done on case-by-case basis in a few modifiers, not all for some reason). We are still missing the ability to get final and cage deformed meshes when in Edit mode though, this is to be defined/implemented in depsgraph.
Diffstat (limited to 'source/blender/modifiers/intern/MOD_meshdeform.c')
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c36
1 files changed, 10 insertions, 26 deletions
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index 48653856178..e9e8c974413 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -275,10 +275,12 @@ static void meshdeform_vert_task(
}
static void meshdeformModifier_do(
- ModifierData *md, Depsgraph *depsgraph, Object *ob, Mesh *mesh,
+ ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh,
float (*vertexCos)[3], int numVerts)
{
MeshDeformModifierData *mmd = (MeshDeformModifierData *) md;
+ Object *ob = ctx->object;
+
Mesh *cagemesh;
MDeformVert *dvert = NULL;
float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4];
@@ -301,29 +303,9 @@ static void meshdeformModifier_do(
*
* We'll support this case once granular dependency graph is landed.
*/
- if (mmd->object->mode & OB_MODE_EDIT) {
- BMEditMesh *em = BKE_editmesh_from_object(mmd->object);
- cagemesh = BKE_bmesh_to_mesh_nomain(em->bm, &(struct BMeshToMeshParams){0});
- free_cagemesh = true;
- }
- else {
- ModifierEvalContext ctx = {
- .depsgraph = depsgraph,
- .flag = md->mode & eModifierMode_Render ? MOD_APPLY_RENDER : 0,
- };
- cagemesh = BKE_modifier_get_evaluated_mesh_from_object(&ctx, ob);
- }
-
- /* if we don't have one computed, use derivedmesh from data
- * without any modifiers */
- if (!cagemesh) {
- cagemesh = get_mesh(mmd->object, NULL, NULL, NULL, false, false);
- if (cagemesh) {
- free_cagemesh = true;
- }
- }
+ cagemesh = BKE_modifier_get_evaluated_mesh_from_evaluated_object(ob, &free_cagemesh);
- if (!cagemesh) {
+ if (cagemesh == NULL) {
modifier_setError(md, "Cannot get mesh from cage object");
return;
}
@@ -412,7 +394,9 @@ static void meshdeformModifier_do(
/* release cage derivedmesh */
MEM_freeN(dco);
MEM_freeN(cagecos);
- if (free_cagemesh) BKE_id_free(NULL, cagemesh);
+ if (cagemesh != NULL && free_cagemesh) {
+ BKE_id_free(NULL, cagemesh);
+ }
}
static void deformVerts(
@@ -425,7 +409,7 @@ static void deformVerts(
modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
- meshdeformModifier_do(md, ctx->depsgraph, ctx->object, mesh_src, vertexCos, numVerts);
+ meshdeformModifier_do(md, ctx, mesh_src, vertexCos, numVerts);
if (mesh_src && mesh_src != mesh) {
BKE_id_free(NULL, mesh_src);
@@ -441,7 +425,7 @@ static void deformVertsEM(
{
Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false);
- meshdeformModifier_do(md, ctx->depsgraph, ctx->object, mesh_src, vertexCos, numVerts);
+ meshdeformModifier_do(md, ctx, mesh_src, vertexCos, numVerts);
if (mesh_src && mesh_src != mesh) {
BKE_id_free(NULL, mesh_src);