Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2004-09-30 18:27:20 +0400
committerTon Roosendaal <ton@blender.org>2004-09-30 18:27:20 +0400
commit9e0456d36e62796db82253f441471252f0011903 (patch)
tree5cf71f2e4b2643a2b4d4948037f2630b66848232 /source/blender/src/editmesh_mods.c
parentc5621317b8a7a37382dee261c5a7909c02fcfd77 (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.c58
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;