[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29555] branches/soc-2010-jwilkins/source/ blender/editors/sculpt_paint/paint_stroke.c: * Bug Fix: sculpt cursor not compatible with other paint modes, so it uses old code for non-sculpt modes.

Jason Wilkins Jason.A.Wilkins at gmail.com
Sat Jun 19 07:22:12 CEST 2010


Revision: 29555
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29555
Author:   jwilkins
Date:     2010-06-19 07:22:03 +0200 (Sat, 19 Jun 2010)

Log Message:
-----------
* Bug Fix: sculpt cursor not compatible with other paint modes, so it uses old code for non-sculpt modes.

Modified Paths:
--------------
    branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c

Modified: branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c	2010-06-19 02:54:17 UTC (rev 29554)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c	2010-06-19 05:22:03 UTC (rev 29555)
@@ -385,7 +385,7 @@
 	window[0] = x + stroke->vc.ar->winrct.xmin;
 	window[1] = y + stroke->vc.ar->winrct.ymin;
 
-	if (stroke->vc.obact->sculpt->pbvh && sculpt_stroke_get_location(C, stroke, location, window)) {
+	if (stroke->vc.obact->sculpt && stroke->vc.obact->sculpt->pbvh && sculpt_stroke_get_location(C, stroke, location, window)) {
 		*pixel_radius = project_brush_radius(stroke->vc.rv3d, stroke->brush->unprojected_radius, location, &stroke->mats);
 
 		if (*pixel_radius == 0) {
@@ -436,248 +436,268 @@
 // two modules should be more clearly defined.
 static void paint_draw_cursor(bContext *C, int x, int y, void *customdata)
 {
-	Paint *paint = paint_get_active(CTX_data_scene(C));
-	Brush *brush = paint_brush(paint);
+	ViewContext vc;
 
-	int pixel_radius, viewport[4];
-	float location[3], modelview[16], projection[16];
+	view3d_set_viewcontext(C, &vc);
 
-	int hit;
+	if (vc.obact->sculpt) {
+		Paint *paint = paint_get_active(CTX_data_scene(C));
+		Brush *brush = paint_brush(paint);
 
-	/* keep track of mouse movement angle so rack can start at a sensible angle */
+		int pixel_radius, viewport[4];
+		float location[3], modelview[16], projection[16];
 
-	int dx = brush->last_x - x;
-	int dy = brush->last_y - y;
+		int hit;
 
-	if (dx*dx + dy*dy > 100) {
-		/* only update if distance traveled is more than 10 pixels */
-		brush->last_angle = atan2(dx, dy);
-		brush->last_x = x;
-		brush->last_y = y;
-	} /* else, do not update last_x and last_y so that the distance can accumulate */
+		/* keep track of mouse movement angle so rack can start at a sensible angle */
+		int dx = brush->last_x - x;
+		int dy = brush->last_y - y;
 
-	if(!(brush->flag & BRUSH_LOCK_SIZE) && !(paint->flags & PAINT_SHOW_BRUSH)) 
-		return;
+		if (dx*dx + dy*dy > 100) {
+			/* only update if distance traveled is more than 10 pixels */
+			brush->last_angle = atan2(dx, dy);
+			brush->last_x = x;
+			brush->last_y = y;
+		} /* else, do not update last_x and last_y so that the distance can accumulate */
 
-	hit = sculpt_get_brush_geometry(C, x, y, &pixel_radius, location, modelview, projection, viewport);
+		if(!(brush->flag & BRUSH_LOCK_SIZE) && !(paint->flags & PAINT_SHOW_BRUSH)) 
+			return;
 
-	if (brush->flag & BRUSH_LOCK_SIZE) sculpt_set_brush_radius(C, brush, pixel_radius);
+		hit = sculpt_get_brush_geometry(C, x, y, &pixel_radius, location, modelview, projection, viewport);
 
-	if (hit) {
-		ViewContext vc;
-		float unprojected_radius;
-		int flip;
-		int sign;
-		float visual_strength = brush->alpha * brush->alpha;
+		if (brush->flag & BRUSH_LOCK_SIZE) sculpt_set_brush_radius(C, brush, pixel_radius);
 
-		const float min_alpha = 0.20f;
-		const float max_alpha = 0.80f;
-		float* col;
-		float  alpha;
+		if (hit) {
+			float unprojected_radius;
+			int flip;
+			int sign;
+			float visual_strength = brush->alpha * brush->alpha;
 
-		// XXX duplicated from brush_strength & paint_stroke_add_step, refactor later
-		wmEvent* event = CTX_wm_window(C)->eventstate;
+			const float min_alpha = 0.20f;
+			const float max_alpha = 0.80f;
+			float* col;
+			float  alpha;
 
-		flip = event->shift ? -1 : 1;
+			// XXX duplicated from brush_strength & paint_stroke_add_step, refactor later
+			wmEvent* event = CTX_wm_window(C)->eventstate;
 
-		if ( brush->draw_pressure && brush->flag & BRUSH_ALPHA_PRESSURE)
-			visual_strength *= brush->pressure_value;
+			flip = event->shift ? -1 : 1;
 
-		// remove effect of strength multiplier
-		visual_strength /= brush->strength_multiplier;
+			if ( brush->draw_pressure && brush->flag & BRUSH_ALPHA_PRESSURE)
+				visual_strength *= brush->pressure_value;
 
-		// don't show effect of strength past the soft limit
-		if (visual_strength > 1) visual_strength = 1;
+			// remove effect of strength multiplier
+			visual_strength /= brush->strength_multiplier;
 
-		view3d_set_viewcontext(C, &vc);
+			// don't show effect of strength past the soft limit
+			if (visual_strength > 1) visual_strength = 1;
 
-		if (brush->draw_anchored) {
-			unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, brush->anchored_size);
-		}
-		else {
-			if (brush->flag & BRUSH_ANCHORED)
-				unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, 8);
-			else
-				unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, brush->size);
-		}
+			if (brush->draw_anchored) {
+				unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, brush->anchored_size);
+			}
+			else {
+				if (brush->flag & BRUSH_ANCHORED)
+					unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, 8);
+				else
+					unprojected_radius = unproject_brush_radius(CTX_data_active_object(C), &vc, location, brush->size);
+			}
 
-		if (brush->draw_pressure && brush->flag & BRUSH_SIZE_PRESSURE)
-			unprojected_radius *= brush->pressure_value;
+			if (brush->draw_pressure && brush->flag & BRUSH_SIZE_PRESSURE)
+				unprojected_radius *= brush->pressure_value;
 
-		if (!(brush->flag & BRUSH_LOCK_SIZE)) 
-			sculpt_set_brush_unprojected_radius(C, brush, unprojected_radius);
+			if (!(brush->flag & BRUSH_LOCK_SIZE)) 
+				sculpt_set_brush_unprojected_radius(C, brush, unprojected_radius);
 
-		if(!(paint->flags & PAINT_SHOW_BRUSH))
-			return;
+			if(!(paint->flags & PAINT_SHOW_BRUSH))
+				return;
 
-		sign = flip * ((brush->flag & BRUSH_DIR_IN)? -1 : 1);
+			sign = flip * ((brush->flag & BRUSH_DIR_IN)? -1 : 1);
 
-		if (sign < 0 && ELEM4(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_PINCH))
-			col = brush->sub_col;
-		else
-			col = brush->add_col;
+			if (sign < 0 && ELEM4(brush->sculpt_tool, SCULPT_TOOL_DRAW, SCULPT_TOOL_INFLATE, SCULPT_TOOL_CLAY, SCULPT_TOOL_PINCH))
+				col = brush->sub_col;
+			else
+				col = brush->add_col;
 
-		alpha = (paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) ? min_alpha + (visual_strength*(max_alpha-min_alpha)) : 0.50f;
+			alpha = (paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) ? min_alpha + (visual_strength*(max_alpha-min_alpha)) : 0.50f;
 
-		glColor4f(col[0], col[1], col[2], alpha);
+			glColor4f(col[0], col[1], col[2], alpha);
 
-		glEnable(GL_BLEND);
+			glEnable(GL_BLEND);
 
-		if (paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) {
-			const float max_thickness= 0.16;
-			const float min_thickness= 0.06;
-			const float thickness=     1.0 - min_thickness - visual_strength*max_thickness;
-			const float inner_radius=  brush->draw_anchored ? unprojected_radius                  : unprojected_radius*thickness;
-			const float outer_radius=  brush->draw_anchored ? 1.0f/thickness * unprojected_radius : unprojected_radius;
+			if (paint->flags & PAINT_SHOW_BRUSH_ON_SURFACE) {
+				const float max_thickness= 0.16;
+				const float min_thickness= 0.06;
+				const float thickness=     1.0 - min_thickness - visual_strength*max_thickness;
+				const float inner_radius=  brush->draw_anchored ? unprojected_radius                  : unprojected_radius*thickness;
+				const float outer_radius=  brush->draw_anchored ? 1.0f/thickness * unprojected_radius : unprojected_radius;
 
-			GLUquadric* sphere;
+				GLUquadric* sphere;
 
-			glMatrixMode(GL_MODELVIEW);
-			glPushMatrix();
-			glLoadMatrixf(modelview);
+				glMatrixMode(GL_MODELVIEW);
+				glPushMatrix();
+				glLoadMatrixf(modelview);
 
-			if (brush->draw_anchored)
-				glTranslatef(brush->anchored_location[0], brush->anchored_location[1], brush->anchored_location[2]);
-			else
-				glTranslatef(location[0], location[1], location[2]);
+				if (brush->draw_anchored)
+					glTranslatef(brush->anchored_location[0], brush->anchored_location[1], brush->anchored_location[2]);
+				else
+					glTranslatef(location[0], location[1], location[2]);
 
-			glMatrixMode(GL_PROJECTION);
-			glPushMatrix();
-			glLoadMatrixf(projection);
+				glMatrixMode(GL_PROJECTION);
+				glPushMatrix();
+				glLoadMatrixf(projection);
 
-			glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
+				glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
 
-			glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
-			glDepthMask(GL_FALSE);
+				glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+				glDepthMask(GL_FALSE);
 
-			glDisable(GL_CULL_FACE);
+				glDisable(GL_CULL_FACE);
 
-			glEnable(GL_DEPTH_TEST);
+				glEnable(GL_DEPTH_TEST);
 
-			glClearStencil(0);
-			glClear(GL_STENCIL_BUFFER_BIT);
-			glEnable(GL_STENCIL_TEST);
+				glClearStencil(0);
+				glClear(GL_STENCIL_BUFFER_BIT);
+				glEnable(GL_STENCIL_TEST);
 
-			glStencilFunc(GL_ALWAYS, 3, 0xFF);
-			glStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP);
+				glStencilFunc(GL_ALWAYS, 3, 0xFF);
+				glStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP);
 
-			sphere = gluNewQuadric();
+				sphere = gluNewQuadric();
 
-			gluSphere(sphere, outer_radius, 40, 40);
+				gluSphere(sphere, outer_radius, 40, 40);
 
-			glStencilFunc(GL_ALWAYS, 1, 0xFF);
-			glStencilOp(GL_KEEP, GL_DECR, GL_KEEP);
+				glStencilFunc(GL_ALWAYS, 1, 0xFF);
+				glStencilOp(GL_KEEP, GL_DECR, GL_KEEP);
 
-			if (brush->size >= 8)
-				gluSphere(sphere, inner_radius, 40, 40);
+				if (brush->size >= 8)
+					gluSphere(sphere, inner_radius, 40, 40);
 
-			glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+				glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 
-			glStencilFunc(GL_EQUAL, 1, 0xFF);
-			glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+				glStencilFunc(GL_EQUAL, 1, 0xFF);
+				glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
 
-			gluSphere(sphere, outer_radius, 40, 40);
+				gluSphere(sphere, outer_radius, 40, 40);
 
-			glStencilFunc(GL_EQUAL, 3, 0xFF);
-			glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+				glStencilFunc(GL_EQUAL, 3, 0xFF);
+				glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
 
-			gluSphere(sphere, outer_radius, 40, 40);
+				gluSphere(sphere, outer_radius, 40, 40);
 
-			gluDeleteQuadric(sphere);
+				gluDeleteQuadric(sphere);
 
-			glDepthMask(GL_TRUE);
+				glDepthMask(GL_TRUE);
 
-			glDisable(GL_DEPTH_TEST);
+				glDisable(GL_DEPTH_TEST);
 
-			glEnable(GL_CULL_FACE);
+				glEnable(GL_CULL_FACE);
 
-			glDisable(GL_STENCIL_TEST);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list