diff options
author | Sybren A. Stüvel <sybren@stuvel.eu> | 2018-05-17 16:26:59 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@stuvel.eu> | 2018-05-17 16:28:51 +0300 |
commit | a2438373b317005c19288d183af4b08f54f80428 (patch) | |
tree | cb93bdacc7d33fc38ed5de253ab4853aa1aa55ae | |
parent | c48a3afb166b38bbdf55c3e6d317ef85f90d18bf (diff) |
Modifiers: ported Collision DerivedMesh → Mesh
-rw-r--r-- | source/blender/blenkernel/BKE_mesh.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_runtime.c | 13 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_collision.c | 59 |
3 files changed, 57 insertions, 21 deletions
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, |