[Bf-blender-cvs] [989b7d3] mesh-transfer-data: Add helpers to vgroup to fill an array of weights from a given vgroup (for verts/edges/loops/polys).

Bastien Montagne noreply at git.blender.org
Tue Nov 4 15:49:28 CET 2014


Commit: 989b7d30058f4b03146e324b58a5cf15d277d737
Author: Bastien Montagne
Date:   Tue Nov 4 15:44:52 2014 +0100
Branches: mesh-transfer-data
https://developer.blender.org/rB989b7d30058f4b03146e324b58a5cf15d277d737

Add helpers to vgroup to fill an array of weights from a given vgroup (for verts/edges/loops/polys).

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

M	source/blender/blenkernel/BKE_deform.h
M	source/blender/blenkernel/intern/deform.c

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

diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h
index e203549..f34e443 100644
--- a/source/blender/blenkernel/BKE_deform.h
+++ b/source/blender/blenkernel/BKE_deform.h
@@ -39,6 +39,10 @@ struct Object;
 struct ListBase;
 struct bDeformGroup;
 struct MDeformVert;
+struct MVert;
+struct MEdge;
+struct MLoop;
+struct MPoly;
 
 struct bDeformGroup *BKE_defgroup_new(struct Object *ob, const char *name);
 void                 defgroup_copy_list(struct ListBase *lb1, struct ListBase *lb2);
@@ -85,6 +89,19 @@ void defvert_normalize_lock_map(struct MDeformVert *dvert,
                                 const bool *vgroup_subset, const int vgroup_tot,
                                 const bool *lock_flags, const int defbase_tot);
 
+/* Utilities to 'extract' a given vgroup into a simple float array, for verts, but also edges/polys/loops. */
+void BKE_defvert_extract_vgroup_to_vertweights(
+        struct MDeformVert *dvert, const int defgroup, const int num_verts, float *r_weights);
+void BKE_defvert_extract_vgroup_to_edgeweights(
+        struct MDeformVert *dvert, const int defgroup, const int num_verts, struct MEdge *edges, const int num_edges,
+        float *r_weights);
+void BKE_defvert_extract_vgroup_to_loopweights(
+        struct MDeformVert *dvert, const int defgroup, const int num_verts, struct MLoop *loops, const int num_loops,
+        float *r_weights);
+void BKE_defvert_extract_vgroup_to_polyweights(
+        struct MDeformVert *dvert, const int defgroup, const int num_verts, struct MLoop *loops, const int num_loops,
+        struct MPoly *polys, const int num_polys, float *r_weights);
+
 /* utility function, note that MAX_VGROUP_NAME chars is the maximum string length since its only
  * used with defgroups currently */
 
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index 528ff2d..a8d3405 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -960,3 +960,96 @@ void BKE_defvert_array_free(MDeformVert *dvert, int totvert)
 
 	MEM_freeN(dvert);
 }
+
+void BKE_defvert_extract_vgroup_to_vertweights(
+        MDeformVert *dvert, const int defgroup, const int num_verts, float *r_weights)
+{
+	if (dvert && defgroup != -1) {
+		int i = num_verts;
+
+		while (i--) {
+			r_weights[i] = defvert_find_weight(&dvert[i], defgroup);
+		}
+	}
+	else {
+		fill_vn_fl(r_weights, 0.0f, num_verts);
+	}
+}
+
+/* The following three make basic interpolation, using temp vert_weights array to avoid looking up same weight
+ * several times. */
+
+void BKE_defvert_extract_vgroup_to_edgeweights(
+        MDeformVert *dvert, const int defgroup, const int num_verts, MEdge *edges, const int num_edges,
+        float *r_weights)
+{
+	if (dvert && defgroup != -1) {
+		int i = num_edges;
+		float *tmp_weights = MEM_mallocN(sizeof(*tmp_weights) * (size_t)num_verts, __func__);
+
+		BKE_defvert_extract_vgroup_to_vertweights(dvert, defgroup, num_verts, tmp_weights);
+
+		while (i--) {
+			MEdge *me = &edges[i];
+
+			r_weights[i] = (tmp_weights[me->v1] + tmp_weights[me->v2]) * 0.5f;
+		}
+
+		MEM_freeN(tmp_weights);
+	}
+	else {
+		fill_vn_fl(r_weights, 0.0f, num_edges);
+	}
+}
+
+void BKE_defvert_extract_vgroup_to_loopweights(
+        MDeformVert *dvert, const int defgroup, const int num_verts, MLoop *loops, const int num_loops,
+        float *r_weights)
+{
+	if (dvert && defgroup != -1) {
+		int i = num_loops;
+		float *tmp_weights = MEM_mallocN(sizeof(*tmp_weights) * (size_t)num_verts, __func__);
+
+		BKE_defvert_extract_vgroup_to_vertweights(dvert, defgroup, num_verts, tmp_weights);
+
+		while (i--) {
+			MLoop *ml = &loops[i];
+
+			r_weights[i] = tmp_weights[ml->v];
+		}
+
+		MEM_freeN(tmp_weights);
+	}
+	else {
+		fill_vn_fl(r_weights, 0.0f, num_loops);
+	}
+}
+
+void BKE_defvert_extract_vgroup_to_polyweights(
+        MDeformVert *dvert, const int defgroup, const int num_verts, MLoop *loops, const int UNUSED(num_loops),
+        MPoly *polys, const int num_polys, float *r_weights)
+{
+	if (dvert && defgroup != -1) {
+		int i = num_polys;
+		float *tmp_weights = MEM_mallocN(sizeof(*tmp_weights) * (size_t)num_verts, __func__);
+
+		BKE_defvert_extract_vgroup_to_vertweights(dvert, defgroup, num_verts, tmp_weights);
+
+		while (i--) {
+			MPoly *mp = &polys[i];
+			MLoop *ml = &loops[mp->loopstart];
+			int j = mp->totloop;
+			float w = 0.0f;
+
+			for (; j--; ml++) {
+				w += tmp_weights[ml->v];
+			}
+			r_weights[i] = w / (float)mp->totloop;
+		}
+
+		MEM_freeN(tmp_weights);
+	}
+	else {
+		fill_vn_fl(r_weights, 0.0f, num_polys);
+	}
+}




More information about the Bf-blender-cvs mailing list