Modifiers: cleanup/harmonize deform modifiers code re. mesh source.
authorBastien Montagne <montagne29@wanadoo.fr>
Tue, 27 Nov 2018 19:10:41 +0000 (20:10 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Tue, 27 Nov 2018 20:17:06 +0000 (21:17 +0100)
Also fixes a few issues (like meshdeform's EM variant not using editmesh
data), and adds a few optimizations (like only generating that source
mesh when we do have a vgroup defined in parameters, for modifiers only
using it to access vgroup)...

13 files changed:
source/blender/modifiers/intern/MOD_cast.c
source/blender/modifiers/intern/MOD_curve.c
source/blender/modifiers/intern/MOD_displace.c
source/blender/modifiers/intern/MOD_hook.c
source/blender/modifiers/intern/MOD_laplaciandeform.c
source/blender/modifiers/intern/MOD_laplaciansmooth.c
source/blender/modifiers/intern/MOD_lattice.c
source/blender/modifiers/intern/MOD_meshdeform.c
source/blender/modifiers/intern/MOD_shrinkwrap.c
source/blender/modifiers/intern/MOD_simpledeform.c
source/blender/modifiers/intern/MOD_smooth.c
source/blender/modifiers/intern/MOD_warp.c
source/blender/modifiers/intern/MOD_wave.c

index c80bbe5cc96766cdbe3b7e40bb9b1f025583a544..e79cceb118cbac1bb465a6f361c01cdcc24817c1 100644 (file)
@@ -431,10 +431,9 @@ static void deformVerts(
        CastModifierData *cmd = (CastModifierData *)md;
        Mesh *mesh_src = NULL;
 
-       if (ctx->object->type == OB_MESH) {
+       if (ctx->object->type == OB_MESH && cmd->defgrp_name[0] != '\0') {
                /* mesh_src is only needed for vgroups. */
                mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
-               BLI_assert(mesh_src->totvert == numVerts);
        }
 
        if (cmd->type == MOD_CAST_TYPE_CUBOID) {
index 6a0b276f0d57485b8b81f26644d05ce9c68a9e76..e9a3dd3810b676ff80f72828c7d3c03f7ceb1d90 100644 (file)
@@ -114,10 +114,9 @@ static void deformVerts(
        CurveModifierData *cmd = (CurveModifierData *) md;
        Mesh *mesh_src = NULL;
 
-       if (ctx->object->type == OB_MESH) {
+       if (ctx->object->type == OB_MESH && cmd->name[0] != '\0') {
                /* mesh_src is only needed for vgroups. */
                mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
-               BLI_assert(mesh_src->totvert == numVerts);
        }
 
        struct MDeformVert *dvert = NULL;
@@ -143,11 +142,9 @@ static void deformVertsEM(
 {
        Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false);
 
-       BLI_assert(mesh_src->totvert == numVerts);
-
        deformVerts(md, ctx, mesh_src, vertexCos, numVerts);
 
-       if (mesh_src != mesh) {
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
index 9345733ea773c6c68c02810a14611a7ee6f498fb..082c8f9c589855f0de0bbdf9bd0c22bd366c8886 100644 (file)
@@ -378,11 +378,9 @@ static void deformVerts(
 {
        Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
 
-       BLI_assert(mesh_src->totvert == numVerts);
-
        displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, numVerts);
 
-       if (mesh_src != mesh) {
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
@@ -393,11 +391,9 @@ static void deformVertsEM(
 {
        Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
 
-       BLI_assert(mesh_src->totvert == numVerts);
-
        displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, numVerts);
 
-       if (mesh_src != mesh) {
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
index 186ad2dc35266c6d17d321699a66dd4422989f49..9d893630b947a1648db43911e75cf0fb8d10ef53 100644 (file)
@@ -358,7 +358,7 @@ static void deformVerts(
 
        deformVerts_do(hmd, ctx->object, mesh_src, vertexCos, numVerts);
 
-       if (mesh_src != mesh) {
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
@@ -373,7 +373,7 @@ static void deformVertsEM(
 
        deformVerts_do(hmd, ctx->object, mesh_src, vertexCos, numVerts);
 
-       if (mesh_src != mesh) {
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
index 39085cc45884f95302ab07818c99d9bd4268671c..ba45e6bf8488af3cd56816687332243bf05e4c1f 100644 (file)
@@ -737,7 +737,8 @@ static void deformVerts(
        Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
 
        LaplacianDeformModifier_do((LaplacianDeformModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts);
-       if (mesh_src != mesh) {
+
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
@@ -747,9 +748,11 @@ static void deformVertsEM(
         Mesh *mesh, float (*vertexCos)[3], int numVerts)
 {
        Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
+
        LaplacianDeformModifier_do((LaplacianDeformModifierData *)md, ctx->object, mesh_src,
                                   vertexCos, numVerts);
-       if (mesh_src != mesh) {
+
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
index 66c31b60bbdcf9df9ad889194b4e9adceeaf22a2..1acec1d8b7a5f58c171c6ac8bba696e9ef0b2fa3 100644 (file)
@@ -512,8 +512,9 @@ static void deformVerts(
        laplaciansmoothModifier_do((LaplacianSmoothModifierData *)md, ctx->object, mesh_src,
                                   vertexCos, numVerts);
 
-       if (mesh_src != mesh)
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
+       }
 }
 
 static void deformVertsEM(
@@ -530,8 +531,9 @@ static void deformVertsEM(
        laplaciansmoothModifier_do((LaplacianSmoothModifierData *)md, ctx->object, mesh_src,
                                   vertexCos, numVerts);
 
-       if (mesh_src != mesh)
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
+       }
 }
 
 
index 0391924f37e4cba0b0b26dfe48a0544287fe43b7..c183f54098c9fda5f568ebc2b04b9f50a618d766 100644 (file)
@@ -107,9 +107,10 @@ static void deformVerts(
        lattice_deform_verts(lmd->object, ctx->object, mesh_src,
                             vertexCos, numVerts, lmd->name, lmd->strength);
 
-       if (mesh_src != mesh) {
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
-       }}
+       }
+}
 
 static void deformVertsEM(
         ModifierData *md, const ModifierEvalContext *ctx, struct BMEditMesh *em,
@@ -119,7 +120,7 @@ static void deformVertsEM(
 
        deformVerts(md, ctx, mesh_src, vertexCos, numVerts);
 
-       if (mesh_src != mesh) {
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
index b5e9d74c03c6be006825c0a686f4cb24a0d9fe92..9af76916788755910caf711507bc72964eb33254 100644 (file)
@@ -421,23 +421,23 @@ static void deformVerts(
 
        meshdeformModifier_do(md, ctx, mesh_src, vertexCos, numVerts);
 
-       if (mesh_src && mesh_src != mesh) {
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
 
 static void deformVertsEM(
         ModifierData *md, const ModifierEvalContext *ctx,
-        struct BMEditMesh *UNUSED(editData),
+        struct BMEditMesh *editData,
         Mesh *mesh,
         float (*vertexCos)[3],
         int numVerts)
 {
-       Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
+       Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
 
        meshdeformModifier_do(md, ctx, mesh_src, vertexCos, numVerts);
 
-       if (mesh_src && mesh_src != mesh) {
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
index 3f2e9adbe4681850b7cfe2984b05284d32603a1c..dd4530b066f6145bdeefe7fec74da35ed8f437be 100644 (file)
@@ -112,15 +112,12 @@ static void deformVerts(
        if (ctx->object->type == OB_MESH) {
                /* mesh_src is only needed for vgroups. */
                mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
-               BLI_assert(mesh_src->totvert == numVerts);
        }
 
        struct MDeformVert *dvert = NULL;
        int defgrp_index = -1;
        MOD_get_vgroup(ctx->object, mesh_src, swmd->vgroup_name, &dvert, &defgrp_index);
 
-       BLI_assert(mesh_src == NULL || mesh_src->totvert == numVerts);
-
        shrinkwrapModifier_deform(swmd, scene, ctx->object, mesh_src, dvert, defgrp_index, vertexCos, numVerts);
 
        if (!ELEM(mesh_src, NULL, mesh)) {
@@ -135,13 +132,7 @@ static void deformVertsEM(
 {
        ShrinkwrapModifierData *swmd = (ShrinkwrapModifierData *)md;
        struct Scene *scene = DEG_get_evaluated_scene(ctx->depsgraph);
-       Mesh *mesh_src = mesh;
-
-       if (mesh_src == NULL) {
-               mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(editData->bm, 0);
-       }
-
-       BLI_assert(mesh_src->totvert == numVerts);
+       Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
 
        struct MDeformVert *dvert = NULL;
        int defgrp_index = -1;
@@ -149,7 +140,7 @@ static void deformVertsEM(
 
        shrinkwrapModifier_deform(swmd, scene, ctx->object, mesh_src, dvert, defgrp_index, vertexCos, numVerts);
 
-       if (!mesh) {
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
index ffcf7767ddf40a20d0424e9e2ae89344ab92b467..cab1a24fe8516549f7bb34743c3a6cd34142153d 100644 (file)
@@ -388,10 +388,9 @@ static void deformVerts(
        SimpleDeformModifierData *sdmd = (SimpleDeformModifierData *)md;
        Mesh *mesh_src = NULL;
 
-       if (ctx->object->type == OB_MESH) {
+       if (ctx->object->type == OB_MESH && sdmd->vgroup_name[0] != '\0') {
                /* mesh_src is only needed for vgroups. */
                mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
-               BLI_assert(mesh_src->totvert == numVerts);
        }
 
        SimpleDeformModifier_do(sdmd, ctx->object, mesh_src, vertexCos, numVerts);
@@ -408,11 +407,17 @@ static void deformVertsEM(
         float (*vertexCos)[3],
         int numVerts)
 {
-       Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
+       SimpleDeformModifierData *sdmd = (SimpleDeformModifierData *)md;
+       Mesh *mesh_src = NULL;
 
-       SimpleDeformModifier_do((SimpleDeformModifierData *)md, ctx->object, mesh_src, vertexCos, numVerts);
+       if (ctx->object->type == OB_MESH && sdmd->vgroup_name[0] != '\0') {
+               /* mesh_src is only needed for vgroups. */
+               mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
+       }
 
-       if (mesh_src != mesh) {
+       SimpleDeformModifier_do(sdmd, ctx->object, mesh_src, vertexCos, numVerts);
+
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
        }
 }
index e243498523087e1d70f710d104a86dfcba02b5c6..8b62c2c1d7d9ad20b0e46ea5896381fdc44712c6 100644 (file)
@@ -216,11 +216,8 @@ static void deformVerts(
        SmoothModifierData *smd = (SmoothModifierData *)md;
        Mesh *mesh_src = NULL;
 
-       if (ctx->object->type == OB_MESH) {
-               /* mesh_src is needed for vgroups, and taking edges into account. */
-               mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
-               BLI_assert(mesh_src->totvert == numVerts);
-       }
+       /* mesh_src is needed for vgroups, and taking edges into account. */
+       mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
 
        smoothModifier_do(smd, ctx->object, mesh_src, vertexCos, numVerts);
 
@@ -234,13 +231,10 @@ static void deformVertsEM(
         Mesh *mesh, float (*vertexCos)[3], int numVerts)
 {
        SmoothModifierData *smd = (SmoothModifierData *)md;
-       Mesh *mesh_src = mesh;
-
-       if (mesh_src == NULL) {
-               mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(editData->bm, 0);
-       }
+       Mesh *mesh_src = NULL;
 
-       BLI_assert(mesh_src->totvert == numVerts);
+       /* mesh_src is needed for vgroups, and taking edges into account. */
+       mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, numVerts, false, false);
 
        smoothModifier_do(smd, ctx->object, mesh_src, vertexCos, numVerts);
 
index ebe08b0becf1a8bc1597976bf38831525d16fc26..aa81b945b4c5f7a363395fdc6d21056c4d75fb9f 100644 (file)
@@ -317,10 +317,9 @@ static void deformVerts(
        WarpModifierData *wmd = (WarpModifierData *)md;
        Mesh *mesh_src = NULL;
 
-       if (ctx->object->type == OB_MESH) {
-               /* mesh_src is only needed for vgroups and textures, which only work on meshes. */
+       if (wmd->defgrp_name[0] != '\0' || wmd->texture != NULL) {
+               /* mesh_src is only needed for vgroups and textures. */
                mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, numVerts, false, false);
-               BLI_assert(mesh_src->totvert == numVerts);
        }
 
        warpModifier_do(wmd, ctx, mesh_src, vertexCos, numVerts);
@@ -335,14 +334,13 @@ static void deformVertsEM(
         Mesh *mesh, float (*vertexCos)[3], int numVerts)
 {
        WarpModifierData *wmd = (WarpModifierData *)md;
-       Mesh *mesh_src = mesh;
+       Mesh *mesh_src = NULL;
 
-       if (mesh_src == NULL) {
-               mesh_src = BKE_mesh_from_bmesh_for_eval_nomain(em->bm, 0);
+       if (wmd->defgrp_name[0] != '\0' || wmd->texture != NULL) {
+               /* mesh_src is only needed for vgroups and textures. */
+               mesh_src = MOD_deform_mesh_eval_get(ctx->object, em, mesh, NULL, numVerts, false, false);
        }
 
-       BLI_assert(mesh_src->totvert == numVerts);
-
        warpModifier_do(wmd, ctx, mesh_src, vertexCos, numVerts);
 
        if (!ELEM(mesh_src, NULL, mesh)) {
index 9f864063c7b10a235b68be5415ad0dd9fa5d0ebd..0849b268f7fab3d2f560ddf60b89d993643128bc 100644 (file)
@@ -314,8 +314,9 @@ static void deformVerts(
 
        waveModifier_do(wmd, ctx->depsgraph, ctx->object, mesh_src, vertexCos, numVerts);
 
-       if (mesh_src != mesh)
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
+       }
 }
 
 static void deformVertsEM(
@@ -333,8 +334,9 @@ static void deformVertsEM(
 
        waveModifier_do(wmd, ctx->depsgraph, ctx->object, mesh_src, vertexCos, numVerts);
 
-       if (mesh_src != mesh)
+       if (!ELEM(mesh_src, NULL, mesh)) {
                BKE_id_free(NULL, mesh_src);
+       }
 }