[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26266] trunk/blender/source/blender: panel for adjusting the active vertex groups weights

Campbell Barton ideasman42 at gmail.com
Tue Jan 26 00:12:02 CET 2010


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

Log Message:
-----------
panel for adjusting the active vertex groups weights

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_deform.h
    trunk/blender/source/blender/blenkernel/intern/deform.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/object/object_vgroup.c
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
    trunk/blender/source/blender/makesdna/DNA_vec_types.h

Modified: trunk/blender/source/blender/blenkernel/BKE_deform.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_deform.h	2010-01-25 23:11:01 UTC (rev 26265)
+++ trunk/blender/source/blender/blenkernel/BKE_deform.h	2010-01-25 23:12:02 UTC (rev 26266)
@@ -54,6 +54,7 @@
 
 void copy_defvert (struct MDeformVert *dvert_r, const struct MDeformVert *dvert);
 void flip_defvert (struct MDeformVert *dvert, int *flip_map);
+void normalize_defvert (struct MDeformVert *dvert);
 
 #endif
 

Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c	2010-01-25 23:11:01 UTC (rev 26265)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c	2010-01-25 23:12:02 UTC (rev 26266)
@@ -115,6 +115,28 @@
 	}
 }
 
+void normalize_defvert (MDeformVert *dvert)
+{
+	if(dvert->totweight<=0) {
+		/* nothing */
+	}
+	else if (dvert->totweight==1) {
+		dvert->dw[0].weight= 1.0f;
+	}
+	else {
+		int i;
+		float tot= 0.0f;
+		MDeformWeight *dw;
+		for(i=0, dw=dvert->dw; i < dvert->totweight; i++, dw++)
+			tot += dw->weight;
+
+		if(tot > 0.0f) {
+			for(i=0, dw=dvert->dw; i < dvert->totweight; i++, dw++)
+				dw->weight /= tot;
+		}
+	}
+}
+
 void flip_defvert (MDeformVert *dvert, int *flip_map)
 {
 	MDeformWeight *dw;

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c	2010-01-25 23:11:01 UTC (rev 26265)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c	2010-01-25 23:12:02 UTC (rev 26266)
@@ -2031,7 +2031,7 @@
 					BGpic *bgpic;
 					writestruct(wd, DATA, "View3D", 1, v3d);
 					for (bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next)
-					writestruct(wd, DATA, "BGpic", 1, bgpic);
+						writestruct(wd, DATA, "BGpic", 1, bgpic);
 					if(v3d->localvd) writestruct(wd, DATA, "View3D", 1, v3d->localvd);
 				}
 				else if(sl->spacetype==SPACE_IPO) {

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h	2010-01-25 23:11:01 UTC (rev 26265)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h	2010-01-25 23:12:02 UTC (rev 26266)
@@ -189,6 +189,7 @@
 void					ED_vgroup_select_by_name(struct Object *ob, char *name);
 void					ED_vgroup_data_create(struct ID *id);
 int						ED_vgroup_give_array(struct ID *id, struct MDeformVert **dvert_arr, int *dvert_tot);
+void					ED_vgroup_mirror(struct Object *ob, int mirror_weights, int flip_vgroups);
 
 void		ED_vgroup_vert_add(struct Object *ob, struct bDeformGroup *dg, int vertnum,  float weight, int assignmode);
 void		ED_vgroup_vert_remove(struct Object *ob, struct bDeformGroup *dg, int vertnum);

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c	2010-01-25 23:11:01 UTC (rev 26265)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c	2010-01-25 23:12:02 UTC (rev 26266)
@@ -904,7 +904,7 @@
 	}
 }
 
-static void vgroup_mirror(Object *ob, int mirror_weights, int flip_vgroups)
+void ED_vgroup_mirror(Object *ob, int mirror_weights, int flip_vgroups)
 {
 	EditVert *eve, *eve_mirr;
 	MDeformVert *dvert, *dvert_mirr;
@@ -1751,7 +1751,7 @@
 {
 	Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
 
-	vgroup_mirror(ob, RNA_boolean_get(op->ptr,"mirror_weights"), RNA_boolean_get(op->ptr,"flip_group_names"));
+	ED_vgroup_mirror(ob, RNA_boolean_get(op->ptr,"mirror_weights"), RNA_boolean_get(op->ptr,"flip_group_names"));
 
 	DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
 	WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
@@ -1780,7 +1780,6 @@
 
 }
 
-
 static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *op)
 {
 	Scene *scene= CTX_data_scene(C);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2010-01-25 23:11:01 UTC (rev 26265)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2010-01-25 23:12:02 UTC (rev 26266)
@@ -70,6 +70,7 @@
 #include "BKE_scene.h"
 #include "BKE_screen.h"
 #include "BKE_utildefines.h"
+#include "BKE_deform.h"
 
 #include "BIF_gl.h"
 
@@ -366,6 +367,8 @@
 		else if(totedge>1)
 			uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Crease:",	0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
 		
+
+		uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Median Crease:",	0, 20, 200, 20, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
 	}
 	else {	// apply
 		memcpy(ve_median, tfp->ve_median, sizeof(tfp->ve_median));
@@ -477,6 +480,197 @@
 	}
 }
 
+#define B_VGRP_PNL_EDIT 1
+#define B_VGRP_PNL_COPY 2
+#define B_VGRP_PNL_NORMALIZE 3
+#define B_VGRP_PNL_COPY_SINGLE 100 /* or greater */
+
+static void act_vert_def(Object *ob, EditVert **eve, MDeformVert **dvert)
+{
+	if(ob && ob->mode & OB_MODE_EDIT && ob->type==OB_MESH && ob->defbase.first) {
+		Mesh *me= ob->data;
+		EditMesh *em = BKE_mesh_get_editmesh(me);
+		EditSelection *ese = ((EditSelection*)em->selected.last);
+
+		if(ese && ese->type == EDITVERT) {
+			*eve= (EditVert*)ese->data;
+			*dvert= CustomData_em_get(&em->vdata, (*eve)->data, CD_MDEFORMVERT);
+			return;
+		}
+
+		BKE_mesh_end_editmesh(me, em);
+	}
+
+	*eve= NULL;
+	*dvert= NULL;
+}
+
+static void vgroup_copy_active_to_sel(Object *ob)
+{
+	EditVert *eve_act;
+	MDeformVert *dvert_act;
+
+	act_vert_def(ob, &eve_act, &dvert_act);
+
+	if(dvert_act==NULL) {
+		return;
+	}
+	else {
+		Mesh *me= ob->data;
+		EditMesh *em = BKE_mesh_get_editmesh(me);
+		EditVert *eve;
+		MDeformVert *dvert;
+
+		for(eve= em->verts.first; eve; eve= eve->next) {
+			if(eve->f & SELECT && eve != eve_act) {
+				dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+				if(dvert)
+					copy_defvert(dvert, dvert_act);
+			}
+		}
+	}
+}
+
+static void vgroup_copy_active_to_sel_single(Object *ob, int def_nr)
+{
+	EditVert *eve_act;
+	MDeformVert *dvert_act;
+
+	act_vert_def(ob, &eve_act, &dvert_act);
+
+	if(dvert_act==NULL) {
+		return;
+	}
+	else {
+		Mesh *me= ob->data;
+		EditMesh *em = BKE_mesh_get_editmesh(me);
+		EditVert *eve;
+		MDeformVert *dvert;
+		MDeformWeight *dw;
+		float act_weight = -1.0f;
+		int i;
+
+		for(i=0, dw=dvert_act->dw; i < dvert_act->totweight; i++, dw++) {
+			if(def_nr == dw->def_nr) {
+				act_weight= dw->weight;
+				break;
+			}
+		}
+
+		if(act_weight < -0.5f)
+			return;
+
+		for(eve= em->verts.first; eve; eve= eve->next) {
+			if(eve->f & SELECT && eve != eve_act) {
+				dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+				if(dvert) {
+					for(i=0, dw=dvert->dw; i < dvert->totweight; i++, dw++) {
+						if(def_nr == dw->def_nr) {
+							dw->weight= act_weight;
+							break;
+						}
+					}
+				}
+			}
+		}
+	}
+}
+
+static void vgroup_normalize_active(Object *ob)
+{
+	EditVert *eve_act;
+	MDeformVert *dvert_act;
+
+	act_vert_def(ob, &eve_act, &dvert_act);
+
+	if(dvert_act==NULL)
+		return;
+
+	normalize_defvert(dvert_act);
+}
+
+static void do_view3d_vgroup_buttons(bContext *C, void *arg, int event)
+{
+	Scene *scene= CTX_data_scene(C);
+	Object *ob= OBACT;
+
+	if(event==B_VGRP_PNL_EDIT) {
+		/* nothing */
+	}
+	else if(event==B_VGRP_PNL_NORMALIZE) {
+		vgroup_normalize_active(ob);
+	}
+	else if(event == B_VGRP_PNL_COPY) {
+		vgroup_copy_active_to_sel(ob);
+	}
+	else if(event >= B_VGRP_PNL_COPY_SINGLE) {
+		vgroup_copy_active_to_sel_single(ob, event - B_VGRP_PNL_COPY_SINGLE);
+	}
+
+//  todo
+//	if(((Mesh *)ob->data)->editflag & ME_EDIT_MIRROR_X)
+//		ED_vgroup_mirror(ob, 1, 1, 0);
+
+	/* default for now */
+	DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+	WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
+}
+
+int view3d_panel_vgroup_poll(const bContext *C, PanelType *pt)
+{
+	Scene *scene= CTX_data_scene(C);
+	Object *ob= OBACT;
+	EditVert *eve_act;
+	MDeformVert *dvert_act;
+
+	act_vert_def(ob, &eve_act, &dvert_act);
+
+	return dvert_act ? dvert_act->totweight : 0;
+}
+
+
+static void view3d_panel_vgroup(const bContext *C, Panel *pa)
+{
+	uiBlock *block= uiLayoutAbsoluteBlock(pa->layout);
+	Scene *scene= CTX_data_scene(C);
+	Object *ob= OBACT;
+
+	EditVert *eve;
+	MDeformVert *dvert;
+
+	act_vert_def(ob, &eve, &dvert);
+
+	if(dvert && dvert->totweight) {
+		uiLayout *col;
+		bDeformGroup *dg;
+		int i;
+		int yco = 0;
+
+		uiBlockSetHandleFunc(block, do_view3d_vgroup_buttons, NULL);
+
+		col= uiLayoutColumn(pa->layout, 0);
+		block= uiLayoutAbsoluteBlock(col);
+
+		uiBlockBeginAlign(block);
+
+		for (i=0; i<dvert->totweight; i++){
+			dg = BLI_findlink (&ob->defbase, dvert->dw[i].def_nr);
+			if(dg) {
+				uiDefButF(block, NUM, B_VGRP_PNL_EDIT, dg->name,	0, yco, 180, 20, &dvert->dw[i].weight, 0.0, 1.0, 1, 3, "");
+				uiDefBut(block, BUT, B_VGRP_PNL_COPY_SINGLE + dvert->dw[i].def_nr, "C", 180,yco,20,20, 0, 0, 0, 0, 0, "Copy this groups weight to other selected verts");
+				yco -= 20;
+			}
+		}
+		yco-=2;
+
+		uiBlockEndAlign(block);
+		uiBlockBeginAlign(block);
+		uiDefBut(block, BUT, B_VGRP_PNL_NORMALIZE, "Normalize", 0, yco,100,20, 0, 0, 0, 0, 0, "Normalize active vertex weights");
+		uiDefBut(block, BUT, B_VGRP_PNL_COPY, "Copy", 100,yco,100,20, 0, 0, 0, 0, 0, "Copy active vertex to other seleted verts");
+		uiBlockEndAlign(block);
+	}
+}
+
 static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
 {
 	uiLayout *split, *colsub;
@@ -1191,7 +1385,14 @@
 	strcpy(pt->label, "Grease Pencil");
 	pt->draw= gpencil_panel_standard;
 	BLI_addtail(&art->paneltypes, pt);
-	
+
+	pt= MEM_callocN(sizeof(PanelType), "spacetype view3d panel vgroup");
+	strcpy(pt->idname, "VIEW3D_PT_vgroup");
+	strcpy(pt->label, "Vertex Groups");
+	pt->draw= view3d_panel_vgroup;
+	pt->poll= view3d_panel_vgroup_poll;
+	BLI_addtail(&art->paneltypes, pt);
+
 	// XXX view3d_panel_preview(C, ar, 0);
 }
 

Modified: trunk/blender/source/blender/makesdna/DNA_vec_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_vec_types.h	2010-01-25 23:11:01 UTC (rev 26265)
+++ trunk/blender/source/blender/makesdna/DNA_vec_types.h	2010-01-25 23:12:02 UTC (rev 26266)
@@ -38,14 +38,16 @@
 	short x, y;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list