diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-06-01 14:48:39 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-06-01 15:01:44 +0300 |
commit | be8016908db2caa5055351ff6b257fd69c18b5cf (patch) | |
tree | fda5c41d566f90d89383818eaac898f278094c8b /source/blender/blenkernel/intern/mesh_convert.c | |
parent | 4faf9bfbe9d1502d32a62738ebb488710a43c27a (diff) |
Mesh: Replace DM for mesh -> curve conversion
Diffstat (limited to 'source/blender/blenkernel/intern/mesh_convert.c')
-rw-r--r-- | source/blender/blenkernel/intern/mesh_convert.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/mesh_convert.c b/source/blender/blenkernel/intern/mesh_convert.c index 14f563d6053..4af97048faa 100644 --- a/source/blender/blenkernel/intern/mesh_convert.c +++ b/source/blender/blenkernel/intern/mesh_convert.c @@ -669,15 +669,15 @@ static void appendPolyLineVert(ListBase *lb, unsigned int index) BLI_addtail(lb, vl); } -void BKE_mesh_to_curve_nurblist(DerivedMesh *dm, ListBase *nurblist, const int edge_users_test) +void BKE_mesh_to_curve_nurblist(const Mesh *me, ListBase *nurblist, const int edge_users_test) { - MVert *mvert = dm->getVertArray(dm); - MEdge *med, *medge = dm->getEdgeArray(dm); - MPoly *mp, *mpoly = dm->getPolyArray(dm); - MLoop *mloop = dm->getLoopArray(dm); + MVert *mvert = me->mvert; + MEdge *med, *medge = me->medge; + MPoly *mp, *mpoly = me->mpoly; + MLoop *mloop = me->mloop; - int dm_totedge = dm->getNumEdges(dm); - int dm_totpoly = dm->getNumPolys(dm); + int dm_totedge = me->totedge; + int dm_totpoly = me->totpoly; int totedges = 0; int i; @@ -805,12 +805,12 @@ void BKE_mesh_to_curve_nurblist(DerivedMesh *dm, ListBase *nurblist, const int e void BKE_mesh_to_curve(Depsgraph *depsgraph, Scene *scene, Object *ob) { /* make new mesh data from the original copy */ - DerivedMesh *dm = mesh_get_derived_final(depsgraph, scene, ob, CD_MASK_MESH); + Mesh *me_eval = mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_MESH); ListBase nurblist = {NULL, NULL}; bool needsFree = false; - BKE_mesh_to_curve_nurblist(dm, &nurblist, 0); - BKE_mesh_to_curve_nurblist(dm, &nurblist, 1); + BKE_mesh_to_curve_nurblist(me_eval, &nurblist, 0); + BKE_mesh_to_curve_nurblist(me_eval, &nurblist, 1); if (nurblist.first) { Curve *cu = BKE_curve_add(G.main, ob->id.name + 2, OB_CURVE); @@ -826,11 +826,20 @@ void BKE_mesh_to_curve(Depsgraph *depsgraph, Scene *scene, Object *ob) needsFree = true; } - dm->needsFree = needsFree; - dm->release(dm); + /* Just to avoid dangling pointer, dm will be removed. */ + { + DerivedMesh *dm = ob->derivedFinal; + if (dm != NULL) { + dm->needsFree = needsFree; + dm->release(dm); + } + } if (needsFree) { + BKE_mesh_free(me_eval); + ob->derivedFinal = NULL; + ob->runtime.mesh_eval = NULL; /* curve object could have got bounding box only in special cases */ if (ob->bb) { |