diff options
-rw-r--r-- | source/blender/blenkernel/BKE_cdderivedmesh.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 17 |
3 files changed, 14 insertions, 15 deletions
diff --git a/source/blender/blenkernel/BKE_cdderivedmesh.h b/source/blender/blenkernel/BKE_cdderivedmesh.h index 4876461bfe0..61810a5f029 100644 --- a/source/blender/blenkernel/BKE_cdderivedmesh.h +++ b/source/blender/blenkernel/BKE_cdderivedmesh.h @@ -53,6 +53,10 @@ struct DerivedMesh *CDDM_new(int numVerts, int numEdges, int numFaces, * data to not overwrite the original */ struct DerivedMesh *CDDM_from_mesh(struct Mesh *mesh); +/* creates a CDDerivedMesh from the given Mesh with custom allocation type. */ +struct DerivedMesh *CDDM_from_mesh_ex(struct Mesh *mesh, int alloctype); + + struct DerivedMesh *CDDM_from_bmesh(struct BMesh *bm, const bool use_mdisps); /* creates a CDDerivedMesh from the given BMEditMesh */ diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index fd076a4e5c6..4d91d99b022 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -594,10 +594,14 @@ DerivedMesh *CDDM_new(int numVerts, int numEdges, int numTessFaces, int numLoops DerivedMesh *CDDM_from_mesh(Mesh *mesh) { + return CDDM_from_mesh_ex(mesh, CD_REFERENCE); +} + +DerivedMesh *CDDM_from_mesh_ex(Mesh *mesh, int alloctype) +{ CDDerivedMesh *cddm = cdDM_create(__func__); DerivedMesh *dm = &cddm->dm; CustomDataMask mask = CD_MASK_MESH & (~CD_MASK_MDISPS); - int alloctype; /* this does a referenced copy, with an exception for fluidsim */ @@ -607,8 +611,6 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh) dm->deformedOnly = 1; dm->cd_flag = mesh->cd_flag; - alloctype = CD_REFERENCE; - CustomData_merge(&mesh->vdata, &dm->vertData, mask, alloctype, mesh->totvert); CustomData_merge(&mesh->edata, &dm->edgeData, mask, alloctype, diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 42ebce44b07..eafa7292908 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -1123,11 +1123,8 @@ struct DerivedMesh *modifier_applyModifier_DM_deprecated(struct ModifierData *md struct Mesh *new_mesh = mti->applyModifier(md, depsgraph, ob, mesh, flag); - DerivedMesh *ndm = CDDM_from_mesh(new_mesh); /* Make a DM that doesn't reference new_mesh so we can free the latter. */ - /* TODO(sybren): create CDDM_from_mesh_ex() that creates a copy directly. */ - DerivedMesh *nonref_dm = CDDM_copy(ndm); - ndm->release(ndm); + DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE); if(new_mesh != mesh) { BKE_mesh_free(new_mesh); @@ -1138,7 +1135,7 @@ struct DerivedMesh *modifier_applyModifier_DM_deprecated(struct ModifierData *md MEM_freeN(mesh); } - return nonref_dm; + return ndm; } } @@ -1162,14 +1159,10 @@ struct DerivedMesh *modifier_applyModifierEM_DM_deprecated(struct ModifierData * struct Mesh *new_mesh = mti->applyModifierEM(md, depsgraph, ob, editData, mesh, flag); - DerivedMesh *ndm = CDDM_from_mesh(new_mesh); - if(new_mesh != mesh) { - /* Make a DM that doesn't reference new_mesh so we can free the latter. */ - /* TODO(sybren): create CDDM_from_mesh_ex() that creates a copy directly. */ - DerivedMesh *nonref_dm = CDDM_copy(ndm); - ndm->release(ndm); - ndm = nonref_dm; + /* Make a DM that doesn't reference new_mesh so we can free the latter. */ + DerivedMesh *ndm = CDDM_from_mesh_ex(new_mesh, CD_DUPLICATE); + if(new_mesh != mesh) { BKE_mesh_free(new_mesh); MEM_freeN(new_mesh); } |