[Bf-blender-cvs] [31d916210c4] blender2.8: Cleanup: remove DM from 'join as shape' operator.

Bastien Montagne noreply at git.blender.org
Thu Jun 21 18:28:03 CEST 2018


Commit: 31d916210c4e70e8c2dcb54fe0d4d2ba6940842f
Author: Bastien Montagne
Date:   Thu Jun 21 18:24:32 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB31d916210c4e70e8c2dcb54fe0d4d2ba6940842f

Cleanup: remove DM from 'join as shape' operator.

Also deduplicated the 'mesh as shapekey' code, we had kind of two funcs
doing the same thing here...

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

M	source/blender/blenkernel/BKE_DerivedMesh.h
M	source/blender/blenkernel/BKE_key.h
M	source/blender/blenkernel/BKE_mesh_runtime.h
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/key.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/collada/ArmatureImporter.cpp
M	source/blender/editors/mesh/meshtools.c
M	source/blender/editors/object/object_modifier.c

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

diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 02410f624da..0349c09ef13 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -387,9 +387,6 @@ void          DM_to_bmesh_ex(struct DerivedMesh *dm, struct BMesh *bm, const boo
 struct BMesh *DM_to_bmesh(struct DerivedMesh *dm, const bool calc_face_normal);
 
 
-/** Utility function to convert a DerivedMesh to a shape key block */
-void DM_to_meshkey(DerivedMesh *dm, struct Mesh *me, struct KeyBlock *kb);
-
 void DM_set_only_copy(DerivedMesh *dm, CustomDataMask mask);
 
 /* adds a vertex/edge/face custom data layer to a DerivedMesh, optionally
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h
index 2f953e57d71..0af608a926d 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -102,7 +102,7 @@ void    BKE_keyblock_convert_from_curve(struct Curve *cu, struct KeyBlock *kb, s
 void    BKE_keyblock_convert_to_curve(struct KeyBlock *kb, struct Curve  *cu, struct ListBase *nurb);
 
 void    BKE_keyblock_update_from_mesh(struct Mesh *me, struct KeyBlock *kb);
-void    BKE_keyblock_convert_from_mesh(struct Mesh *me, struct KeyBlock *kb);
+void    BKE_keyblock_convert_from_mesh(struct Mesh *me, struct Key *key, struct KeyBlock *kb);
 void    BKE_keyblock_convert_to_mesh(struct KeyBlock *kb, struct Mesh *me);
 void    BKE_keyblock_mesh_calc_normals(
         struct KeyBlock *kb, struct Mesh *mesh, float (*r_vertnors)[3], float (*r_polynors)[3], float (*r_loopnors)[3]);
diff --git a/source/blender/blenkernel/BKE_mesh_runtime.h b/source/blender/blenkernel/BKE_mesh_runtime.h
index 6904ad529de..34b9440b5c4 100644
--- a/source/blender/blenkernel/BKE_mesh_runtime.h
+++ b/source/blender/blenkernel/BKE_mesh_runtime.h
@@ -36,6 +36,7 @@
 #include "BKE_customdata.h"  /* for CustomDataMask */
 
 struct Depsgraph;
+struct KeyBlock;
 struct Mesh;
 struct MLoop;
 struct MLoopTri;
@@ -82,4 +83,7 @@ struct Mesh *mesh_get_eval_deform(
         struct Depsgraph *depsgraph, struct Scene *scene,
         struct Object *ob, CustomDataMask dataMask);
 
+void BKE_mesh_runtime_eval_to_meshkey(struct Mesh *me_deformed, struct Mesh *me, struct KeyBlock *kb);
+
+
 #endif /* __BKE_MESH_RUNTIME_H__ */
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 5a4dc479c10..4988bd41b23 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -856,26 +856,18 @@ void DM_to_mesh(DerivedMesh *dm, Mesh *me, Object *ob, CustomDataMask mask, bool
 	}
 }
 
-void DM_to_meshkey(DerivedMesh *dm, Mesh *me, KeyBlock *kb)
+/** Utility function to convert an (evaluated) Mesh to a shape key block. */
+/* Just a shallow wrapper around BKE_keyblock_convert_from_mesh,
+ * that ensures both evaluated mesh and original one has same number of vertices. */
+void BKE_mesh_runtime_eval_to_meshkey(Mesh *me_deformed, Mesh *me, KeyBlock *kb)
 {
-	int a, totvert = dm->getNumVerts(dm);
-	float *fp;
-	MVert *mvert;
+	const int totvert = me_deformed->totvert;
 
 	if (totvert == 0 || me->totvert == 0 || me->totvert != totvert) {
 		return;
 	}
 
-	if (kb->data) MEM_freeN(kb->data);
-	kb->data = MEM_malloc_arrayN(me->key->elemsize, me->totvert, "kb->data");
-	kb->totelem = totvert;
-
-	fp = kb->data;
-	mvert = dm->getVertDataArray(dm, CD_MVERT);
-
-	for (a = 0; a < kb->totelem; a++, fp += 3, mvert++) {
-		copy_v3_v3(fp, mvert->co);
-	}
+	BKE_keyblock_convert_from_mesh(me_deformed, me->key, kb);
 }
 
 /**
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 4689575655e..13f7716cd80 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -1767,16 +1767,16 @@ void BKE_keyblock_update_from_mesh(Mesh *me, KeyBlock *kb)
 	}
 }
 
-void BKE_keyblock_convert_from_mesh(Mesh *me, KeyBlock *kb)
+void BKE_keyblock_convert_from_mesh(Mesh *me, Key *key, KeyBlock *kb)
 {
-	int tot = me->totvert;
+	const int len = me->totvert;
 
 	if (me->totvert == 0) return;
 
 	MEM_SAFE_FREE(kb->data);
 
-	kb->data = MEM_mallocN(me->key->elemsize * tot, __func__);
-	kb->totelem = tot;
+	kb->data = MEM_malloc_arrayN((size_t)len, (size_t)key->elemsize, __func__);
+	kb->totelem = len;
 
 	BKE_keyblock_update_from_mesh(me, kb);
 }
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index c80c679ab73..b389e211e00 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -2956,7 +2956,7 @@ static KeyBlock *insert_meshkey(Main *bmain, Object *ob, const char *name, const
 	if (newkey || from_mix == false) {
 		/* create from mesh */
 		kb = BKE_keyblock_add_ctime(key, name, false);
-		BKE_keyblock_convert_from_mesh(me, kb);
+		BKE_keyblock_convert_from_mesh(me, key, kb);
 	}
 	else {
 		/* copy from current values */
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp
index 2f5c3237bf6..d3370172f60 100644
--- a/source/blender/collada/ArmatureImporter.cpp
+++ b/source/blender/collada/ArmatureImporter.cpp
@@ -882,7 +882,7 @@ void ArmatureImporter::make_shape_keys(bContext *C)
 
 			//insert basis key
 			kb = BKE_keyblock_add_ctime(key, "Basis", false);
-			BKE_keyblock_convert_from_mesh(source_me, kb);
+			BKE_keyblock_convert_from_mesh(source_me, key, kb);
 
 			//insert other shape keys
 			for (int i = 0 ; i < morphTargetIds.getCount() ; i++ ) {
@@ -896,7 +896,7 @@ void ArmatureImporter::make_shape_keys(bContext *C)
 					std::string morph_name = *this->mesh_importer->get_geometry_name(me->id.name);
 
 					kb = BKE_keyblock_add_ctime(key, morph_name.c_str(), false);
-					BKE_keyblock_convert_from_mesh(me, kb);
+					BKE_keyblock_convert_from_mesh(me, key, kb);
 
 					//apply weights
 					weight =  morphWeights.getFloatValues()->getData()[i];
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 6c8de1a481e..4549c0bccbf 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -612,7 +612,7 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
 	Depsgraph *depsgraph = CTX_data_depsgraph(C);
 	Mesh *me = (Mesh *)ob->data;
 	Mesh *selme = NULL;
-	DerivedMesh *dm = NULL;
+	Mesh *me_deformed = NULL;
 	Key *key = me->key;
 	KeyBlock *kb;
 	bool ok = false, nonequal_verts = false;
@@ -646,7 +646,7 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
 
 		/* first key added, so it was the basis. initialize it with the existing mesh */
 		kb = BKE_keyblock_add(key, NULL);
-		BKE_keyblock_convert_from_mesh(me, kb);
+		BKE_keyblock_convert_from_mesh(me, key, kb);
 	}
 
 	/* now ready to add new keys from selected meshes */
@@ -658,15 +658,15 @@ int join_mesh_shapes_exec(bContext *C, wmOperator *op)
 			selme = (Mesh *)base->object->data;
 
 			if (selme->totvert == me->totvert) {
-				dm = mesh_get_derived_deform(depsgraph, scene, base->object, CD_MASK_BAREMESH);
+				me_deformed = mesh_get_eval_deform(depsgraph, scene, base->object, CD_MASK_BAREMESH);
 
-				if (!dm) continue;
+				if (!me_deformed) {
+					continue;
+				}
 
 				kb = BKE_keyblock_add(key, base->object->id.name + 2);
 
-				DM_to_meshkey(dm, me, kb);
-
-				dm->release(dm);
+				BKE_mesh_runtime_eval_to_meshkey(me_deformed, me, kb);
 			}
 		}
 	}
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 69c71688406..29ccd985029 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -568,7 +568,7 @@ static int modifier_apply_shape(
 			/* if that was the first key block added, then it was the basis.
 			 * Initialize it with the mesh, and add another for the modifier */
 			kb = BKE_keyblock_add(key, NULL);
-			BKE_keyblock_convert_from_mesh(me, kb);
+			BKE_keyblock_convert_from_mesh(me, key, kb);
 		}
 
 		kb = BKE_keyblock_add(key, md->name);



More information about the Bf-blender-cvs mailing list