From 33623ba3a363aa93f3f6c68b92ab228a7c8b2959 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 25 Jan 2010 23:12:02 +0000 Subject: panel for adjusting the active vertex groups weights --- source/blender/editors/include/ED_mesh.h | 1 + source/blender/editors/object/object_vgroup.c | 5 +- .../blender/editors/space_view3d/view3d_buttons.c | 203 ++++++++++++++++++++- 3 files changed, 205 insertions(+), 4 deletions(-) (limited to 'source/blender/editors') diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index 174447c0f9f..6f0cf95bcfd 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -189,6 +189,7 @@ struct bDeformGroup *ED_vgroup_add_name(struct Object *ob, char *name); 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); diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 20241f16c4f..9ba1d9c104e 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -904,7 +904,7 @@ static void vgroup_clean_all(Object *ob, float eul, int keep_single) } } -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 @@ static int vertex_group_mirror_exec(bContext *C, wmOperator *op) { 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 @@ void OBJECT_OT_vertex_group_mirror(wmOperatorType *ot) } - static int vertex_group_copy_to_linked_exec(bContext *C, wmOperator *op) { Scene *scene= CTX_data_scene(C); diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c index 2ba281a9594..8d2b9a8aa35 100644 --- a/source/blender/editors/space_view3d/view3d_buttons.c +++ b/source/blender/editors/space_view3d/view3d_buttons.c @@ -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 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d 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 @@ static void v3d_editvertex_buts(const bContext *C, uiLayout *layout, View3D *v3d } } +#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; itotweight; 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 @@ void view3d_buttons_register(ARegionType *art) 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); } -- cgit v1.2.3