[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38568] branches/soc-2011-radish/source/ blender/editors/sculpt_paint/paint_vertex.c: Fixed a Multi-Paint + Auto Normalize issue.

Jason Hays jason_hays22 at mymail.eku.edu
Thu Jul 21 18:25:07 CEST 2011


Revision: 38568
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38568
Author:   jason_hays22
Date:     2011-07-21 16:25:07 +0000 (Thu, 21 Jul 2011)
Log Message:
-----------
Fixed a Multi-Paint + Auto Normalize issue.
Beforehand, auto normalize could cause the weight to change as you brushed over vertices even if the change was less extreme than the last change.

Modified Paths:
--------------
    branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c

Modified: branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c
===================================================================
--- branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c	2011-07-21 16:15:31 UTC (rev 38567)
+++ branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c	2011-07-21 16:25:07 UTC (rev 38568)
@@ -1462,7 +1462,7 @@
 }
 /*Jason*/
 /* fresh start to make multi-paint and locking modular */
-static void apply_mp_lcks_normalize(Object *ob, Mesh *me, int index, MDeformWeight *dw, int defcnt, float change, float oldw, float neww, char *selection, int selected, char *bone_groups, char *validmap, char *flags, int multipaint) {
+static int apply_mp_lcks_normalize(Object *ob, Mesh *me, int index, MDeformWeight *dw, MDeformWeight *tdw, int defcnt, float change, float oldChange, float oldw, float neww, char *selection, int selected, char *bone_groups, char *validmap, char *flags, int multipaint) {
 	MDeformVert *dvert = me->dvert+index;
 	MDeformVert *dv = MEM_mallocN(sizeof (*(me->dvert+index)), "oldMDeformVert");
 
@@ -1480,14 +1480,40 @@
 			dw->weight = neww;
 		}
 	}
-	clamp_weights(me->dvert+index);
+	clamp_weights(dvert);
 
 	enforce_locks(dv, dvert, defcnt, flags, bone_groups, validmap);
 
 	do_weight_paint_auto_normalize_all_groups(dvert, validmap);
-	
+
+	if(oldChange && multipaint && selected > 1) {
+		if(tdw->weight != oldw) {
+			if( neww > oldw ) {
+				if(tdw->weight > oldw) {
+					//printf("should have changed\n");
+				} else {
+					//printf("should not have changed\n");
+					//reset_to_prev(dv, dvert);
+					MEM_freeN(dv->dw);
+					MEM_freeN(dv);
+					return TRUE;
+				}
+			} else {
+				if(tdw->weight < oldw) {
+					//printf("should have changed\n");
+				} else {
+					//printf("should not have changed\n");
+					//reset_to_prev(dv, dvert);
+					MEM_freeN(dv->dw);
+					MEM_freeN(dv);
+					return TRUE;
+				}
+			}
+		}
+	}
 	MEM_freeN(dv->dw);
 	MEM_freeN(dv);
+	return FALSE;
 }
 
 /* Jason was here duplicate function I used in DerivedMesh.c*/
@@ -1547,7 +1573,8 @@
 				   int vgroup_mirror, char *validmap, int multipaint)
 {
 	Mesh *me= ob->data;
-	MDeformWeight *dw, *uw, *tdw, *tuw;
+	//						Jason: tdw, tuw
+	MDeformWeight *dw, *uw, *tdw = NULL, *tuw;
 	int vgroup= ob->actdef-1;
 
 	/* Jason was here */
@@ -1557,10 +1584,13 @@
 	int selected;
 	float oldw;
 	float neww;
-	float testw;
+	float testw=0;
 	int defcnt;
 	float change = 0;
+	float oldChange = 0;
 	int i;
+	MDeformVert *dv = NULL;
+
 	// Need to know which groups are bone groups
 	if(validmap) {
 		bone_groups = validmap;
@@ -1590,8 +1620,14 @@
 	wpaint_blend(wp, dw, uw, alpha, paintweight, flip, multipaint && selected >1);
 	neww = dw->weight;
 	dw->weight = oldw;
+	
 	// setup multi-paint
 	if(selected > 1 && multipaint) {
+		dv = MEM_mallocN(sizeof (*(me->dvert+index)), "prevMDeformVert");
+
+		dv->dw= MEM_dupallocN((me->dvert+index)->dw);
+		dv->flag = (me->dvert+index)->flag;
+		dv->totweight = (me->dvert+index)->totweight;
 		tdw = dw;
 		tuw = uw;
 		change = get_mp_change(wp->wpaint_prev+index, selection, neww-oldw);
@@ -1605,17 +1641,18 @@
 					change = 0;
 				}
 			}
-			if(change && tdw->weight * change && tuw->weight) {
+			if(change && tuw->weight && tuw->weight * change) {
 				if(tdw->weight != tuw->weight) {
+					oldChange = tdw->weight/tuw->weight;
 					testw = tuw->weight*change;
 					if( testw > tuw->weight ) {
-						if(change > tdw->weight/tuw->weight) {
+						if(change > oldChange) {
 							reset_to_prev(wp->wpaint_prev+index, me->dvert+index);
 						} else {
 							change = 0;
 						}
 					} else {
-						if(change < tdw->weight/tuw->weight) {
+						if(change < oldChange) {
 							reset_to_prev(wp->wpaint_prev+index, me->dvert+index);
 						} else {
 							change = 0;
@@ -1628,8 +1665,15 @@
 		}
 	}
 	/* Jason was here */
-	apply_mp_lcks_normalize(ob, me, index, dw, defcnt, change, oldw, neww, selection, selected, bone_groups, validmap, flags, multipaint);
-
+	if(apply_mp_lcks_normalize(ob, me, index, dw, tdw, defcnt, change, oldChange, oldw, neww, selection, selected, bone_groups, validmap, flags, multipaint)) {
+		reset_to_prev(dv, me->dvert+index);
+		change = 0;
+		oldChange = 0;
+	}
+	if(dv) {
+		MEM_freeN(dv->dw);
+		MEM_freeN(dv);
+	}
 	// dvert may have been altered greatly
 	dw = defvert_find_index(me->dvert+index, vgroup);
 
@@ -1644,7 +1688,7 @@
 			/* Jason */
 			//uw->weight= dw->weight;
 			/* Jason */
-			apply_mp_lcks_normalize(ob, me, j, uw, defcnt, change, oldw, neww, selection, selected, bone_groups, validmap, flags, multipaint);
+			apply_mp_lcks_normalize(ob, me, j, uw, tdw, defcnt, change, oldChange, oldw, neww, selection, selected, bone_groups, validmap, flags, multipaint);
 		}
 	}
 	/* Jason */
@@ -2336,9 +2380,9 @@
 	if((vp->flag & VP_COLINDEX && mface->mat_nr!=ob->actcol-1) ||
 	   ((me->editflag & ME_EDIT_PAINT_MASK) && !(mface->flag & ME_FACE_SEL))
 	   || (selectedVerts && !(m[0] || m[1] || m[2] || m[3]))) {// Jason
-		if(selectedVerts) {
-			MEM_freeN(m);
-		}
+			if(selectedVerts) {
+				MEM_freeN(m);
+			}
 		   return;
 	}
 




More information about the Bf-blender-cvs mailing list