Commit: a2438373b317005c19288d183af4b08f54f80428
Author: Sybren A. Stüvel
Date:   Thu May 17 15:26:59 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBa2438373b317005c19288d183af4b08f54f80428

Modifiers: ported Collision DerivedMesh → Mesh

===================================================================

M       source/blender/blenkernel/BKE_mesh.h
M       source/blender/blenkernel/intern/mesh_runtime.c
M       source/blender/modifiers/intern/MOD_collision.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_mesh.h 
b/source/blender/blenkernel/BKE_mesh.h
index 25b91be3791..f1326974f10 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -54,6 +54,7 @@ struct MLoop;
 struct MFace;
 struct MEdge;
 struct MVert;
+struct MVertTri;
 struct MDeformVert;
 struct MDisps;
 struct Object;
@@ -201,6 +202,11 @@ bool                   
BKE_mesh_runtime_clear_edit_data(struct Mesh *mesh);
 void                   BKE_mesh_runtime_clear_geometry(struct Mesh *mesh);
 void                   BKE_mesh_runtime_clear_cache(struct Mesh *mesh);
 
+void BKE_mesh_runtime_verttri_from_looptri(
+        struct MVertTri *r_verttri,
+        const struct MLoop *mloop, const struct MLoopTri *looptri, int 
looptri_num);
+
+
 /* *** mesh_evaluate.c *** */
 
 void BKE_mesh_calc_normals_mapping(
diff --git a/source/blender/blenkernel/intern/mesh_runtime.c 
b/source/blender/blenkernel/intern/mesh_runtime.c
index 577b7327181..c8416811694 100644
--- a/source/blender/blenkernel/intern/mesh_runtime.c
+++ b/source/blender/blenkernel/intern/mesh_runtime.c
@@ -144,6 +144,19 @@ const MLoopTri *BKE_mesh_runtime_looptri_ensure(Mesh *mesh)
        return looptri;
 }
 
+/* This is a copy of DM_verttri_from_looptri(). */
+void BKE_mesh_runtime_verttri_from_looptri(MVertTri *r_verttri, const MLoop 
*mloop,
+                                           const MLoopTri *looptri, int 
looptri_num)
+{
+       int i;
+       for (i = 0; i < looptri_num; i++) {
+               r_verttri[i].tri[0] = mloop[looptri[i].tri[0]].v;
+               r_verttri[i].tri[1] = mloop[looptri[i].tri[1]].v;
+               r_verttri[i].tri[2] = mloop[looptri[i].tri[2]].v;
+       }
+}
+
+
 bool BKE_mesh_runtime_ensure_edit_data(struct Mesh *mesh)
 {
        if (mesh->runtime.edit_data != NULL) {
diff --git a/source/blender/modifiers/intern/MOD_collision.c 
b/source/blender/modifiers/intern/MOD_collision.c
index c9037074ecc..036954a2774 100644
--- a/source/blender/modifiers/intern/MOD_collision.c
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -33,6 +33,7 @@
  */
 
 #include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 
 #include "MEM_guardedalloc.h"
@@ -41,13 +42,17 @@
 #include "BLI_utildefines.h"
 
 #include "BKE_collision.h"
-#include "BKE_cdderivedmesh.h"
 #include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_mesh.h"
 #include "BKE_modifier.h"
 #include "BKE_pointcache.h"
 #include "BKE_scene.h"
 
 #include "MOD_modifiertypes.h"
+#include "MOD_util.h"
+
+#include "DEG_depsgraph_query.h"
 
 static void initData(ModifierData *md) 
 {
@@ -97,37 +102,48 @@ static bool dependsOnTime(ModifierData *UNUSED(md))
 
 static void deformVerts(
         ModifierData *md, const ModifierEvalContext *ctx,
-        DerivedMesh *derivedData,
+        Mesh *mesh,
         float (*vertexCos)[3],
         int UNUSED(numVerts))
 {
        CollisionModifierData *collmd = (CollisionModifierData *) md;
-       DerivedMesh *dm = NULL;
+       Mesh *mesh_src;
        MVert *tempVert = NULL;
        Object *ob = ctx->object;
        
-       /* if possible use/create DerivedMesh */
-       if (derivedData) dm = CDDM_copy(derivedData);
-       else if (ob->type == OB_MESH) dm = CDDM_from_mesh(ob->data);
-       
+       if (mesh == NULL) {
+               mesh_src = get_mesh(ob, NULL, NULL, NULL, false, false);
+       }
+       else {
+               /* Not possible to use get_mesh() in this case as we'll modify 
its vertices
+                * and get_mesh() would return 'mesh' directly. */
+               BKE_id_copy_ex(
+                       NULL, (ID *)mesh, (ID **)&mesh_src,
+                       LIB_ID_CREATE_NO_MAIN |
+                       LIB_ID_CREATE_NO_USER_REFCOUNT |
+                       LIB_ID_CREATE_NO_DEG_TAG |
+                       LIB_ID_COPY_NO_PREVIEW,
+                       false);
+       }
+
        if (!ob->pd) {
                printf("CollisionModifier deformVerts: Should not happen!\n");
                return;
        }
        
-       if (dm) {
+       if (mesh_src) {
                float current_time = 0;
                unsigned int mvert_num = 0;
 
-               CDDM_apply_vert_coords(dm, vertexCos);
-               CDDM_calc_normals(dm);
+               BKE_mesh_apply_vert_coords(mesh_src, vertexCos);
+               BKE_mesh_calc_normals(mesh_src);
                
                current_time = DEG_get_ctime(ctx->depsgraph);
                
                if (G.debug_value > 0)
                        printf("current_time %f, collmd->time_xnew %f\n", 
current_time, collmd->time_xnew);
                
-               mvert_num = dm->getNumVerts(dm);
+               mvert_num = mesh_src->totvert;
                
                if (current_time > collmd->time_xnew) {
                        unsigned int i;
@@ -138,7 +154,7 @@ static void deformVerts(
 
                        if (collmd->time_xnew == -1000) { /* first time */
 
-                               collmd->x = dm->dupVertArray(dm); /* frame 
start position */
+                               collmd->x = MEM_dupallocN(mesh_src->mvert); /* 
frame start position */
 
                                for (i = 0; i < mvert_num; i++) {
                                        /* we save global positions */
@@ -152,12 +168,12 @@ static void deformVerts(
 
                                collmd->mvert_num = mvert_num;
 
-                               collmd->tri_num = dm->getNumLoopTri(dm);
                                {
-                                       const MLoop *mloop = 
dm->getLoopArray(dm);
-                                       const MLoopTri *looptri = 
dm->getLoopTriArray(dm);
+                                       const MLoop *mloop = mesh_src->mloop;
+                                       const MLoopTri *looptri = 
BKE_mesh_runtime_looptri_ensure(mesh_src);
+                                       collmd->tri_num = 
BKE_mesh_runtime_looptri_len(mesh_src);
                                        MVertTri *tri = 
MEM_malloc_arrayN(collmd->tri_num, sizeof(*tri), __func__);
-                                       DM_verttri_from_looptri(tri, mloop, 
looptri, collmd->tri_num);
+                                       
BKE_mesh_runtime_verttri_from_looptri(tri, mloop, looptri, collmd->tri_num);
                                        collmd->tri = tri;
                                }
 
@@ -177,7 +193,7 @@ static void deformVerts(
                                collmd->xnew = tempVert;
                                collmd->time_x = collmd->time_xnew;
 
-                               memcpy(collmd->xnew, dm->getVertArray(dm), 
mvert_num * sizeof(MVert));
+                               memcpy(collmd->xnew, mesh_src->mvert, mvert_num 
* sizeof(MVert));
 
                                bool is_static = true;
 
@@ -238,8 +254,9 @@ static void deformVerts(
                }
        }
        
-       if (dm)
-               dm->release(dm);
+       if (mesh_src != mesh) {
+               BKE_id_free(NULL, mesh_src);
+       }
 }
 
 
@@ -253,14 +270,14 @@ ModifierTypeInfo modifierType_Collision = {
 
        /* copyData */          NULL,
 
-       /* deformVerts_DM */    deformVerts,
+       /* deformVerts_DM */    NULL,
        /* deformMatrices_DM */ NULL,
        /* deformVertsEM_DM */  NULL,
        /* deformMatricesEM_DM*/NULL,
        /* applyModifier_DM */  NULL,
        /* applyModifierEM_DM */NULL,
 
-       /* deformVerts */       NULL,
+       /* deformVerts */       deformVerts,
        /* deformMatrices */    NULL,
        /* deformVertsEM */     NULL,
        /* deformMatricesEM */  NULL,

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to