[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28568] branches/render25/source/blender/ editors/object/object_vgroup.c: vgroup copy (and a few other ops) now works in editmode.
Joseph Eagar
joeedh at gmail.com
Tue May 4 13:30:21 CEST 2010
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)
More information about the Bf-blender-cvs
mailing list