[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