[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38544] branches/soc-2011-radish/source/ blender: Added vertex masking support for the weight paint vgroup functions including :

Jason Hays jason_hays22 at mymail.eku.edu
Wed Jul 20 17:56:35 CEST 2011


Revision: 38544
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38544
Author:   jason_hays22
Date:     2011-07-20 15:56:35 +0000 (Wed, 20 Jul 2011)
Log Message:
-----------
Added vertex masking support for the weight paint vgroup functions including:
Normalize, Normalize All, Invert, Clean, and Levels.

Face mask and vertex select/mask are now mutually exclusive options.

Went ahead and allowed vertex selection support and masking for vertex paint.

Modified Paths:
--------------
    branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2011-radish/source/blender/blenkernel/intern/paint.c
    branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c
    branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c
    branches/soc-2011-radish/source/blender/editors/space_view3d/drawmesh.c
    branches/soc-2011-radish/source/blender/editors/space_view3d/drawobject.c
    branches/soc-2011-radish/source/blender/editors/space_view3d/view3d_header.c
    branches/soc-2011-radish/source/blender/makesrna/intern/rna_mesh.c

Modified: branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c	2011-07-20 15:33:27 UTC (rev 38543)
+++ branches/soc-2011-radish/source/blender/blenkernel/intern/DerivedMesh.c	2011-07-20 15:56:35 UTC (rev 38544)
@@ -2333,7 +2333,7 @@
 static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask)
 {
 	Object *obact = scene->basact?scene->basact->object:NULL;
-	int editing = paint_facesel_test(ob);
+	int editing = paint_facesel_test(ob) || paint_vertsel_test(ob);// Jason: paint_vertsel_test
 	/* weight paint and face select need original indices because of selection buffer drawing */
 	int needMapping = (ob==obact) && (editing || (ob->mode & (OB_MODE_WEIGHT_PAINT|OB_MODE_VERTEX_PAINT)));
 

Modified: branches/soc-2011-radish/source/blender/blenkernel/intern/paint.c
===================================================================
--- branches/soc-2011-radish/source/blender/blenkernel/intern/paint.c	2011-07-20 15:33:27 UTC (rev 38543)
+++ branches/soc-2011-radish/source/blender/blenkernel/intern/paint.c	2011-07-20 15:56:35 UTC (rev 38544)
@@ -99,7 +99,7 @@
 /* Jason */
 int paint_vertsel_test(Object *ob)
 {
-	return (ob && ob->type==OB_MESH && ob->data && (((Mesh *)ob->data)->editflag & ME_EDIT_VERT_SEL) && (ob->mode & (OB_MODE_WEIGHT_PAINT)));
+	return (ob && ob->type==OB_MESH && ob->data && (((Mesh *)ob->data)->editflag & ME_EDIT_VERT_SEL) && (ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT)));
 }
 void paint_init(Paint *p, const char col[3])
 {

Modified: branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c
===================================================================
--- branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c	2011-07-20 15:33:27 UTC (rev 38543)
+++ branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c	2011-07-20 15:56:35 UTC (rev 38544)
@@ -701,6 +701,10 @@
 	MDeformWeight *dw;
 	MDeformVert *dvert, **dvert_array=NULL;
 	int i, def_nr, dvert_tot=0;
+	// Jason
+	Mesh *me = ob->data;
+	MVert *mv = me->mvert;
+	int selectedVerts = me->editflag & ME_EDIT_VERT_SEL;
 
 	ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
@@ -712,6 +716,11 @@
 		def_nr= ob->actdef-1;
 
 		for(i = 0; i < dvert_tot; i++) {
+			// Jason
+			if(selectedVerts && !((mv+i)->flag & SELECT)) {
+				continue;
+			}
+
 			dvert = dvert_array[i];
 			dw = defvert_find_index(dvert, def_nr);
 			if(dw) {
@@ -721,6 +730,11 @@
 
 		if(weight_max > 0.0f) {
 			for(i = 0; i < dvert_tot; i++) {
+				// Jason
+				if(selectedVerts && !((mv+i)->flag & SELECT)) {
+					continue;
+				}
+
 				dvert = dvert_array[i];
 				dw = defvert_find_index(dvert, def_nr);
 				if(dw) {
@@ -742,7 +756,11 @@
 	MDeformWeight *dw;
 	MDeformVert *dvert, **dvert_array=NULL;
 	int i, def_nr, dvert_tot=0;
-	
+	// Jason
+	Mesh *me = ob->data;
+	MVert *mv = me->mvert;
+	int selectedVerts = me->editflag & ME_EDIT_VERT_SEL;
+
 	ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 	
 	dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
@@ -751,6 +769,11 @@
 		def_nr= ob->actdef-1;
 		
 		for(i = 0; i < dvert_tot; i++) {
+			// Jason
+			if(selectedVerts && !((mv+i)->flag & SELECT)) {
+				continue;
+			}
+
 			dvert = dvert_array[i];
 			dw = defvert_find_index(dvert, def_nr);
 			if(dw) {
@@ -772,6 +795,11 @@
 	int i, dvert_tot=0;
 	float tot_weight;
 
+	// Jason
+	Mesh *me = ob->data;
+	MVert *mv = me->mvert;
+	int selectedVerts = me->editflag & ME_EDIT_VERT_SEL;
+
 	ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
 	if(dvert_array) {
@@ -781,6 +809,10 @@
 			for(i = 0; i < dvert_tot; i++) {
 				float lock_iweight= 1.0f;
 				int j;
+				// Jason
+				if(selectedVerts && !((mv+i)->flag & SELECT)) {
+					continue;
+				}
 
 				tot_weight= 0.0f;
 				dw_act= NULL;
@@ -821,6 +853,11 @@
 		else {
 			for(i = 0; i < dvert_tot; i++) {
 				int j;
+				// Jason
+				if(selectedVerts && !((mv+i)->flag & SELECT)) {
+					continue;
+				}
+
 				tot_weight= 0.0f;
 				dvert = dvert_array[i];
 
@@ -880,6 +917,10 @@
 	MDeformWeight *dw;
 	MDeformVert *dvert, **dvert_array=NULL;
 	int i, def_nr, dvert_tot=0;
+	// Jason
+	Mesh *me = ob->data;
+	MVert *mv = me->mvert;
+	int selectedVerts = me->editflag & ME_EDIT_VERT_SEL;
 
 	ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
@@ -890,6 +931,10 @@
 
 
 		for(i = 0; i < dvert_tot; i++) {
+			// Jason
+			if(selectedVerts && !((mv+i)->flag & SELECT)) {
+				continue;
+			}
 			dvert = dvert_array[i];
 
 			if(auto_assign) {
@@ -1002,6 +1047,10 @@
 	MDeformWeight *dw;
 	MDeformVert *dvert, **dvert_array=NULL;
 	int i, def_nr, dvert_tot=0;
+	// Jason
+	Mesh *me = ob->data;
+	MVert *mv = me->mvert;
+	int selectedVerts = me->editflag & ME_EDIT_VERT_SEL;
 
 	ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
@@ -1011,6 +1060,10 @@
 		def_nr= ob->actdef-1;
 
 		for(i = 0; i < dvert_tot; i++) {
+			// Jason
+			if(selectedVerts && !((mv+i)->flag & SELECT)) {
+				continue;
+			}
 			dvert = dvert_array[i];
 
 			dw= defvert_find_index(dvert, def_nr);
@@ -1032,12 +1085,21 @@
 	MDeformWeight *dw;
 	MDeformVert *dvert, **dvert_array=NULL;
 	int i, dvert_tot=0;
+	// Jason
+	Mesh *me = ob->data;
+	MVert *mv = me->mvert;
+	int selectedVerts = me->editflag & ME_EDIT_VERT_SEL;
 
 	ED_vgroup_give_parray(ob->data, &dvert_array, &dvert_tot);
 
 	if(dvert_array) {
 		for(i = 0; i < dvert_tot; i++) {
 			int j;
+			// Jason
+			if(selectedVerts && !((mv+i)->flag & SELECT)) {
+				continue;
+			}
+
 			dvert = dvert_array[i];
 			j= dvert->totweight;
 

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-20 15:33:27 UTC (rev 38543)
+++ branches/soc-2011-radish/source/blender/editors/sculpt_paint/paint_vertex.c	2011-07-20 15:56:35 UTC (rev 38544)
@@ -361,8 +361,10 @@
 	Mesh *me;
 	MFace *mf;
 	unsigned int *mcol;
-	int i, selected;
-
+	int i, selected, selectedVerts;//Jason
+	// Jason
+	MVert *mv;
+	
 	me= get_mesh(ob);
 	if(me==NULL || me->totface==0) return;
 
@@ -370,15 +372,29 @@
 		make_vertexcol(ob);
 
 	selected= (me->editflag & ME_EDIT_PAINT_MASK);
+	// Jason
+	selectedVerts = (me->editflag & ME_EDIT_VERT_SEL);
+	mv = me->mvert;
 
 	mf = me->mface;
 	mcol = (unsigned int*)me->mcol;
 	for (i = 0; i < me->totface; i++, mf++, mcol+=4) {
-		if (!selected || mf->flag & ME_FACE_SEL) {
-			mcol[0] = paintcol;
-			mcol[1] = paintcol;
-			mcol[2] = paintcol;
-			mcol[3] = paintcol;
+		if (!selected || mf->flag & ME_FACE_SEL || selectedVerts) {
+			if(selectedVerts) {
+				if(((mv+mf->v1)->flag & SELECT))
+					mcol[0] = paintcol;
+				if(((mv+mf->v2)->flag & SELECT))
+					mcol[1] = paintcol;
+				if(((mv+mf->v3)->flag & SELECT))
+					mcol[2] = paintcol;
+				if(mf->v4 && ((mv+mf->v4)->flag & SELECT))
+					mcol[3] = paintcol;
+			} else {
+				mcol[0] = paintcol;
+				mcol[1] = paintcol;
+				mcol[2] = paintcol;
+				mcol[3] = paintcol;
+			}
 		}
 	}
 	
@@ -443,7 +459,7 @@
 			for (i=0; i<3 || faceverts[i]; i++) {
 				if(!((me->dvert+faceverts[i])->flag)) {
 					// Jason
-					if(selectedVerts && !((me->mvert+faceverts[i])->flag & 1)) {
+					if(selectedVerts && !((me->mvert+faceverts[i])->flag & SELECT)) {
 						continue;
 					}
 
@@ -1972,10 +1988,10 @@
 		if(indexar[index] && indexar[index]<=me->totface) {
 			MFace *mface= me->mface + (indexar[index]-1);
 					
-			(me->dvert+mface->v1)->flag= selectedVerts ? ((me->mvert+mface->v1)->flag & 1): 1;
-			(me->dvert+mface->v2)->flag= selectedVerts ? ((me->mvert+mface->v2)->flag & 1): 1;
-			(me->dvert+mface->v3)->flag= selectedVerts ? ((me->mvert+mface->v3)->flag & 1): 1;
-			if(mface->v4) (me->dvert+mface->v4)->flag= selectedVerts ? ((me->mvert+mface->v4)->flag & 1): 1;
+			(me->dvert+mface->v1)->flag= selectedVerts ? ((me->mvert+mface->v1)->flag & SELECT): 1;
+			(me->dvert+mface->v2)->flag= selectedVerts ? ((me->mvert+mface->v2)->flag & SELECT): 1;
+			(me->dvert+mface->v3)->flag= selectedVerts ? ((me->mvert+mface->v3)->flag & SELECT): 1;
+			if(mface->v4) (me->dvert+mface->v4)->flag= selectedVerts ? ((me->mvert+mface->v4)->flag & SELECT): 1;
 					
 			if(brush->vertexpaint_tool==VP_BLUR) {
 				MDeformWeight *dw, *(*dw_func)(MDeformVert *, const int);
@@ -2298,14 +2314,33 @@
 	Brush *brush = paint_brush(&vp->paint);
 	Mesh *me = get_mesh(ob);
 	MFace *mface= ((MFace*)me->mface) + index;
+	// Jason
+	MVert *mv = me->mvert;
+	int selectedVerts = (me->editflag & ME_EDIT_VERT_SEL);
+	char *m;
+
 	unsigned int *mcol= ((unsigned int*)me->mcol) + 4*index;
 	unsigned int *mcolorig= ((unsigned int*)vp->vpaint_prev) + 4*index;
 	float alpha;
 	int i;
 	
+	// Jason
+	if(selectedVerts) {
+		m = MEM_mallocN(sizeof(char)*4, "selectedVerts");
+		m[0] = ((mv+mface->v1)->flag & SELECT);
+		m[1] = ((mv+mface->v2)->flag & SELECT);
+		m[2] = ((mv+mface->v3)->flag & SELECT);
+		m[3] = (mface->v4 && ((mv+mface->v4)->flag & SELECT));
+	}
+
 	if((vp->flag & VP_COLINDEX && mface->mat_nr!=ob->actcol-1) ||
-	   ((me->editflag & ME_EDIT_PAINT_MASK) && !(mface->flag & ME_FACE_SEL)))
-		return;
+	   ((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);
+		}
+		   return;
+	}
 
 	if(brush->vertexpaint_tool==VP_BLUR) {
 		unsigned int fcol1= mcol_blend( mcol[0], mcol[1], 128);
@@ -2320,10 +2355,16 @@
 	}
 
 	for(i = 0; i < (mface->v4 ? 4 : 3); ++i) {
-		alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat, vpd->vertexcosnos+6*(&mface->v1)[i], mval, pressure);
-		if(alpha)
-			vpaint_blend(vp, mcol+i, mcolorig+i, vpd->paintcol, (int)(alpha*255.0f));
+		if(!selectedVerts || m[i]) {
+			alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat, vpd->vertexcosnos+6*(&mface->v1)[i], mval, pressure);
+			if(alpha)
+				vpaint_blend(vp, mcol+i, mcolorig+i, vpd->paintcol, (int)(alpha*255.0f));
+		}
 	}
+	// Jason
+	if(selectedVerts) {
+		MEM_freeN(m);
+	}
 }
 
 static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, PointerRNA *itemptr)

Modified: branches/soc-2011-radish/source/blender/editors/space_view3d/drawmesh.c
===================================================================

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list