diff options
author | Ton Roosendaal <ton@blender.org> | 2004-09-30 18:27:20 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2004-09-30 18:27:20 +0400 |
commit | 9e0456d36e62796db82253f441471252f0011903 (patch) | |
tree | 5cf71f2e4b2643a2b4d4948037f2630b66848232 /source/blender/src/editmesh_mods.c | |
parent | c5621317b8a7a37382dee261c5a7909c02fcfd77 (diff) |
Special request; Lasso Select (thanks andy for nagging! :)
Is committed now for further test;
What works:
- Hold CTRL while leftmouse-draw (gesture) for lasso-select
- Hold also SHIFT for lasso-deselect
- In Object mode it only selects on object centers now
- In Mesh edit mode it works on same level as borderselect
Not:
- other editmodes or objects in general
Also fixed crash with circle-selecting outside of window edge.
Also put back wire-extra draw for curves (previous trial broke mball wire)
Turned borderselect, circle, lasso into dashed lines for visual language.
Diffstat (limited to 'source/blender/src/editmesh_mods.c')
-rw-r--r-- | source/blender/src/editmesh_mods.c | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c index 71b7c81d483..e0788df5cc2 100644 --- a/source/blender/src/editmesh_mods.c +++ b/source/blender/src/editmesh_mods.c @@ -238,9 +238,12 @@ int EM_init_backbuf_border(short xmin, short ymin, short xmax, short ymax) if(G.obedit==NULL || G.vd->drawtype<OB_SOLID || (G.vd->flag & V3D_ZBUF_SELECT)==0) return 0; if(em_vertoffs==0) return 0; - selbuf= MEM_callocN(em_vertoffs+1, "selbuf"); - dr= buf= read_backbuf(xmin, ymin, xmax, ymax); + if(buf==NULL) return 0; + + /* build selection lookup */ + selbuf= MEM_callocN(em_vertoffs+1, "selbuf"); + a= (xmax-xmin+1)*(ymax-ymin+1); while(a--) { if(*dr>0 && *dr<=em_vertoffs) selbuf[*dr]= 1; @@ -264,6 +267,57 @@ void EM_free_backbuf_border(void) selbuf= NULL; } +/* mcords is a polygon mask + - grab backbuffer, + - draw with black in backbuffer, + - grab again and compare + returns 'OK' +*/ +int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax) +{ + unsigned int *buf, *bufmask, *dr, *drm; + int a; + + if(G.obedit==NULL || G.vd->drawtype<OB_SOLID || (G.vd->flag & V3D_ZBUF_SELECT)==0) return 0; + if(em_vertoffs==0) return 0; + + dr= buf= read_backbuf(xmin, ymin, xmax, ymax); + if(buf==NULL) return 0; + + /* draw the mask */ +#ifdef __APPLE__ + glDrawBuffer(GL_AUX0); +#endif + glDisable(GL_DEPTH_TEST); + + persp(PERSP_WIN); + glColor3ub(0, 0, 0); + glBegin(GL_POLYGON); + for(a=0; a<tot; a++) glVertex2s(mcords[a][0], mcords[a][1]); + glEnd(); + persp(PERSP_VIEW); + glFinish(); // to be sure readpixels sees mask + + glDrawBuffer(GL_BACK); + + /* grab mask */ + drm= bufmask= read_backbuf(xmin, ymin, xmax, ymax); + if(bufmask==NULL) return 0; // only when mem alloc fails, go crash somewhere else! + + /* build selection lookup */ + selbuf= MEM_callocN(em_vertoffs+1, "selbuf"); + + a= (xmax-xmin+1)*(ymax-ymin+1); + while(a--) { + if(*dr>0 && *dr<=em_vertoffs && *drm==0) selbuf[*dr]= 1; + dr++; drm++; + } + MEM_freeN(buf); + MEM_freeN(bufmask); + return 1; + +} + static EditVert *findnearestvert_f(short *dist, short sel) { static EditVert *acto= NULL; |