[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