[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26305] trunk/blender/source/blender: weight panel editing now supports mirroring

Campbell Barton ideasman42 at gmail.com
Tue Jan 26 18:07:47 CET 2010


Revision: 26305
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26305
Author:   campbellbarton
Date:     2010-01-26 18:07:47 +0100 (Tue, 26 Jan 2010)

Log Message:
-----------
weight panel editing now supports mirroring
- use mirror when the option is enabled in editmode.
- fliped group names are used when they exist.
- only the setting that is edited will be applied to the mirrored verts group.
- copy value is applied to all mirrored verts of the selection.
- normalize normalizes all vgroups and mirrors.

utility functions defvert_sync and defvert_sync_mapped, similar to defvert_copy but does not remove existing groups and optionally creates groups as needed.
defvert_sync_mapped uses a an int array for mapping the flipped values.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_deform.h
    trunk/blender/source/blender/blenkernel/intern/deform.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c
    trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c
    trunk/blender/source/blender/blenkernel/intern/simple_deform.c
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/object/object_vgroup.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c

Modified: trunk/blender/source/blender/blenkernel/BKE_deform.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_deform.h	2010-01-26 17:06:28 UTC (rev 26304)
+++ trunk/blender/source/blender/blenkernel/BKE_deform.h	2010-01-26 17:07:47 UTC (rev 26305)
@@ -42,16 +42,22 @@
 
 void				 defgroup_copy_list(struct ListBase *lb1, struct ListBase *lb2);
 struct bDeformGroup *defgroup_duplicate(struct bDeformGroup *ingroup);
-struct bDeformGroup *defgroup_find_name(Object *ob, char *name);
+struct bDeformGroup *defgroup_find_name(struct Object *ob, char *name);
 int					 defgroup_find_index(struct Object *ob, struct bDeformGroup *dg);
-int					*defgroup_flip_map(struct Object *ob);
-int					 defgroup_name_index(Object *ob, const char *name);
+int					*defgroup_flip_map(struct Object *ob, int use_default);
+int					 defgroup_flip_index(struct Object *ob, int index, int use_default);
+int					 defgroup_name_index(struct Object *ob, const char *name);
 void				 defgroup_unique_name(struct bDeformGroup *dg, struct Object *ob);
 
-float defvert_find_weight(const struct MDeformVert *dvert, int group_num);
-float defvert_find_weight_safe(const struct MDeformVert *dvert, int index, int group_num);
+struct MDeformWeight	*defvert_find_index(const struct MDeformVert *dv, int defgroup);
+struct MDeformWeight	*defvert_verify_index(struct MDeformVert *dv, int defgroup);
 
+float  defvert_find_weight(const struct MDeformVert *dvert, int group_num);
+float  defvert_array_find_weight_safe(const struct MDeformVert *dvert, int index, int group_num);
+
 void defvert_copy(struct MDeformVert *dvert_r, const struct MDeformVert *dvert);
+void defvert_sync(struct MDeformVert *dvert_r, const struct MDeformVert *dvert, int use_verify);
+void defvert_sync_mapped(struct MDeformVert *dvert_r, const struct MDeformVert *dvert, int *flip_map, int use_verify);
 void defvert_flip(struct MDeformVert *dvert, int *flip_map);
 void defvert_normalize(struct MDeformVert *dvert);
 

Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c	2010-01-26 17:06:28 UTC (rev 26304)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c	2010-01-26 17:07:47 UTC (rev 26305)
@@ -96,6 +96,7 @@
 	return outgroup;
 }
 
+/* copy & overwrite weights */
 void defvert_copy (MDeformVert *dvert_r, const MDeformVert *dvert)
 {
 	if(dvert_r->totweight == dvert->totweight) {
@@ -115,6 +116,44 @@
 	}
 }
 
+/* only sync over matching weights, don't add or remove groups
+ * warning, loop within loop.
+ */
+void defvert_sync (MDeformVert *dvert_r, const MDeformVert *dvert, int use_verify)
+{
+	if(dvert->totweight && dvert_r->totweight) {
+		int i;
+		MDeformWeight *dw;
+		for(i=0, dw=dvert->dw; i < dvert->totweight; i++, dw++) {
+			MDeformWeight *dw_r;
+			if(use_verify)	dw_r= defvert_find_index(dvert_r, dw->def_nr);
+			else			dw_r= defvert_verify_index(dvert_r, dw->def_nr);
+
+			if(dw_r) {
+				dw_r->weight= dw->weight;
+			}
+		}
+	}
+}
+
+/* be sure all flip_map values are valid */
+void defvert_sync_mapped (MDeformVert *dvert_r, const MDeformVert *dvert, int *flip_map, int use_verify)
+{
+	if(dvert->totweight && dvert_r->totweight) {
+		int i;
+		MDeformWeight *dw;
+		for(i=0, dw=dvert->dw; i < dvert->totweight; i++, dw++) {
+			MDeformWeight *dw_r;
+			if(use_verify)	dw_r= defvert_find_index(dvert_r, flip_map[dw->def_nr]);
+			else			dw_r= defvert_verify_index(dvert_r, flip_map[dw->def_nr]);
+
+			if(dw_r) {
+				dw_r->weight= dw->weight;
+			}
+		}
+	}
+}
+
 void defvert_normalize (MDeformVert *dvert)
 {
 	if(dvert->totweight<=0) {
@@ -225,7 +264,7 @@
 }
 
 /* note, must be freed */
-int *defgroup_flip_map(Object *ob)
+int *defgroup_flip_map(Object *ob, int use_default)
 {
 	bDeformGroup *dg;
 	int totdg= BLI_countlist(&ob->defbase);
@@ -236,14 +275,20 @@
 	else {
 		char name[sizeof(dg->name)];
 		int i, flip_num, *map= MEM_mallocN(totdg * sizeof(int), "get_defgroup_flip_map");
+
 		memset(map, -1, totdg * sizeof(int));
 
 		for (dg=ob->defbase.first, i=0; dg; dg=dg->next, i++) {
 			if(map[i] == -1) { /* may be calculated previously */
+
+				/* incase no valid value is found, use this */
+				if(use_default)
+					map[i]= i;
+
 				flip_side_name(name, dg->name, 0);
 				if(strcmp(name, dg->name)) {
 					flip_num= defgroup_name_index(ob, name);
-					if(flip_num > -1) {
+					if(flip_num >= 0) {
 						map[i]= flip_num;
 						map[flip_num]= i; /* save an extra lookup */
 					}
@@ -254,6 +299,22 @@
 	}
 }
 
+int defgroup_flip_index(Object *ob, int index, int use_default)
+{
+	bDeformGroup *dg= BLI_findlink(&ob->defbase, index);
+	int flip_index = -1;
+
+	if(dg) {
+		char name[sizeof(dg->name)];
+		flip_side_name(name, dg->name, 0);
+
+		if(strcmp(name, dg->name))
+			flip_index= defgroup_name_index(ob, name);
+	}
+
+	return (flip_index==-1 && use_default) ? index : flip_index;
+}
+
 void defgroup_unique_name (bDeformGroup *dg, Object *ob)
 {
 	bDeformGroup *curdef;
@@ -423,29 +484,61 @@
 	sprintf (name, "%s%s%s%s", prefix, replace, suffix, number);
 }
 
+float defvert_find_weight(const struct MDeformVert *dvert, int group_num)
+{
+	MDeformWeight *dw= defvert_find_index(dvert, group_num);
+	return dw ? dw->weight : 1.0f;
+}
 
+float defvert_array_find_weight_safe(const struct MDeformVert *dvert, int index, int group_num)
+{
+	if(group_num == -1 || dvert == NULL)
+		return 1.0f;
 
-float defvert_find_weight(const struct MDeformVert *dvert, int group_num)
+	return defvert_find_weight(dvert+index, group_num);
+}
+
+
+MDeformWeight *defvert_find_index(const MDeformVert *dvert, int defgroup)
 {
-	if(dvert)
-	{
-		const MDeformWeight *dw = dvert->dw;
+	if(dvert && defgroup >= 0) {
+		MDeformWeight *dw = dvert->dw;
 		int i;
 
 		for(i=dvert->totweight; i>0; i--, dw++)
-			if(dw->def_nr == group_num)
-				return dw->weight;
+			if(dw->def_nr == defgroup)
+				return dw;
 	}
 
-	/* Not found */
-	return 0.0;
+	return NULL;
 }
 
-float defvert_find_weight_safe(const struct MDeformVert *dvert, int index, int group_num)
+/* Ensures that mv has a deform weight entry for the specified defweight group */
+/* Note this function is mirrored in editmesh_tools.c, for use for editvertices */
+MDeformWeight *defvert_verify_index(MDeformVert *dv, int defgroup)
 {
-	if(group_num == -1 || dvert == NULL)
-		return 1.0;
+	MDeformWeight *newdw;
 
-	return defvert_find_weight(dvert+index, group_num);
+	/* do this check always, this function is used to check for it */
+	if(!dv || defgroup<0)
+		return NULL;
+
+	newdw = defvert_find_index(dv, defgroup);
+	if(newdw)
+		return newdw;
+
+	newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), "deformWeight");
+	if(dv->dw) {
+		memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight);
+		MEM_freeN(dv->dw);
+	}
+	dv->dw=newdw;
+
+	dv->dw[dv->totweight].weight=0.0f;
+	dv->dw[dv->totweight].def_nr=defgroup;
+	/* Group index */
+
+	dv->totweight++;
+
+	return dv->dw+(dv->totweight-1);
 }
-

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2010-01-26 17:06:28 UTC (rev 26304)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2010-01-26 17:07:47 UTC (rev 26305)
@@ -1812,7 +1812,7 @@
 
 
 	if (do_vgroup_mirr) {
-		flip_map= defgroup_flip_map(ob);
+		flip_map= defgroup_flip_map(ob, 0);
 		if(flip_map == NULL)
 			do_vgroup_mirr= 0;
 	}

Modified: trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c	2010-01-26 17:06:28 UTC (rev 26304)
+++ trunk/blender/source/blender/blenkernel/intern/shrinkwrap.c	2010-01-26 17:07:47 UTC (rev 26305)
@@ -184,7 +184,7 @@
 	{
 		float *co = calc->vertexCos[i];
 		float tmp_co[3];
-		float weight = defvert_find_weight_safe(calc->dvert, i, calc->vgroup);
+		float weight = defvert_array_find_weight_safe(calc->dvert, i, calc->vgroup);
 		if(weight == 0.0f) continue;
 
 
@@ -356,7 +356,7 @@
 		{
 			float *co = calc->vertexCos[i];
 			float tmp_co[3], tmp_no[3];
-			float weight = defvert_find_weight_safe(calc->dvert, i, calc->vgroup);
+			float weight = defvert_array_find_weight_safe(calc->dvert, i, calc->vgroup);
 
 			if(weight == 0.0f) continue;
 
@@ -447,7 +447,7 @@
 	{
 		float *co = calc->vertexCos[i];
 		float tmp_co[3];
-		float weight = defvert_find_weight_safe(calc->dvert, i, calc->vgroup);
+		float weight = defvert_array_find_weight_safe(calc->dvert, i, calc->vgroup);
 		if(weight == 0.0f) continue;
 
 		//Convert the vertex to tree coordinates

Modified: trunk/blender/source/blender/blenkernel/intern/simple_deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/simple_deform.c	2010-01-26 17:06:28 UTC (rev 26304)
+++ trunk/blender/source/blender/blenkernel/intern/simple_deform.c	2010-01-26 17:07:47 UTC (rev 26305)
@@ -227,7 +227,7 @@
 
 	for(i=0; i<numVerts; i++)
 	{
-		float weight = defvert_find_weight_safe(dvert, i, vgroup);
+		float weight = defvert_array_find_weight_safe(dvert, i, vgroup);
 
 		if(weight != 0.0f)
 		{

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h	2010-01-26 17:06:28 UTC (rev 26304)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h	2010-01-26 17:07:47 UTC (rev 26305)
@@ -195,9 +195,6 @@
 void		ED_vgroup_vert_remove(struct Object *ob, struct bDeformGroup *dg, int vertnum);
 float		ED_vgroup_vert_weight(struct Object *ob, struct bDeformGroup *dg, int vertnum);
 
-struct MDeformWeight	*ED_vgroup_weight_verify(struct MDeformVert *dv, int defgroup);
-struct MDeformWeight	*ED_vgroup_weight_get(struct MDeformVert *dv, int defgroup);
-
 /*needed by edge slide*/
 struct EditVert *editedge_getOtherVert(struct EditEdge *eed, struct EditVert *eve);
 struct EditVert *editedge_getSharedVert(struct EditEdge *eed, struct EditEdge *eed2);

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c	2010-01-26 17:06:28 UTC (rev 26304)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list