[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