Merge branch 'master' into blender2.8
[blender.git] / source / blender / modifiers / intern / MOD_meshdeform.c
index f606bec8676985429bbd11ced74c1723a06481d6..e7db70f9f7c3331ed712771daf737e8481da462e 100644 (file)
@@ -32,6 +32,7 @@
  *  \ingroup modifiers
  */
 
+#include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "BLI_task.h"
 #include "BLI_utildefines.h"
 
-#include "BKE_cdderivedmesh.h"
 #include "BKE_global.h"
+#include "BKE_library.h"
 #include "BKE_library_query.h"
+#include "BKE_mesh.h"
 #include "BKE_modifier.h"
 #include "BKE_deform.h"
 #include "BKE_editmesh.h"
 
-#include "depsgraph_private.h"
-
 #include "MEM_guardedalloc.h"
 
+#include "DEG_depsgraph.h"
+
 #include "MOD_util.h"
 
 #ifdef __SSE2__
@@ -122,19 +124,6 @@ static void foreachObjectLink(
        walk(userData, ob, &mmd->object, IDWALK_CB_NOP);
 }
 
-static void updateDepgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
-{
-       MeshDeformModifierData *mmd = (MeshDeformModifierData *) md;
-
-       if (mmd->object) {
-               DagNode *curNode = dag_get_node(ctx->forest, mmd->object);
-
-               dag_add_relation(ctx->forest, curNode, ctx->obNode,
-                                DAG_RL_DATA_DATA | DAG_RL_OB_DATA | DAG_RL_DATA_OB | DAG_RL_OB_OB,
-                                "Mesh Deform Modifier");
-       }
-}
-
 static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
 {
        MeshDeformModifierData *mmd = (MeshDeformModifierData *)md;
@@ -286,17 +275,18 @@ static void meshdeform_vert_task(
 }
 
 static void meshdeformModifier_do(
-        ModifierData *md, Object *ob, DerivedMesh *dm,
+        ModifierData *md, Object *ob, Mesh *mesh,
         float (*vertexCos)[3], int numVerts)
 {
        MeshDeformModifierData *mmd = (MeshDeformModifierData *) md;
-       DerivedMesh *tmpdm, *cagedm;
+       Mesh *cagemesh;
        MDeformVert *dvert = NULL;
        float imat[4][4], cagemat[4][4], iobmat[4][4], icagemat[3][3], cmat[4][4];
        float co[3], (*dco)[3], (*bindcagecos)[3];
        int a, totvert, totcagevert, defgrp_index;
        float (*cagecos)[3];
        MeshdeformUserdata data;
+       bool free_cagemesh = false;
 
        if (!mmd->object || (!mmd->bindcagecos && !mmd->bindfunc))
                return;
@@ -311,24 +301,25 @@ static void meshdeformModifier_do(
         *
         * We'll support this case once granular dependency graph is landed.
         */
-       if (mmd->object == md->scene->obedit) {
-               BMEditMesh *em = BKE_editmesh_from_object(mmd->object);
-               tmpdm = editbmesh_get_derived_cage_and_final(md->scene, mmd->object, em, 0, &cagedm);
-               if (tmpdm)
-                       tmpdm->release(tmpdm);
+       if (mmd->object->mode & OB_MODE_EDIT) {
+               /* TODO(Sybren): do we need to check the modifier mode in this case? */
+               /* TODO(Sybren): should we get from BMEditMesh *em = BKE_editmesh_from_object(mmd->object) instead? */
+               cagemesh = get_mesh_eval_for_modifier(ob, md->mode & eModifierMode_Render ? MOD_APPLY_RENDER : 0);
+       }
+       else {
+               cagemesh = get_mesh_eval_for_modifier(ob, md->mode & eModifierMode_Render ? MOD_APPLY_RENDER : 0);
        }
-       else
-               cagedm = mmd->object->derivedFinal;
 
        /* if we don't have one computed, use derivedmesh from data
         * without any modifiers */
-       if (!cagedm) {
-               cagedm = get_dm(mmd->object, NULL, NULL, NULL, false, false);
-               if (cagedm)
-                       cagedm->needsFree = 1;
+       if (!cagemesh) {
+               cagemesh = get_mesh(mmd->object, NULL, NULL, NULL, false, false);
+               if (cagemesh) {
+                       free_cagemesh = true;
+               }
        }
        
-       if (!cagedm) {
+       if (!cagemesh) {
                modifier_setError(md, "Cannot get mesh from cage object");
                return;
        }
@@ -347,35 +338,33 @@ static void meshdeformModifier_do(
                /* progress bar redraw can make this recursive .. */
                if (!recursive) {
                        recursive = 1;
-                       mmd->bindfunc(md->scene, mmd, cagedm, (float *)vertexCos, numVerts, cagemat);
+                       mmd->bindfunc(md->scene, mmd, cagemesh, (float *)vertexCos, numVerts, cagemat);
                        recursive = 0;
                }
        }
 
        /* verify we have compatible weights */
        totvert = numVerts;
-       totcagevert = cagedm->getNumVerts(cagedm);
+       totcagevert = cagemesh->totvert;
 
        if (mmd->totvert != totvert) {
                modifier_setError(md, "Verts changed from %d to %d", mmd->totvert, totvert);
-               cagedm->release(cagedm);
+               if (free_cagemesh) BKE_id_free(NULL, cagemesh);
                return;
        }
        else if (mmd->totcagevert != totcagevert) {
                modifier_setError(md, "Cage verts changed from %d to %d", mmd->totcagevert, totcagevert);
-               cagedm->release(cagedm);
+               if (free_cagemesh) BKE_id_free(NULL, cagemesh);
                return;
        }
        else if (mmd->bindcagecos == NULL) {
                modifier_setError(md, "Bind data missing");
-               cagedm->release(cagedm);
+               if (free_cagemesh) BKE_id_free(NULL, cagemesh);
                return;
        }
 
-       cagecos = MEM_malloc_arrayN(totcagevert, sizeof(*cagecos), "meshdeformModifier vertCos");
-
        /* setup deformation data */
-       cagedm->getVertCos(cagedm, cagecos);
+       cagecos = BKE_mesh_vertexCos_get(cagemesh, NULL);
        bindcagecos = (float(*)[3])mmd->bindcagecos;
 
        /* We allocate 1 element extra to make it possible to
@@ -396,7 +385,7 @@ static void meshdeformModifier_do(
                        copy_v3_v3(dco[a], co);
        }
 
-       modifier_get_vgroup(ob, dm, mmd->defgrp_name, &dvert, &defgrp_index);
+       modifier_get_vgroup_mesh(ob, mesh, mmd->defgrp_name, &dvert, &defgrp_index);
 
        /* Initialize data to be pass to the for body function. */
        data.mmd = mmd;
@@ -419,37 +408,38 @@ static void meshdeformModifier_do(
        /* release cage derivedmesh */
        MEM_freeN(dco);
        MEM_freeN(cagecos);
-       cagedm->release(cagedm);
+       if (free_cagemesh) BKE_id_free(NULL, cagemesh);
 }
 
-static void deformVerts(ModifierData *md, Object *ob,
-                        DerivedMesh *derivedData,
+static void deformVerts(ModifierData *md, const ModifierEvalContext *ctx,
+                        Mesh *mesh,
                         float (*vertexCos)[3],
-                        int numVerts,
-                        ModifierApplyFlag UNUSED(flag))
+                        int numVerts)
 {
-       DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false);
+       Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false);
 
        modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
 
-       meshdeformModifier_do(md, ob, dm, vertexCos, numVerts);
+       meshdeformModifier_do(md, ctx->object, mesh, vertexCos, numVerts);
 
-       if (dm && dm != derivedData)
-               dm->release(dm);
+       if (mesh_src && mesh_src != mesh) {
+               BKE_id_free(NULL, mesh_src);
+       }
 }
 
-static void deformVertsEM(ModifierData *md, Object *ob,
+static void deformVertsEM(ModifierData *md, const ModifierEvalContext *ctx,
                           struct BMEditMesh *UNUSED(editData),
-                          DerivedMesh *derivedData,
+                          Mesh *mesh,
                           float (*vertexCos)[3],
                           int numVerts)
 {
-       DerivedMesh *dm = get_dm(ob, NULL, derivedData, NULL, false, false);
+       Mesh *mesh_src = get_mesh(ctx->object, NULL, mesh, NULL, false, false);
 
-       meshdeformModifier_do(md, ob, dm, vertexCos, numVerts);
+       meshdeformModifier_do(md, ctx->object, mesh, vertexCos, numVerts);
 
-       if (dm && dm != derivedData)
-               dm->release(dm);
+       if (mesh_src && mesh_src != mesh) {
+               BKE_id_free(NULL, mesh_src);
+       }
 }
 
 #define MESHDEFORM_MIN_INFLUENCE 0.00001f
@@ -525,17 +515,25 @@ ModifierTypeInfo modifierType_MeshDeform = {
                                eModifierTypeFlag_SupportsEditmode,
 
        /* copyData */          copyData,
+
+       /* deformVerts_DM */    NULL,
+       /* deformMatrices_DM */ NULL,
+       /* deformVertsEM_DM */  NULL,
+       /* deformMatricesEM_DM*/NULL,
+       /* applyModifier_DM */  NULL,
+       /* applyModifierEM_DM */NULL,
+
        /* deformVerts */       deformVerts,
        /* deformMatrices */    NULL,
        /* deformVertsEM */     deformVertsEM,
        /* deformMatricesEM */  NULL,
        /* applyModifier */     NULL,
        /* applyModifierEM */   NULL,
+
        /* initData */          initData,
        /* requiredDataMask */  requiredDataMask,
        /* freeData */          freeData,
        /* isDisabled */        isDisabled,
-       /* updateDepgraph */    updateDepgraph,
        /* updateDepsgraph */   updateDepsgraph,
        /* dependsOnTime */     NULL,
        /* dependsOnNormals */  NULL,