Edit Mesh: remove derived-mesh from crazy-space calculation
authorCampbell Barton <ideasman42@gmail.com>
Tue, 9 Oct 2018 04:37:10 +0000 (15:37 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 9 Oct 2018 04:38:06 +0000 (15:38 +1100)
source/blender/blenkernel/BKE_DerivedMesh.h
source/blender/blenkernel/BKE_mesh.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/crazyspace.c
source/blender/blenkernel/intern/mesh.c

index a8e6558c533c4d2960d794e9443f75fce138d0a3..5a60fc25241f53249bdf7b20c53522472646e428 100644 (file)
@@ -541,8 +541,6 @@ DerivedMesh *mesh_create_derived_no_deform_render(
         struct Object *ob, float (*vertCos)[3],
         CustomDataMask dataMask);
 
         struct Object *ob, float (*vertCos)[3],
         CustomDataMask dataMask);
 
-DerivedMesh *editbmesh_get_derived_base(
-        struct Object *ob, struct BMEditMesh *em, CustomDataMask data_mask);
 DerivedMesh *editbmesh_get_derived_cage(
         struct Depsgraph *depsgraph, struct Scene *scene, struct Object *,
         struct BMEditMesh *em, CustomDataMask dataMask);
 DerivedMesh *editbmesh_get_derived_cage(
         struct Depsgraph *depsgraph, struct Scene *scene, struct Object *,
         struct BMEditMesh *em, CustomDataMask dataMask);
index a5f8338f3cc6bee0cd8200912911af49188ace78..aaf0a620890ebaf23af12b5d3b3a42054ade5aa4 100644 (file)
@@ -67,6 +67,7 @@ struct CustomData;
 struct Scene;
 struct MLoopUV;
 struct ReportList;
 struct Scene;
 struct MLoopUV;
 struct ReportList;
+struct BMEditMesh;
 
 #ifdef __cplusplus
 extern "C" {
 
 #ifdef __cplusplus
 extern "C" {
@@ -91,6 +92,9 @@ struct BMesh *BKE_mesh_to_bmesh(
 
 struct Mesh *BKE_bmesh_to_mesh_nomain(struct BMesh *bm, const struct BMeshToMeshParams *params);
 
 
 struct Mesh *BKE_bmesh_to_mesh_nomain(struct BMesh *bm, const struct BMeshToMeshParams *params);
 
+struct Mesh *BKE_mesh_from_editmesh_with_coords_thin_wrap(
+        struct BMEditMesh *em, CustomDataMask data_mask, float (*vertexCos)[3]);
+
 int poly_find_loop_from_vert(
         const struct MPoly *poly,
         const struct MLoop *loopstart, unsigned vert);
 int poly_find_loop_from_vert(
         const struct MPoly *poly,
         const struct MLoop *loopstart, unsigned vert);
index 208803a8de94afcf8c2d7a49a63b149af5bf0444..e5b12b97033bd01c63a80c643646c45e3928d6d1 100644 (file)
@@ -1914,24 +1914,6 @@ bool editbmesh_modifier_is_enabled(Scene *scene, ModifierData *md, bool has_prev
        return true;
 }
 
        return true;
 }
 
-
-/* TODO(campbell): support mesh with only an edit-mesh which is lazy initialized. */
-static Mesh *mesh_from_editmesh_with_coords(
-        BMEditMesh *em, CustomDataMask data_mask, float (*vertexCos)[3])
-{
-       Mesh *me = BKE_bmesh_to_mesh_nomain(
-               em->bm,
-               &(struct BMeshToMeshParams){
-                   .cd_mask_extra = data_mask,
-               });
-       if (vertexCos) {
-               /* We will own this array in the future. */
-               BKE_mesh_apply_vert_coords(me, vertexCos);
-               MEM_freeN(vertexCos);
-       }
-       return me;
-}
-
 static void editbmesh_calc_modifiers(
         struct Depsgraph *depsgraph, Scene *scene, Object *ob,
         BMEditMesh *em, CustomDataMask dataMask,
 static void editbmesh_calc_modifiers(
         struct Depsgraph *depsgraph, Scene *scene, Object *ob,
         BMEditMesh *em, CustomDataMask dataMask,
@@ -1962,7 +1944,7 @@ static void editbmesh_calc_modifiers(
        modifiers_clearErrors(ob);
 
        if (r_cage && cageIndex == -1) {
        modifiers_clearErrors(ob);
 
        if (r_cage && cageIndex == -1) {
-               *r_cage = mesh_from_editmesh_with_coords(em, dataMask, NULL);
+               *r_cage = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, dataMask, NULL);
        }
 
        md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
        }
 
        md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
@@ -2116,7 +2098,7 @@ static void editbmesh_calc_modifiers(
                                        BKE_mesh_runtime_ensure_edit_data(me_orig);
                                        me_orig->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts);
                                }
                                        BKE_mesh_runtime_ensure_edit_data(me_orig);
                                        me_orig->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts);
                                }
-                               *r_cage = mesh_from_editmesh_with_coords(
+                               *r_cage = BKE_mesh_from_editmesh_with_coords_thin_wrap(
                                        em, mask,
                                        deformedVerts ? MEM_dupallocN(deformedVerts) : NULL);
                        }
                                        em, mask,
                                        deformedVerts ? MEM_dupallocN(deformedVerts) : NULL);
                        }
@@ -2160,7 +2142,7 @@ static void editbmesh_calc_modifiers(
                                MEM_freeN((void *)mesh->runtime.edit_data->vertexCos);
                        mesh->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts);
                }
                                MEM_freeN((void *)mesh->runtime.edit_data->vertexCos);
                        mesh->runtime.edit_data->vertexCos = MEM_dupallocN(deformedVerts);
                }
-               *r_final = mesh_from_editmesh_with_coords(em, dataMask, deformedVerts);
+               *r_final = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, dataMask, deformedVerts);
                deformedVerts = NULL;
 
 #if 0
                deformedVerts = NULL;
 
 #if 0
@@ -2616,11 +2598,6 @@ DerivedMesh *editbmesh_get_derived_cage(
        return em->derivedCage;
 }
 
        return em->derivedCage;
 }
 
-DerivedMesh *editbmesh_get_derived_base(Object *obedit, BMEditMesh *em, CustomDataMask data_mask)
-{
-       return getEditDerivedBMesh(em, obedit, data_mask, NULL);
-}
-
 /***/
 
 /* get derived mesh from an object, using editbmesh if available. */
 /***/
 
 /* get derived mesh from an object, using editbmesh if available. */
index 22430a7b1d438910c7e936cdaa0631db90ba9762..55a62e4981f1cec7ccdca82829b3b00bec8ddc68 100644 (file)
@@ -48,6 +48,7 @@
 #include "BKE_multires.h"
 #include "BKE_mesh.h"
 #include "BKE_editmesh.h"
 #include "BKE_multires.h"
 #include "BKE_mesh.h"
 #include "BKE_editmesh.h"
+#include "BKE_library.h"
 
 BLI_INLINE void tan_calc_quat_v3(
         float r_quat[4],
 
 BLI_INLINE void tan_calc_quat_v3(
         float r_quat[4],
@@ -256,7 +257,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
         float (**deformmats)[3][3], float (**deformcos)[3])
 {
        ModifierData *md;
         float (**deformmats)[3][3], float (**deformcos)[3])
 {
        ModifierData *md;
-       DerivedMesh *dm;
+       Mesh *me;
        int i, a, numleft = 0, numVerts = 0;
        int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
        float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
        int i, a, numleft = 0, numVerts = 0;
        int cageIndex = modifiers_getCageIndex(scene, ob, NULL, 1);
        float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
@@ -265,7 +266,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
 
        modifiers_clearErrors(ob);
 
 
        modifiers_clearErrors(ob);
 
-       dm = NULL;
+       me = NULL;
        md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 
        /* compute the deformation matrices and coordinates for the first
        md = modifiers_getVirtualModifierList(ob, &virtualModifierData);
 
        /* compute the deformation matrices and coordinates for the first
@@ -274,7 +275,7 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
        for (i = 0; md && i <= cageIndex; i++, md = md->next) {
                const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
        for (i = 0; md && i <= cageIndex; i++, md = md->next) {
                const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
-               if (!editbmesh_modifier_is_enabled(scene, md, dm != NULL))
+               if (!editbmesh_modifier_is_enabled(scene, md, me != NULL))
                        continue;
 
                if (mti->type == eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
                        continue;
 
                if (mti->type == eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
@@ -285,26 +286,26 @@ int BKE_crazyspace_get_first_deform_matrices_editbmesh(
                                data_mask = datamasks->mask;
                                BLI_linklist_free((LinkNode *)datamasks, NULL);
 
                                data_mask = datamasks->mask;
                                BLI_linklist_free((LinkNode *)datamasks, NULL);
 
-                               dm = getEditDerivedBMesh(em, ob, data_mask, NULL);
+                               me = BKE_mesh_from_editmesh_with_coords_thin_wrap(em, data_mask, NULL);
                                deformedVerts = editbmesh_get_vertex_cos(em, &numVerts);
                                defmats = MEM_mallocN(sizeof(*defmats) * numVerts, "defmats");
 
                                for (a = 0; a < numVerts; a++)
                                        unit_m3(defmats[a]);
                        }
                                deformedVerts = editbmesh_get_vertex_cos(em, &numVerts);
                                defmats = MEM_mallocN(sizeof(*defmats) * numVerts, "defmats");
 
                                for (a = 0; a < numVerts; a++)
                                        unit_m3(defmats[a]);
                        }
-
-                       modifier_deformMatricesEM_DM_deprecated(md, &mectx, em, dm, deformedVerts, defmats, numVerts);
+                       mti->deformMatricesEM(md, &mectx, em, me, deformedVerts, defmats, numVerts);
                }
                else
                        break;
        }
 
        for (; md && i <= cageIndex; md = md->next, i++)
                }
                else
                        break;
        }
 
        for (; md && i <= cageIndex; md = md->next, i++)
-               if (editbmesh_modifier_is_enabled(scene, md, dm != NULL) && modifier_isCorrectableDeformed(md))
+               if (editbmesh_modifier_is_enabled(scene, md, me != NULL) && modifier_isCorrectableDeformed(md))
                        numleft++;
 
                        numleft++;
 
-       if (dm)
-               dm->release(dm);
+       if (me) {
+               BKE_id_free(NULL, me);
+       }
 
        *deformmats = defmats;
        *deformcos = deformedVerts;
 
        *deformmats = defmats;
        *deformcos = deformedVerts;
index 374365cc58a1ac430356fd6e0b94d1d95962b16e..e3fc2926cfc9205a82e40106fb7d83e99983e70c 100644 (file)
@@ -756,6 +756,25 @@ Mesh *BKE_bmesh_to_mesh_nomain(BMesh *bm, const struct BMeshToMeshParams *params
        return mesh;
 }
 
        return mesh;
 }
 
+/**
+ * TODO(campbell): support mesh with only an edit-mesh which is lazy initialized.
+ */
+Mesh *BKE_mesh_from_editmesh_with_coords_thin_wrap(
+        BMEditMesh *em, CustomDataMask data_mask, float (*vertexCos)[3])
+{
+       Mesh *me = BKE_bmesh_to_mesh_nomain(
+               em->bm,
+               &(struct BMeshToMeshParams){
+                   .cd_mask_extra = data_mask,
+               });
+       if (vertexCos) {
+               /* We will own this array in the future. */
+               BKE_mesh_apply_vert_coords(me, vertexCos);
+               MEM_freeN(vertexCos);
+       }
+       return me;
+}
+
 void BKE_mesh_make_local(Main *bmain, Mesh *me, const bool lib_local)
 {
        BKE_id_make_local_generic(bmain, &me->id, true, lib_local);
 void BKE_mesh_make_local(Main *bmain, Mesh *me, const bool lib_local)
 {
        BKE_id_make_local_generic(bmain, &me->id, true, lib_local);