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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to