[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42984] trunk/blender/source/blender/ editors/sculpt_paint/paint_vertex.c: minor edits to weight paint

Campbell Barton ideasman42 at gmail.com
Fri Dec 30 03:16:12 CET 2011


Revision: 42984
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42984
Author:   campbellbarton
Date:     2011-12-30 02:16:07 +0000 (Fri, 30 Dec 2011)
Log Message:
-----------
minor edits to weight paint
* store the active vertex group (avoid doing ob->actdef-1 for every vertex)
* ensure the active vertex group isn't less then 0.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c	2011-12-29 23:34:25 UTC (rev 42983)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c	2011-12-30 02:16:07 UTC (rev 42984)
@@ -288,9 +288,9 @@
 }
 
 /* mirror_vgroup is set to -1 when invalid */
-static int wpaint_mirror_vgroup_ensure(Object *ob)
+static int wpaint_mirror_vgroup_ensure(Object *ob, const int vgroup_active)
 {
-	bDeformGroup *defgroup= BLI_findlink(&ob->defbase, ob->actdef - 1);
+	bDeformGroup *defgroup= BLI_findlink(&ob->defbase, vgroup_active);
 
 	if(defgroup) {
 		bDeformGroup *curdef;
@@ -391,7 +391,7 @@
 	Mesh *me= ob->data;
 	MFace *mf;
 	MDeformWeight *dw, *uw;
-	int vgroup, vgroup_mirror= -1;
+	int vgroup_active, vgroup_mirror= -1;
 	unsigned int index;
 
 	/* mutually exclusive, could be made into a */
@@ -399,11 +399,11 @@
 
 	if(me->totface==0 || me->dvert==NULL || !me->mface) return;
 	
-	vgroup= ob->actdef-1;
+	vgroup_active = ob->actdef - 1;
 
 	/* if mirror painting, find the other group */
 	if(me->editflag & ME_EDIT_MIRROR_X) {
-		vgroup_mirror= wpaint_mirror_vgroup_ensure(ob);
+		vgroup_mirror= wpaint_mirror_vgroup_ensure(ob, vgroup_active);
 	}
 	
 	copy_wpaint_prev(wp, me->dvert, me->totvert);
@@ -423,9 +423,9 @@
 					continue;
 				}
 
-				dw= defvert_verify_index(&me->dvert[vidx], vgroup);
+				dw= defvert_verify_index(&me->dvert[vidx], vgroup_active);
 				if(dw) {
-					uw= defvert_verify_index(wp->wpaint_prev+vidx, vgroup);
+					uw= defvert_verify_index(wp->wpaint_prev+vidx, vgroup_active);
 					uw->weight= dw->weight; /* set the undo weight */
 					dw->weight= paintweight;
 
@@ -437,8 +437,8 @@
 								dw= defvert_verify_index(me->dvert+j, vgroup_mirror);
 								uw= defvert_verify_index(wp->wpaint_prev+j, vgroup_mirror);
 							} else {
-								dw= defvert_verify_index(me->dvert+j, vgroup);
-								uw= defvert_verify_index(wp->wpaint_prev+j, vgroup);
+								dw= defvert_verify_index(me->dvert+j, vgroup_active);
+								uw= defvert_verify_index(wp->wpaint_prev+j, vgroup_active);
 							}
 							uw->weight= dw->weight; /* set the undo weight */
 							dw->weight= paintweight;
@@ -890,7 +890,7 @@
 			}
 			else {
 				MFace *mf= ((MFace *)me->mface) + index-1;
-				const int vgroup= vc.obact->actdef - 1;
+				const int vgroup_active= vc.obact->actdef - 1;
 				ToolSettings *ts= vc.scene->toolsettings;
 				float mval_f[2];
 				int v_idx_best= -1;
@@ -914,7 +914,7 @@
 				} while (fidx--);
 
 				if(v_idx_best != -1) { /* should always be valid */
-					ts->vgroup_weight= defvert_find_weight(&me->dvert[v_idx_best], vgroup);
+					ts->vgroup_weight= defvert_find_weight(&me->dvert[v_idx_best], vgroup_active);
 					change= TRUE;
 				}
 			}
@@ -1465,6 +1465,7 @@
 	int defbase_tot_sel;
 	int defbase_tot_unsel;
 
+	int vgroup_active; /* (ob->actdef - 1) */
 	int vgroup_mirror; /* mirror group or -1 */
 
 	const char *lock_flags;  /* boolean array for locked bones,
@@ -1569,15 +1570,14 @@
 	MDeformVert *dv= &me->dvert[index];
 	
 	MDeformWeight *dw, *uw;
-	int vgroup= ob->actdef-1;
 
 	if(wp->flag & VP_ONLYVGROUP) {
-		dw= defvert_find_index(dv, vgroup);
-		uw= defvert_find_index(wp->wpaint_prev+index, vgroup);
+		dw= defvert_find_index(dv, wpi->vgroup_active);
+		uw= defvert_find_index(wp->wpaint_prev+index, wpi->vgroup_active);
 	}
 	else {
-		dw= defvert_verify_index(dv, vgroup);
-		uw= defvert_verify_index(wp->wpaint_prev+index, vgroup);
+		dw= defvert_verify_index(dv, wpi->vgroup_active);
+		uw= defvert_verify_index(wp->wpaint_prev+index, wpi->vgroup_active);
 	}
 
 	if(dw==NULL || uw==NULL) {
@@ -1599,7 +1599,7 @@
 			if(index_mirr != -1) {
 				MDeformVert *dv_mirr= &me->dvert[index_mirr];
 				/* copy, not paint again */
-				uw= defvert_verify_index(dv_mirr, (wpi->vgroup_mirror != -1) ? wpi->vgroup_mirror : vgroup);
+				uw= defvert_verify_index(dv_mirr, (wpi->vgroup_mirror != -1) ? wpi->vgroup_mirror : wpi->vgroup_active);
 				uw->weight= dw->weight;
 			}
 		}
@@ -1698,7 +1698,7 @@
 			if(index_mirr != -1) {
 				MDeformVert *dv_mirr= &me->dvert[index_mirr];
 				/* copy, not paint again */
-				uw= defvert_verify_index(dv_mirr, (wpi->vgroup_mirror != -1) ? wpi->vgroup_mirror : vgroup);
+				uw= defvert_verify_index(dv_mirr, (wpi->vgroup_mirror != -1) ? wpi->vgroup_mirror : wpi->vgroup_active);
 				//uw->weight= dw->weight;
 				apply_mp_locks_normalize(me, wpi, index_mirr, uw, tdw, change, oldChange, oldw, neww);
 			}
@@ -1794,6 +1794,7 @@
 struct WPaintData {
 	ViewContext vc;
 	int *indexar;
+	int vgroup_active;
 	int vgroup_mirror;
 	float *vertexcosnos;
 	float wpimat[3][3];
@@ -1883,29 +1884,9 @@
 		ED_vgroup_data_create(&me->id);
 		WM_event_add_notifier(C, NC_GEOM|ND_DATA, me);
 	}
-	
-	/* make mode data storage */
-	wpd= MEM_callocN(sizeof(struct WPaintData), "WPaintData");
-	paint_stroke_set_mode_data(stroke, wpd);
-	view3d_set_viewcontext(C, &wpd->vc);
-	wpd->vgroup_mirror= -1;
-	
-	/*set up auto-normalize, and generate map for detecting which
-	  vgroups affect deform bones*/
-	wpd->defbase_tot = BLI_countlist(&ob->defbase);
-	wpd->lock_flags = gen_lock_flags(ob, wpd->defbase_tot);
-	if (ts->auto_normalize || ts->multipaint || wpd->lock_flags) {
-		wpd->vgroup_validmap = wpaint_make_validmap(ob);
-	}
 
-	/* ALLOCATIONS! no return after this line */
-	/* painting on subsurfs should give correct points too, this returns me->totvert amount */
-	wpd->vertexcosnos= mesh_get_mapped_verts_nors(scene, ob);
-	wpd->indexar= get_indexarray(me);
-	copy_wpaint_prev(wp, me->dvert, me->totvert);
-	
 	/* this happens on a Bone select, when no vgroup existed yet */
-	if(ob->actdef<=0) {
+	if (ob->actdef <= 0) {
 		Object *modob;
 		if((modob = modifiers_isDeformedByArmature(ob))) {
 			Bone *actbone= ((bArmature *)modob->data)->act_bone;
@@ -1930,14 +1911,41 @@
 		ED_vgroup_add(ob);
 	}
 
+	/* ensure we dont try paint onto an invalid group */
+	if (ob->actdef <= 0) {
+		return OPERATOR_PASS_THROUGH;
+	}
+
+	/* ALLOCATIONS! no return after this line */
+	/* make mode data storage */
+	wpd= MEM_callocN(sizeof(struct WPaintData), "WPaintData");
+	paint_stroke_set_mode_data(stroke, wpd);
+	view3d_set_viewcontext(C, &wpd->vc);
+
+	wpd->vgroup_active = ob->actdef - 1;
+	wpd->vgroup_mirror = -1;
+
+	/* set up auto-normalize, and generate map for detecting which
+	 * vgroups affect deform bones*/
+	wpd->defbase_tot = BLI_countlist(&ob->defbase);
+	wpd->lock_flags = gen_lock_flags(ob, wpd->defbase_tot);
+	if (ts->auto_normalize || ts->multipaint || wpd->lock_flags) {
+		wpd->vgroup_validmap = wpaint_make_validmap(ob);
+	}
+
+	/* painting on subsurfs should give correct points too, this returns me->totvert amount */
+	wpd->vertexcosnos= mesh_get_mapped_verts_nors(scene, ob);
+	wpd->indexar= get_indexarray(me);
+	copy_wpaint_prev(wp, me->dvert, me->totvert);
+
 	/* imat for normals */
 	mult_m4_m4m4(mat, wpd->vc.rv3d->viewmat, ob->obmat);
 	invert_m4_m4(imat, mat);
 	copy_m3_m4(wpd->wpimat, imat);
-	
+
 	/* if mirror painting, find the other group */
 	if(me->editflag & ME_EDIT_MIRROR_X) {
-		wpd->vgroup_mirror= wpaint_mirror_vgroup_ensure(ob);
+		wpd->vgroup_mirror = wpaint_mirror_vgroup_ensure(ob, wpd->vgroup_active);
 	}
 	
 	return 1;
@@ -1998,6 +2006,7 @@
 	if(wpi.defbase_tot_sel == 0 && ob->actdef > 0) wpi.defbase_tot_sel = 1;
 
 	wpi.defbase_tot_unsel=  wpi.defbase_tot - wpi.defbase_tot_sel;
+	wpi.vgroup_active=      wpd->vgroup_active;
 	wpi.vgroup_mirror=      wpd->vgroup_mirror;
 	wpi.lock_flags=         wpd->lock_flags;
 	wpi.vgroup_validmap=    wpd->vgroup_validmap;
@@ -2086,9 +2095,9 @@
 				do {
 					unsigned int vidx= *(&mface->v1 + fidx);
 
-					dw= dw_func(me->dvert+vidx, ob->actdef-1);
+					dw = dw_func(&me->dvert[vidx], wpi.vgroup_active);
 					if(dw) {
-						paintweight+= dw->weight;
+						paintweight += dw->weight;
 						totw++;
 					}
 




More information about the Bf-blender-cvs mailing list