Revision: 28568
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28568
Author:   joeedh
Date:     2010-05-04 13:30:21 +0200 (Tue, 04 May 2010)

Log Message:
-----------
vgroup copy (and a few other ops) now works in editmode.

Modified Paths:
--------------
    branches/render25/source/blender/editors/object/object_vgroup.c

Modified: branches/render25/source/blender/editors/object/object_vgroup.c
===================================================================
--- branches/render25/source/blender/editors/object/object_vgroup.c     
2010-05-04 10:35:36 UTC (rev 28567)
+++ branches/render25/source/blender/editors/object/object_vgroup.c     
2010-05-04 11:30:21 UTC (rev 28568)
@@ -122,6 +122,72 @@
        }
 }
 
+int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_tot)
+{
+       if(id) {
+               switch(GS(id->name)) {
+                       case ID_ME:
+                       {
+                               Mesh *me = (Mesh *)id;
+                               *dvert_tot= me->totvert;
+
+                               if (!me->edit_mesh) {
+                                       int i;
+
+                                       *dvert_arr= 
MEM_mallocN(sizeof(void*)*me->totvert, "vgroup parray from me");
+
+                                       for (i=0; i<me->totvert; i++) {
+                                               (*dvert_arr)[i] = me->dvert + i;
+                                       }
+                               } else {
+                                       EditMesh *em = me->edit_mesh;
+                                       EditVert *eve;
+                                       int i;
+
+                                       if (!CustomData_has_layer(&em->vdata, 
CD_MDEFORMVERT)) {
+                                               *dvert_tot = 0;
+                                               *dvert_arr = NULL;
+                                               return 0;
+                                       }
+
+                                       i = 0;
+                                       for (eve=em->verts.first; eve; 
eve=eve->next) i++;
+
+                                       *dvert_arr= 
MEM_mallocN(sizeof(void*)*i, "vgroup parray from me");
+                                       *dvert_tot = i;
+
+                                       i = 0;
+                                       for (eve=em->verts.first; eve; 
eve=eve->next, i++) {
+                                               (*dvert_arr)[i] = 
CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+                                       }
+
+                               }
+                               return 1;
+                       }
+                       case ID_LT:
+                       {
+                               int i=0;
+
+                               Lattice *lt= (Lattice *)id;
+                               lt= (lt->editlatt)? lt->editlatt: lt;
+
+                               *dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
+                               *dvert_arr= 
MEM_mallocN(sizeof(void*)*(*dvert_tot), "vgroup parray from me");
+
+                               for (i=0; i<*dvert_tot; i++) {
+                                       (*dvert_arr)[i] = lt->dvert + i;
+                               }
+
+                               return 1;
+                       }
+               }
+       }
+
+       *dvert_arr= NULL;
+       *dvert_tot= 0;
+       return 0;
+}
+
 /* returns true if the id type supports weights */
 int ED_vgroup_give_array(ID *id, MDeformVert **dvert_arr, int *dvert_tot)
 {
@@ -153,20 +219,22 @@
 /* matching index only */
 int ED_vgroup_copy_array(Object *ob, Object *ob_from)
 {
-       MDeformVert *dvert_array_from, *dvf;
-       MDeformVert *dvert_array, *dv;
-
+       MDeformVert **dvert_array_from, **dvf;
+       MDeformVert **dvert_array, **dv;
        int dvert_tot_from;
        int dvert_tot;
        int i;
        int totdef_from= BLI_countlist(&ob_from->defbase);
        int totdef= BLI_countlist(&ob->defbase);
 
-       ED_vgroup_give_array(ob_from->data, &dvert_array_from, &dvert_tot_from);
-       ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
+       ED_vgroup_give_parray(ob_from->data, &dvert_array_from, 
&dvert_tot_from);
+       ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
-       if(ob==ob_from || dvert_tot==0 || (dvert_tot != dvert_tot_from) || 
dvert_array_from==NULL || dvert_array==NULL)
+       if(ob==ob_from || dvert_tot==0 || (dvert_tot != dvert_tot_from) || 
dvert_array_from==NULL || dvert_array==NULL) {
+               if (dvert_array) MEM_freeN(dvert_array);
+               if (dvert_array_from) MEM_freeN(dvert_array_from);
                return 0;
+       }
 
        /* do the copy */
        BLI_freelistN(&ob->defbase);
@@ -187,15 +255,18 @@
        dv= dvert_array;
 
        for(i=0; i<dvert_tot; i++, dvf++, dv++) {
-               if(dv->dw)
-                       MEM_freeN(dv->dw);
+               if((*dv)->dw)
+                       MEM_freeN((*dv)->dw);
 
-               *dv= *dvf;
+               *(*dv)= *(*dvf);
 
-               if(dv->dw)
-                       dv->dw= MEM_dupallocN(dv->dw);
+               if((*dv)->dw)
+                       (*dv)->dw= MEM_dupallocN((*dv)->dw);
        }
 
+       MEM_freeN(dvert_array);
+       MEM_freeN(dvert_array_from);
+
        return 1;
 }
 
@@ -537,7 +608,7 @@
        bDeformGroup *dg, *cdg;
        char name[32], s[32];
        MDeformWeight *org, *cpy;
-       MDeformVert *dvert, *dvert_array=NULL;
+       MDeformVert *dvert, **dvert_array=NULL;
        int i, idg, icdg, dvert_tot=0;
 
        dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
@@ -570,13 +641,13 @@
        ob->actdef = BLI_countlist(&ob->defbase);
        icdg = (ob->actdef-1);
 
-       ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
+       ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
        
        if(!dvert_array)
                return;
 
        for(i = 0; i < dvert_tot; i++) {
-               dvert = dvert_array+i;
+               dvert = dvert_array[i];
                org = defvert_find_index(dvert, idg);
                if(org) {
                        float weight = org->weight;
@@ -585,16 +656,18 @@
                        cpy->weight = weight;
                }
        }
+
+       MEM_freeN(dvert_array);
 }
 
 static void vgroup_normalize(Object *ob)
 {
        bDeformGroup *dg;
        MDeformWeight *dw;
-       MDeformVert *dvert, *dvert_array=NULL;
+       MDeformVert *dvert, **dvert_array=NULL;
        int i, def_nr, dvert_tot=0;
 
-       ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
+       ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
        dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
 
@@ -604,7 +677,7 @@
                def_nr= ob->actdef-1;
 
                for(i = 0; i < dvert_tot; i++) {
-                       dvert = dvert_array+i;
+                       dvert = dvert_array[i];
                        dw = defvert_find_index(dvert, def_nr);
                        if(dw) {
                                weight_max = MAX2(dw->weight, weight_max);
@@ -613,7 +686,7 @@
 
                if(weight_max > 0.0f) {
                        for(i = 0; i < dvert_tot; i++) {
-                               dvert = dvert_array+i;
+                               dvert = dvert_array[i];
                                dw = defvert_find_index(dvert, def_nr);
                                if(dw) {
                                        dw->weight /= weight_max;
@@ -624,16 +697,18 @@
                        }
                }
        }
+
+       if (dvert_array) MEM_freeN(dvert_array);
 }
 
 static void vgroup_levels(Object *ob, float offset, float gain)
 {
        bDeformGroup *dg;
        MDeformWeight *dw;
-       MDeformVert *dvert, *dvert_array=NULL;
+       MDeformVert *dvert, **dvert_array=NULL;
        int i, def_nr, dvert_tot=0;
        
-       ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
+       ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
        
        dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
        
@@ -641,7 +716,7 @@
                def_nr= ob->actdef-1;
                
                for(i = 0; i < dvert_tot; i++) {
-                       dvert = dvert_array+i;
+                       dvert = dvert_array[i];
                        dw = defvert_find_index(dvert, def_nr);
                        if(dw) {
                                dw->weight = gain * (dw->weight + offset);
@@ -650,17 +725,19 @@
                        }
                }
        }
+
+       if (dvert_array) MEM_freeN(dvert_array);
 }
 
 /* TODO - select between groups */
 static void vgroup_normalize_all(Object *ob, int lock_active)
 {
        MDeformWeight *dw, *dw_act;
-       MDeformVert *dvert, *dvert_array=NULL;
+       MDeformVert *dvert, **dvert_array=NULL;
        int i, dvert_tot=0;
        float tot_weight;
 
-       ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
+       ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
        if(dvert_array) {
                if(lock_active) {
@@ -672,7 +749,7 @@
 
                                tot_weight= 0.0f;
                                dw_act= NULL;
-                               dvert = dvert_array+i;
+                               dvert = dvert_array[i];
 
                                j= dvert->totweight;
                                while(j--) {
@@ -710,7 +787,7 @@
                        for(i = 0; i < dvert_tot; i++) {
                                int j;
                                tot_weight= 0.0f;
-                               dvert = dvert_array+i;
+                               dvert = dvert_array[i];
 
                                j= dvert->totweight;
                                while(j--) {
@@ -731,6 +808,8 @@
                        }
                }
        }
+
+       if (dvert_array) MEM_freeN(dvert_array);
 }
 
 
@@ -738,10 +817,10 @@
 {
        bDeformGroup *dg;
        MDeformWeight *dw;
-       MDeformVert *dvert, *dvert_array=NULL;
+       MDeformVert *dvert, **dvert_array=NULL;
        int i, def_nr, dvert_tot=0;
 
-       ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
+       ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
        dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
 
@@ -750,7 +829,7 @@
 
 
                for(i = 0; i < dvert_tot; i++) {
-                       dvert = dvert_array+i;
+                       dvert = dvert_array[i];
 
                        if(auto_assign) {
                                dw= defvert_verify_index(dvert, def_nr);
@@ -768,6 +847,8 @@
                        }
                }
        }
+
+       if (dvert_array) MEM_freeN(dvert_array);
 }
 
 static void vgroup_blend(Object *ob)
@@ -858,10 +939,10 @@
 {
        bDeformGroup *dg;
        MDeformWeight *dw;
-       MDeformVert *dvert, *dvert_array=NULL;
+       MDeformVert *dvert, **dvert_array=NULL;
        int i, def_nr, dvert_tot=0;
 
-       ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
+       ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
        /* only the active group */
        dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
@@ -869,7 +950,7 @@
                def_nr= ob->actdef-1;
 
                for(i = 0; i < dvert_tot; i++) {
-                       dvert = dvert_array+i;
+                       dvert = dvert_array[i];
 
                        dw= defvert_find_index(dvert, def_nr);
 
@@ -880,21 +961,23 @@
                        }
                }
        }
+
+       if (dvert_array) MEM_freeN(dvert_array);
 }
 
 static void vgroup_clean_all(Object *ob, float eul, int keep_single)
 {
 
        MDeformWeight *dw;
-       MDeformVert *dvert, *dvert_array=NULL;
+       MDeformVert *dvert, **dvert_array=NULL;
        int i, dvert_tot=0;
 
-       ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
+       ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
        if(dvert_array) {
                for(i = 0; i < dvert_tot; i++) {
                        int j;
-                       dvert = dvert_array+i;
+                       dvert = dvert_array[i];
                        j= dvert->totweight;
 
                        while(j--) {
@@ -910,6 +993,8 @@
                        }
                }
        }
+
+       if (dvert_array) MEM_freeN(dvert_array);
 }
 
 void ED_vgroup_mirror(Object *ob, int mirror_weights, int flip_vgroups)


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

Reply via email to