[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [34165] trunk/blender/source/blender/ editors/sculpt_paint/paint_stroke.c: Paint cleanup:

Nicholas Bishop nicholasbishop at gmail.com
Sat Jan 8 00:36:48 CET 2011


Revision: 34165
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=34165
Author:   nicholasbishop
Date:     2011-01-07 23:36:48 +0000 (Fri, 07 Jan 2011)
Log Message:
-----------
Paint cleanup:

Pulled out the paint brush overlay drawing code into its own
function, brush drawing function was before ~250 lines.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/sculpt_paint/paint_stroke.c

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_stroke.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_stroke.c	2011-01-07 22:46:52 UTC (rev 34164)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_stroke.c	2011-01-07 23:36:48 UTC (rev 34165)
@@ -411,24 +411,123 @@
 	return hit;
 }
 
+/* Draw an overlay that shows what effect the brush's texture will
+   have on brush strength */
+static void paint_draw_alpha_overlay(Sculpt *sd, Brush *brush,
+				     ViewContext *vc, int viewport[4],
+				     int x, int y)
+{
+	rctf quad;
+
+	/* check for overlay mode */
+	if(!(brush->flag & BRUSH_TEXTURE_OVERLAY) ||
+	   !(ELEM(brush->mtex.brush_map_mode, MTEX_MAP_MODE_FIXED, MTEX_MAP_MODE_TILED)))
+		return;
+
+	/* save lots of GL state
+	   TODO: check on whether all of these are needed? */
+	glPushAttrib(GL_COLOR_BUFFER_BIT|
+		     GL_CURRENT_BIT|
+		     GL_DEPTH_BUFFER_BIT|
+		     GL_ENABLE_BIT|
+		     GL_LINE_BIT|
+		     GL_POLYGON_BIT|
+		     GL_STENCIL_BUFFER_BIT|
+		     GL_TRANSFORM_BIT|
+		     GL_VIEWPORT_BIT|
+		     GL_TEXTURE_BIT);
+
+	if(load_tex(sd, brush, vc)) {
+		glEnable(GL_BLEND);
+
+		glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+		glDepthMask(GL_FALSE);
+		glDepthFunc(GL_ALWAYS);
+
+		glMatrixMode(GL_TEXTURE);
+		glPushMatrix();
+		glLoadIdentity();
+
+		if(brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
+			/* brush rotation */
+			glTranslatef(0.5f, 0.5f, 0);
+			glRotatef(((brush->flag & BRUSH_RAKE) ?
+				   sd->last_angle : sd->special_rotation) * (180.0f/M_PI),
+				  0, 0, 1);
+			glTranslatef(-0.5f, -0.5f, 0);
+
+			/* scale based on tablet pressure */
+			if(sd->draw_pressure && brush_use_size_pressure(brush)) {
+				glTranslatef(0.5f, 0.5f, 0);
+				glScalef(1.0f/sd->pressure_value, 1.0f/sd->pressure_value, 1);
+				glTranslatef(-0.5f, -0.5f, 0);
+			}
+
+			if(sd->draw_anchored) {
+				const float *aim = sd->anchored_initial_mouse;
+				const rcti *win = &vc->ar->winrct;
+				quad.xmin = aim[0]-sd->anchored_size - win->xmin;
+				quad.ymin = aim[1]-sd->anchored_size - win->ymin;
+				quad.xmax = aim[0]+sd->anchored_size - win->xmin;
+				quad.ymax = aim[1]+sd->anchored_size - win->ymin;
+			}
+			else {
+				const int radius= brush_size(brush);
+				quad.xmin = x - radius;
+				quad.ymin = y - radius;
+				quad.xmax = x + radius;
+				quad.ymax = y + radius;
+			}
+		}
+		else {
+			quad.xmin = 0;
+			quad.ymin = 0;
+			quad.xmax = viewport[2];
+			quad.ymax = viewport[3];
+
+		}
+
+		/* set quad color */
+		glColor4f(U.sculpt_paint_overlay_col[0],
+			  U.sculpt_paint_overlay_col[1],
+			  U.sculpt_paint_overlay_col[2],
+			  brush->texture_overlay_alpha / 100.0f);
+
+		/* draw textured quad */
+		glBegin(GL_QUADS);
+		glTexCoord2f(0, 0);
+		glVertex2f(quad.xmin, quad.ymin);
+		glTexCoord2f(1, 0);
+		glVertex2f(quad.xmax, quad.ymin);
+		glTexCoord2f(1, 1);
+		glVertex2f(quad.xmax, quad.ymax);
+		glTexCoord2f(0, 1);
+		glVertex2f(quad.xmin, quad.ymax);
+		glEnd();
+
+		glPopMatrix();
+	}
+
+	glPopAttrib();
+}
+
 // XXX paint cursor now does a lot of the same work that is needed during a sculpt stroke
 // problem: all this stuff was not intended to be used at this point, so things feel a
 // bit hacked.  I've put lots of stuff in Brush that probably better goes in Paint
 // Functions should be refactored so that they can be used between sculpt.c and
 // paint_stroke.c clearly and optimally and the lines of communication between the
 // two modules should be more clearly defined.
-static void paint_draw_cursor(bContext *C, int x, int y, void *unused)
+static void paint_draw_cursor(bContext *C, int x, int y, void *UNUSED(unused))
 {
+	Paint *paint = paint_get_active(CTX_data_scene(C));
+	Brush *brush = paint_brush(paint);
+
 	ViewContext vc;
 
-	(void)unused;
-
 	view3d_set_viewcontext(C, &vc);
 
-	if (vc.obact->sculpt) {
-		Paint *paint = paint_get_active(CTX_data_scene(C));
+	if(vc.obact->sculpt) {
 		Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
-		Brush *brush = paint_brush(paint);
 
 		int pixel_radius, viewport[4];
 		float location[3], modelview[16], projection[16];
@@ -483,112 +582,12 @@
 
 		alpha = (paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) ? min_alpha + (visual_strength*(max_alpha-min_alpha)) : 0.50f;
 
-		if (ELEM(brush->mtex.brush_map_mode, MTEX_MAP_MODE_FIXED, MTEX_MAP_MODE_TILED) && brush->flag & BRUSH_TEXTURE_OVERLAY) {
-			glPushAttrib(
-				GL_COLOR_BUFFER_BIT|
-				GL_CURRENT_BIT|
-				GL_DEPTH_BUFFER_BIT|
-				GL_ENABLE_BIT|
-				GL_LINE_BIT|
-				GL_POLYGON_BIT|
-				GL_STENCIL_BUFFER_BIT|
-				GL_TRANSFORM_BIT|
-				GL_VIEWPORT_BIT|
-				GL_TEXTURE_BIT);
+		paint_draw_alpha_overlay(sd, brush, &vc, viewport, x, y);
 
-			if (load_tex(sd, brush, &vc)) {
-				glEnable(GL_BLEND);
-
-				glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-				glDepthMask(GL_FALSE);
-				glDepthFunc(GL_ALWAYS);
-
-				glMatrixMode(GL_TEXTURE);
-				glPushMatrix();
-				glLoadIdentity();
-
-				if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
-					glTranslatef(0.5f, 0.5f, 0);
-
-					if (brush->flag & BRUSH_RAKE) {
-						glRotatef(sd->last_angle*(float)(180.0/M_PI), 0, 0, 1);
-					}
-					else {
-						glRotatef(sd->special_rotation*(float)(180.0/M_PI), 0, 0, 1);
-					}
-
-					glTranslatef(-0.5f, -0.5f, 0);
-
-					if (sd->draw_pressure && brush_use_size_pressure(brush)) {
-						glTranslatef(0.5f, 0.5f, 0);
-						glScalef(1.0f/sd->pressure_value, 1.0f/sd->pressure_value, 1);
-						glTranslatef(-0.5f, -0.5f, 0);
-					}
-				}
-
-				glColor4f(
-					U.sculpt_paint_overlay_col[0],
-					U.sculpt_paint_overlay_col[1],
-					U.sculpt_paint_overlay_col[2],
-					brush->texture_overlay_alpha / 100.0f);
-
-				glBegin(GL_QUADS);
-				if (brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
-					if (sd->draw_anchored) {
-						glTexCoord2f(0, 0);
-						glVertex2f(sd->anchored_initial_mouse[0]-sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]-sd->anchored_size - vc.ar->winrct.ymin);
-
-						glTexCoord2f(1, 0);
-						glVertex2f(sd->anchored_initial_mouse[0]+sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]-sd->anchored_size - vc.ar->winrct.ymin);
-
-						glTexCoord2f(1, 1);
-						glVertex2f(sd->anchored_initial_mouse[0]+sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]+sd->anchored_size - vc.ar->winrct.ymin);
-
-						glTexCoord2f(0, 1);
-						glVertex2f(sd->anchored_initial_mouse[0]-sd->anchored_size - vc.ar->winrct.xmin, sd->anchored_initial_mouse[1]+sd->anchored_size - vc.ar->winrct.ymin);
-					}
-					else {
-						const int radius= brush_size(brush);
-
-						glTexCoord2f(0, 0);
-						glVertex2f((float)x-radius, (float)y-radius);
-
-						glTexCoord2f(1, 0);
-						glVertex2f((float)x+radius, (float)y-radius);
-
-						glTexCoord2f(1, 1);
-						glVertex2f((float)x+radius, (float)y+radius);
-
-						glTexCoord2f(0, 1);
-						glVertex2f((float)x-radius, (float)y+radius);
-					}
-				}
-				else {
-					glTexCoord2f(0, 0);
-					glVertex2f(0, 0);
-
-					glTexCoord2f(1, 0);
-					glVertex2f(viewport[2], 0);
-
-					glTexCoord2f(1, 1);
-					glVertex2f(viewport[2], viewport[3]);
-
-					glTexCoord2f(0, 1);
-					glVertex2f(0, viewport[3]);
-				}
-				glEnd();
-
-				glPopMatrix();
-			}
-
-			glPopAttrib();
-		}
-
 		if (hit) {
 			float unprojected_radius;
 
 			// XXX duplicated from brush_strength & paint_stroke_add_step, refactor later
-			//wmEvent* event = CTX_wm_window(C)->eventstate;
 
 			if (sd->draw_pressure && brush_use_alpha_pressure(brush))
 				visual_strength *= sd->pressure_value;
@@ -649,9 +648,6 @@
 		glPopAttrib();
 	}
 	else {
-		Paint *paint = paint_get_active(CTX_data_scene(C));
-		Brush *brush = paint_brush(paint);
-
 		if(!(paint->flags & PAINT_SHOW_BRUSH))
 			return;
 
@@ -660,7 +656,12 @@
 		glEnable(GL_BLEND);
 
 		glTranslatef((float)x, (float)y, 0.0f);
-		glutil_draw_lined_arc(0.0, M_PI*2.0, brush_size(brush), 40); // XXX: for now use the brushes size instead of potentially using the unified size because the feature has been enabled for sculpt
+
+		/* XXX: for now use the brushes size instead of
+		   potentially using the unified size because the
+		   feature has only been enabled for sculpt
+		*/
+		glutil_draw_lined_arc(0.0, M_PI*2.0, brush_size(brush), 40);
 		glTranslatef((float)-x, (float)-y, 0.0f);
 
 		glDisable(GL_BLEND);




More information about the Bf-blender-cvs mailing list