[Bf-blender-cvs] [be8016908db] blender2.8: Mesh: Replace DM for mesh -> curve conversion

Campbell Barton noreply at git.blender.org
Fri Jun 1 14:02:08 CEST 2018


Commit: be8016908db2caa5055351ff6b257fd69c18b5cf
Author: Campbell Barton
Date:   Fri Jun 1 13:48:39 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBbe8016908db2caa5055351ff6b257fd69c18b5cf

Mesh: Replace DM for mesh -> curve conversion

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

M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/mesh_convert.c
M	source/blender/editors/mesh/editmesh_knife_project.c

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

diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index e9ace0bb19b..d3b492983de 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -142,7 +142,7 @@ int BKE_mesh_nurbs_displist_to_mdata(
 void BKE_mesh_from_nurbs_displist(
         struct Object *ob, struct ListBase *dispbase, const bool use_orco_uv, const char *obdata_name, bool temporary);
 void BKE_mesh_from_nurbs(struct Object *ob);
-void BKE_mesh_to_curve_nurblist(struct DerivedMesh *dm, struct ListBase *nurblist, const int edge_users_test);
+void BKE_mesh_to_curve_nurblist(const struct Mesh *me, struct ListBase *nurblist, const int edge_users_test);
 void BKE_mesh_to_curve(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob);
 void BKE_mesh_material_index_remove(struct Mesh *me, short index);
 void BKE_mesh_material_index_clear(struct Mesh *me);
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) {
diff --git a/source/blender/editors/mesh/editmesh_knife_project.c b/source/blender/editors/mesh/editmesh_knife_project.c
index ba030c42a04..5a61c5aab48 100644
--- a/source/blender/editors/mesh/editmesh_knife_project.c
+++ b/source/blender/editors/mesh/editmesh_knife_project.c
@@ -62,27 +62,28 @@ static LinkNode *knifeproject_poly_from_object(const bContext *C, Scene *scene,
 {
 	Depsgraph *depsgraph = CTX_data_depsgraph(C);
 	ARegion *ar = CTX_wm_region(C);
-	DerivedMesh *dm;
-	bool dm_needsFree;
+	struct Mesh *me_eval;
+	bool me_eval_needs_free;
 
 	if (ob->type == OB_MESH || ob->derivedFinal) {
-		dm = ob->derivedFinal ? ob->derivedFinal : mesh_get_derived_final(depsgraph, scene, ob, CD_MASK_BAREMESH);
-		dm_needsFree = false;
+		me_eval = (ob->runtime.mesh_eval ?
+		           ob->runtime.mesh_eval : mesh_get_eval_final(depsgraph, scene, ob, CD_MASK_BAREMESH));
+		me_eval_needs_free = false;
 	}
 	else if (ELEM(ob->type, OB_FONT, OB_CURVE, OB_SURF)) {
-		dm = CDDM_from_curve(ob);
-		dm_needsFree = true;
+		me_eval = BKE_mesh_new_nomain_from_curve(ob);
+		me_eval_needs_free = true;
 	}
 	else {
-		dm = NULL;
+		me_eval = NULL;
 	}
 
-	if (dm) {
+	if (me_eval) {
 		ListBase nurbslist = {NULL, NULL};
 		float projmat[4][4];
 
-		BKE_mesh_to_curve_nurblist(dm, &nurbslist, 0);  /* wire */
-		BKE_mesh_to_curve_nurblist(dm, &nurbslist, 1);  /* boundary */
+		BKE_mesh_to_curve_nurblist(me_eval, &nurbslist, 0);  /* wire */
+		BKE_mesh_to_curve_nurblist(me_eval, &nurbslist, 1);  /* boundary */
 
 		ED_view3d_ob_project_mat_get(ar->regiondata, ob, projmat);
 
@@ -109,12 +110,11 @@ static LinkNode *knifeproject_poly_from_object(const bContext *C, Scene *scene,
 
 		BKE_nurbList_free(&nurbslist);
 
-		if (dm_needsFree) {
-			dm->release(dm);
+		if (me_eval_needs_free) {
+			BKE_mesh_free(me_eval);
 		}
 	}
 
-
 	return polys;
 }



More information about the Bf-blender-cvs mailing list