[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25763] trunk/blender/source/blender/ windowmanager/intern/wm_gesture.c: Small tweaks to gesture drawing to show the filled selectable area.

Matt Ebb matt at mke3.net
Wed Jan 6 05:52:14 CET 2010


Revision: 25763
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25763
Author:   broken
Date:     2010-01-06 05:52:13 +0100 (Wed, 06 Jan 2010)

Log Message:
-----------
Small tweaks to gesture drawing to show the filled selectable area.
Gives nice feedback for what will be selected, especially with lasso.

Modified Paths:
--------------
    trunk/blender/source/blender/windowmanager/intern/wm_gesture.c

Modified: trunk/blender/source/blender/windowmanager/intern/wm_gesture.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_gesture.c	2010-01-06 04:08:06 UTC (rev 25762)
+++ trunk/blender/source/blender/windowmanager/intern/wm_gesture.c	2010-01-06 04:52:13 UTC (rev 25763)
@@ -149,8 +149,18 @@
 {
 	rcti *rect= (rcti *)gt->customdata;
 	
+	glEnable(GL_BLEND);
+	glColor4f(1.0, 1.0, 1.0, 0.05);
+	glBegin(GL_QUADS);
+	glVertex2s(rect->xmax, rect->ymin);
+	glVertex2s(rect->xmax, rect->ymax);
+	glVertex2s(rect->xmin, rect->ymax);
+	glVertex2s(rect->xmin, rect->ymin);
+	glEnd();
+	glDisable(GL_BLEND);
+	
 	glEnable(GL_LINE_STIPPLE);
-	glColor3ub(0, 0, 0);
+	glColor3ub(96, 96, 96);
 	glLineStipple(1, 0xCCCC);
 	sdrawbox(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
 	glColor3ub(255, 255, 255);
@@ -164,7 +174,7 @@
 	rcti *rect= (rcti *)gt->customdata;
 	
 	glEnable(GL_LINE_STIPPLE);
-	glColor3ub(0, 0, 0);
+	glColor3ub(96, 96, 96);
 	glLineStipple(1, 0xAAAA);
 	sdrawline(rect->xmin, rect->ymin, rect->xmax, rect->ymax);
 	glColor3ub(255, 255, 255);
@@ -181,8 +191,13 @@
 
 	glTranslatef((float)rect->xmin, (float)rect->ymin, 0.0f);
 
+	glEnable(GL_BLEND);
+	glColor4f(1.0, 1.0, 1.0, 0.05);
+	glutil_draw_filled_arc(0.0, M_PI*2.0, rect->xmax, 40);
+	glDisable(GL_BLEND);
+	
 	glEnable(GL_LINE_STIPPLE);
-	glColor3ub(0, 0, 0);
+	glColor3ub(96, 96, 96);
 	glLineStipple(1, 0xAAAA);
 	glutil_draw_lined_arc(0.0, M_PI*2.0, rect->xmax, 40);
 	glColor3ub(255, 255, 255);
@@ -194,15 +209,66 @@
 	
 }
 
+/* more than 64 intersections will just leak.. not much and not a likely scenario */
+typedef struct TessData { int num; short *intersections[64]; } TessData;
+
+static void combine_cb(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], void **dataOut, void *data)
+{
+	short *vertex;
+	TessData *td = (TessData *)data;
+	vertex = (short *)malloc(2*sizeof(short));
+	vertex[0] = (short)coords[0];
+	vertex[1] = (short)coords[1];
+	*dataOut = vertex;
+
+	if (td->num < 64) {
+		td->intersections[td->num++] = vertex;
+	}
+}
+
+static void free_tess_data(GLUtesselator *tess, TessData *td)
+{
+	int i;
+	for (i=0; i<td->num; i++) {
+		free(td->intersections[i]);
+	}
+	MEM_freeN(td);
+	td = NULL;
+	gluDeleteTess(tess);
+}
+
 static void wm_gesture_draw_lasso(wmWindow *win, wmGesture *gt)
 {
 	short *lasso= (short *)gt->customdata;
 	int i;
+	TessData *data=MEM_callocN(sizeof(TessData), "tesselation data");
+	GLUtesselator *tess = gluNewTess();
 	
+	/* use GLU tesselator to draw a filled lasso shape */
+	gluTessCallback(tess, GLU_TESS_BEGIN, glBegin);
+	gluTessCallback(tess, GLU_TESS_VERTEX, glVertex2sv);
+	gluTessCallback(tess, GLU_TESS_END, glEnd);
+	gluTessCallback(tess, GLU_TESS_COMBINE_DATA, combine_cb);
+					
+	glEnable(GL_BLEND);
+	glColor4f(1.0, 1.0, 1.0, 0.05);
+	gluTessBeginPolygon (tess, data);
+	gluTessBeginContour (tess);
+	for (i=0; i<gt->points; i++, lasso+=2) {
+		GLdouble d_lasso[2] = {(GLdouble)lasso[0], (GLdouble)lasso[1]};
+		gluTessVertex (tess, d_lasso, lasso);
+	}
+	gluTessEndContour (tess);
+	gluTessEndPolygon (tess);
+	glDisable(GL_BLEND);
+	
+	free_tess_data(tess, data);
+	
 	glEnable(GL_LINE_STIPPLE);
-	glColor3ub(0, 0, 0);
+	glColor3ub(96, 96, 96);
 	glLineStipple(1, 0xAAAA);
 	glBegin(GL_LINE_STRIP);
+	lasso= (short *)gt->customdata;
 	for(i=0; i<gt->points; i++, lasso+=2)
 		glVertex2sv(lasso);
 	if(gt->type==WM_GESTURE_LASSO)
@@ -228,7 +294,7 @@
 	rcti *rect= (rcti *)gt->customdata;
 	
 	glEnable(GL_LINE_STIPPLE);
-	glColor3ub(0, 0, 0);
+	glColor3ub(96, 96, 96);
 	glLineStipple(1, 0xCCCC);
 	sdrawline(rect->xmin - win->sizex, rect->ymin, rect->xmin + win->sizex, rect->ymin);
 	sdrawline(rect->xmin, rect->ymin - win->sizey, rect->xmin, rect->ymin + win->sizey);





More information about the Bf-blender-cvs mailing list