[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39219] branches/soc-2011-radish/source/ blender/editors: Weight Paint' s vertex selection tools use zbuf like face select.

Jason Hays jason_hays22 at mymail.eku.edu
Tue Aug 9 18:32:16 CEST 2011


Revision: 39219
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39219
Author:   jason_hays22
Date:     2011-08-09 16:32:15 +0000 (Tue, 09 Aug 2011)
Log Message:
-----------
Weight Paint's vertex selection tools use zbuf like face select.
Removed the extra, unused object mode specific selection functions I had added
(they aren't being used anywhere as of now, and they didn't support zbuffering).

Modified Paths:
--------------
    branches/soc-2011-radish/source/blender/editors/mesh/editmesh_mods.c
    branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c
    branches/soc-2011-radish/source/blender/editors/space_view3d/drawobject.c
    branches/soc-2011-radish/source/blender/editors/space_view3d/view3d_select.c

Modified: branches/soc-2011-radish/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- branches/soc-2011-radish/source/blender/editors/mesh/editmesh_mods.c	2011-08-09 16:28:08 UTC (rev 39218)
+++ branches/soc-2011-radish/source/blender/editors/mesh/editmesh_mods.c	2011-08-09 16:32:15 UTC (rev 39219)
@@ -266,6 +266,7 @@
 	/* method in use for face selecting too */
 	if(vc->obedit==NULL) {
 		if(paint_facesel_test(vc->obact));
+		else if(paint_vertsel_test(vc->obact));//Jason
 		else return 0;
 	}
 	else if(vc->v3d->drawtype<OB_SOLID || (vc->v3d->flag & V3D_ZBUF_SELECT)==0) return 0;
@@ -328,6 +329,7 @@
 	/* method in use for face selecting too */
 	if(vc->obedit==NULL) {
 		if(paint_facesel_test(vc->obact));
+		else if (paint_vertsel_test(vc->obact));//Jason
 		else return 0;
 	}
 	else if(vc->v3d->drawtype<OB_SOLID || (vc->v3d->flag & V3D_ZBUF_SELECT)==0) return 0;

Modified: branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c
===================================================================
--- branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c	2011-08-09 16:28:08 UTC (rev 39218)
+++ branches/soc-2011-radish/source/blender/editors/object/object_vgroup.c	2011-08-09 16:32:15 UTC (rev 39219)
@@ -892,6 +892,7 @@
 	MEM_freeN(projA);
 	MEM_freeN(projB);
 }
+// Jason
 static int dm_deform_clear(DerivedMesh *dm, Object *ob) {
 	dm->needsFree = 1;
 	dm->release(dm);
@@ -899,9 +900,11 @@
 	// dm = NULL;
 	return NULL;
 }
+// Jason
 static DerivedMesh* dm_deform_recalc(Scene *scene, Object *ob) {
 	return mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
 }
+// Jason
 static void moveCloserToDistanceFromPlane(Scene *scene, Object *ob, Mesh *me, int index, float *norm, float *coord, float d, float distToBe, float strength, float cp) {
 	DerivedMesh *dm;
 	MDeformWeight *dw;

Modified: branches/soc-2011-radish/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2011-radish/source/blender/editors/space_view3d/drawobject.c	2011-08-09 16:28:08 UTC (rev 39218)
+++ branches/soc-2011-radish/source/blender/editors/space_view3d/drawobject.c	2011-08-09 16:32:15 UTC (rev 39219)
@@ -2860,16 +2860,8 @@
 	// Jason
 	if(paint_vertsel_test(ob)) {
 		glColor3f(0.0f, 0.0f, 0.0f);
-		 glPointSize(2.0f);
-		// TODO clarify:
-		// there is clearly something I don't understand, when it was 
-		// dt != OB_WIRE instead, it still drew in wire mode! (in weight paint mode)
-		if(dt != OB_SOLID || ob->mode & OB_MODE_VERTEX_PAINT) {
-			dm->drawEdges(dm, (totface==0), TRUE);
-		}
-		glPointSize(3.0f);
+		glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE));
 		dm->drawSelectedVerts(dm);
-		//draw_obmode_dm_verts(dm, 1);
 		glPointSize(1.0f);
 	}
 	dm->release(dm);
@@ -6421,7 +6413,30 @@
 }
 
 /* ***************** BACKBUF SEL (BBS) ********* */
+/* Jason */
+static void bbs_obmode_mesh_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
+{
+	// TODO: support hidden vertices
+	int offset = (intptr_t) userData;
+	//EditVert *eve = EM_get_vert_for_index(index);
 
+	//if (eve->h==0) {
+	WM_set_framebuffer_index_color(offset+index);
+	bglVertex3fv(co);
+	//}
+}
+/* Jason */
+static void bbs_obmode_mesh_verts(Scene* scene, Object *ob, DerivedMesh *dm, int offset)
+{
+	Mesh *me = (Mesh*)ob->data;
+
+	glPointSize( UI_GetThemeValuef(TH_VERTEX_SIZE) );
+	bglBegin(GL_POINTS);
+	dm->foreachMappedVert(dm, bbs_obmode_mesh_verts__mapFunc, (void*)(intptr_t) offset);
+	bglEnd();
+	glPointSize(1.0);
+}
+
 static void bbs_mesh_verts__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
 {
 	int offset = (intptr_t) userData;
@@ -6519,7 +6534,18 @@
 		return 0;
 	}
 }
+/* Jason */
+// must have called WM_set_framebuffer_index_color beforehand
+static int bbs_mesh_solid_hide2__setDrawOpts(void *userData, int index, int *UNUSED(drawSmooth_r))
+{
+	Mesh *me = userData;
 
+	if (!(me->mface[index].flag&ME_HIDE)) {
+		return 1;
+	} else {
+		return 0;
+	}
+}
 static void bbs_mesh_solid(Scene *scene, Object *ob)
 {
 	DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask);
@@ -6578,7 +6604,23 @@
 
 			EM_free_index_arrays();
 		}
-		else bbs_mesh_solid(scene, ob);
+		else {
+			Mesh *me= ob->data;
+			if(me->editflag & ME_EDIT_VERT_SEL) {
+				DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask);
+				WM_set_framebuffer_index_color(me->totvert+2);
+				glColor3ub(0, 0, 0);
+
+				dm->drawMappedFaces(dm, bbs_mesh_solid_hide2__setDrawOpts, me, 0, GPU_enable_material);
+
+				
+				bbs_obmode_mesh_verts(scene, ob, dm, 1);
+				em_vertoffs = me->totvert+1;
+				dm->release(dm);
+			}
+			else bbs_mesh_solid(scene, ob);
+		}
+		
 	}
 		break;
 	case OB_CURVE:

Modified: branches/soc-2011-radish/source/blender/editors/space_view3d/view3d_select.c
===================================================================
--- branches/soc-2011-radish/source/blender/editors/space_view3d/view3d_select.c	2011-08-09 16:28:08 UTC (rev 39218)
+++ branches/soc-2011-radish/source/blender/editors/space_view3d/view3d_select.c	2011-08-09 16:32:15 UTC (rev 39219)
@@ -54,6 +54,11 @@
 #include "BLI_linklist.h"
 #include "BLI_utildefines.h"
 
+// Jason--vertex box select
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+#include "BKE_global.h"
+
 #include "BKE_context.h"
 #include "BKE_paint.h"
 #include "BKE_armature.h"
@@ -641,15 +646,6 @@
 	ED_view3d_init_mats_rv3d(vc->obedit, vc->rv3d); /* for foreach's screen/vert projection */
 	nurbs_foreachScreenVert(vc, do_lasso_select_curve__doSelect, &data);
 }
-/* Jason */
-static void do_obmode_lasso_select__doSelect(void *userData, MVert *mv, int x, int y)
-{
-	struct { int (*mcords)[2]; short moves; short select; } *data = userData;
-
-	if (lasso_inside(data->mcords, data->moves, x, y)) {
-		mv->flag = data->select?(mv->flag|SELECT):(mv->flag&~SELECT);
-	}
-}
 static void do_lasso_select_lattice__doSelect(void *userData, BPoint *bp, int x, int y)
 {
 	struct { int (*mcords)[2]; short moves; short select; } *data = userData;
@@ -751,39 +747,63 @@
 	}
 }
 /* Jason */
-static void do_obmode_box_select__doSelect(void *userData, MVert *mv, int x, int y)
-{
-	struct { ViewContext vc; rcti *rect; int select; } *data = userData;
-
-	if (BLI_in_rcti(data->rect, x, y)) {
-		mv->flag = data->select?(mv->flag|SELECT):(mv->flag&~SELECT);
-	}
-}
-/* Jason */
 int do_paintvert_box_select(ViewContext *vc, rcti *rect, int select, int extend)
 {
-	Object *ob= vc->obact;
-	Mesh *me= ob?ob->data:NULL;
+	Mesh *me;
+	MVert *mvert;
+	struct ImBuf *ibuf;
+	unsigned int *rt;
+	int a, index;
+	char *selar;
 	int sx= rect->xmax-rect->xmin+1;
 	int sy= rect->ymax-rect->ymin+1;
 
-	struct { ViewContext vc; rcti *rect; int select; } data = {NULL};
+	me= vc->obact->data;
 
 	if(me==NULL || me->totvert==0 || sx*sy <= 0)
 		return OPERATOR_CANCELLED;
 
-	if(extend==0 && select)
-		paintvert_deselect_all_visible(ob, SEL_DESELECT, FALSE); /* flush selection at the end */
+	selar= MEM_callocN(me->totvert+1, "selar");
 
-	ED_view3d_init_mats_rv3d(ob, vc->rv3d);
-	data.vc = *vc;
-	data.rect = rect;
-	data.select= select;
+	if (extend == 0 && select)
+		paintvert_deselect_all_visible(vc->obact, SEL_DESELECT, FALSE);
 
-	mesh_obmode_foreachScreenVert(vc, do_obmode_box_select__doSelect, &data, 1);
+	view3d_validate_backbuf(vc);
 
-	paintvert_flush_flags(ob);
+	ibuf = IMB_allocImBuf(sx,sy,32,IB_rect);
+	rt = ibuf->rect;
+	glReadPixels(rect->xmin+vc->ar->winrct.xmin,  rect->ymin+vc->ar->winrct.ymin, sx, sy, GL_RGBA, GL_UNSIGNED_BYTE,  ibuf->rect);
+	if(ENDIAN_ORDER==B_ENDIAN) IMB_convert_rgba_to_abgr(ibuf);
 
+	a= sx*sy;
+	while(a--) {
+		if(*rt) {
+			index= WM_framebuffer_to_index(*rt);
+			if(index<=me->totvert) selar[index]= 1;
+		}
+		rt++;
+	}
+
+	mvert= me->mvert;
+	for(a=1; a<=me->totvert; a++, mvert++) {
+		if(selar[a]) {
+			if(mvert->flag & ME_HIDE);
+			else {
+				if(select) mvert->flag |= SELECT;
+				else mvert->flag &= ~SELECT;
+			}
+		}
+	}
+
+	IMB_freeImBuf(ibuf);
+	MEM_freeN(selar);
+
+#ifdef __APPLE__	
+	glReadBuffer(GL_BACK);
+#endif
+
+	paintvert_flush_flags(vc->obact);
+
 	return OPERATOR_FINISHED;
 }
 /* Jason */
@@ -791,20 +811,22 @@
 {
 	Object *ob= vc->obact;
 	Mesh *me= ob?ob->data:NULL;
+	rcti rect;
 
-	struct { int (*mcords)[2]; short moves; short select; } data = {NULL};
-
 	if(me==NULL || me->totvert==0)
 		return;
 
 	if(extend==0 && select)
 		paintvert_deselect_all_visible(ob, SEL_DESELECT, FALSE); /* flush selection at the end */
-	ED_view3d_init_mats_rv3d(ob, vc->rv3d);
-	data.select = select;
-	data.mcords = mcords;
-	data.moves= moves;
-	mesh_obmode_foreachScreenVert(vc, do_obmode_lasso_select__doSelect, &data, 1);
+	em_vertoffs= me->totvert+1;	/* max index array */
 
+	lasso_select_boundbox(&rect, mcords, moves);
+	EM_mask_init_backbuf_border(vc, mcords, moves, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
+
+	EM_backbuf_checkAndSelectTVerts(me, select);
+
+	EM_free_backbuf();
+
 	paintvert_flush_flags(ob);
 }
 static void do_lasso_select_paintface(ViewContext *vc, int mcords[][2], short moves, short extend, short select)
@@ -1913,53 +1935,44 @@
 	WM_operator_properties_gesture_border(ot, TRUE);
 }
 /*Jason*/
-static void findnearestWPvert__doClosest(void *userData, MVert *mv, int x, int y, int UNUSED(index))
+/* much like facesel_face_pick()*/
+/* returns 0 if not found, otherwise 1 */
+static int vertsel_vert_pick(struct bContext *C, Mesh *me, const int mval[2], unsigned int *index, short rect)
 {
-	struct { MVert *mv; short dist, select; int mval[2]; } *data = userData;
-	float temp = abs(data->mval[0]-x) + abs(data->mval[1]-y);
-	if((mv->flag & SELECT)==data->select)
-		temp += 5;
+	ViewContext vc;
+	view3d_set_viewcontext(C, &vc);
 
-	if(temp<data->dist) {
-		data->dist = temp;
+	if (!me || me->totvert==0)
+		return 0;
 
-		data->mv = mv;
+	if (rect) {
+		/* sample rect to increase changes of selecting, so that when clicking
+		   on an face in the backbuf, we can still select a vert */
+
+		int dist;
+		*index = view3d_sample_backbuf_rect(&vc, mval, 3, 1, me->totvert+1, &dist,0,NULL, NULL);
 	}
-}
-/*Jason*/
-static MVert *findnearestWPvert(ViewContext *vc, Object *obact, Mesh *me, const int mval[2], int sel)
-{
-	/* sel==1: selected gets a disadvantage */
-	struct { MVert *mv; short dist, select; int mval[2]; } data = {NULL};
+	else {
+		/* sample only on the exact position */

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list