[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29402] branches/soc-2010-jwilkins: == Grab, Nudge, and Thumb Brushes and Pen Fixes ==

Jason Wilkins Jason.A.Wilkins at gmail.com
Fri Jun 11 12:27:02 CEST 2010


Revision: 29402
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29402
Author:   jwilkins
Date:     2010-06-11 12:27:02 +0200 (Fri, 11 Jun 2010)

Log Message:
-----------
== Grab, Nudge, and Thumb Brushes and Pen Fixes ==
* Removed 'yank' brush, its behavior is completely replicable with Grab
* Grab Brush Fix
** Grab brush now behaves much like the one in Sculptris with the "Limit" option turned on.
** there is now a slider that allows the surface normal to be added to the direction of the grab, good for pulling things more out then sideways
** the vector for the slider is determined by the setting of 'original normal'
** the direction when grab is negated is now more intuitive (only really has an effect if the surface normal is mixed in)
** radius of brush now temporarily increases 2x when using grab
** removed strength slider for grab
* Nudge Brush
** can be used to move geometry in the plane of the normal as determined by calc_area_normal (means that it obeys 'original normal'
** with a smooth curve it drags geometry around and distorts it
** wit a harder curve it moves geometry without distoring it much
* Thumb Brush
** like nudge, but anchored
** Pen
* Properly linked up pen pressure to the appearance of the cursor
* The spaced stroke tool now takes into account the change of size caused by pen pressure, resulting in much smoother lines at lower pressure
- This highlights the need for space to interpolate more than just spacing, it also needs to interpolate size and strength, so this will be implemented in the future.
- Also, pressure needs to be smoothed out, but this should probably be done at a lower level
* Misc.
** Increased the hard limit of strength from 1 to 10.  Keep in mind the the strength is squared so 10 is 100 times stronger.
** If strength is greater than one due to multiplier or exceeding the soft limit, the cursor does not get any thicker or darker than it is at one

Modified Paths:
--------------
    branches/soc-2010-jwilkins/release/scripts/ui/space_view3d_toolbar.py
    branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c
    branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
    branches/soc-2010-jwilkins/source/blender/makesdna/DNA_brush_types.h
    branches/soc-2010-jwilkins/source/blender/makesrna/intern/rna_brush.c

Modified: branches/soc-2010-jwilkins/release/scripts/ui/space_view3d_toolbar.py
===================================================================
--- branches/soc-2010-jwilkins/release/scripts/ui/space_view3d_toolbar.py	2010-06-11 09:09:57 UTC (rev 29401)
+++ branches/soc-2010-jwilkins/release/scripts/ui/space_view3d_toolbar.py	2010-06-11 10:27:02 UTC (rev 29402)
@@ -555,19 +555,23 @@
             else:
                 row.prop(brush, "size", slider=True, text="Pixels")
 
-            if brush.sculpt_tool != 'GRAB' and not brush.lock_brush_size:
+            if brush.sculpt_tool not in ('GRAB', 'THUMB'):
                 row.prop(brush, "use_size_pressure", toggle=True, text="")
 
-            row = col.row(align=True)
-            row.prop(brush, "strength", slider=True)
-            row.prop(brush, "use_strength_pressure", text="")
-            col.prop(brush, "strength_multiplier", slider=True)
+                row = col.row(align=True)
+                row.prop(brush, "strength", slider=True)
+                row.prop(brush, "use_strength_pressure", text="")
+                col.prop(brush, "strength_multiplier", slider=True)
 
-            # XXX - TODO
-            #row = col.row(align=True)
-            #row.prop(brush, "jitter", slider=True)
-            #row.prop(brush, "use_jitter_pressure", toggle=True, text="")
+                # XXX - TODO
+                #row = col.row(align=True)
+                #row.prop(brush, "jitter", slider=True)
+                #row.prop(brush, "use_jitter_pressure", toggle=True, text="")
 
+            if brush.sculpt_tool == 'GRAB':
+                row = col.row(align=True)
+                row.prop(brush, "normal_weight", slider=True)
+
             if brush.sculpt_tool in ('CLAY', 'FLATTEN', 'FILL', 'SCRAPE'):
                 row = col.row(align=True)
                 row.prop(brush, "plane_offset", slider=True)

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-11 09:09:57 UTC (rev 29401)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c	2010-06-11 10:27:02 UTC (rev 29402)
@@ -469,32 +469,27 @@
 		float unprojected_radius;
 		int flip;
 		int sign;
-		float visual_strength;
+		float visual_strength = brush->alpha * brush->alpha;
 
-		const float min_alpha = 0.30f;
-		const float max_alpha = 0.70f;
+		const float min_alpha = 0.20f;
+		const float max_alpha = 0.80f;
 		float* col;
 		float  alpha;
 
 		// XXX duplicated from brush_strength & paint_stroke_add_step, refactor later
-		{
-			float strength = brush->alpha * brush->alpha;
-			float pressure = 1.0f;
-			wmEvent* event = CTX_wm_window(C)->eventstate;
+		wmEvent* event = CTX_wm_window(C)->eventstate;
 
-			flip = event->shift ? -1 : 1;
+		flip = event->shift ? -1 : 1;
 
-			if(event->custom == EVT_DATA_TABLET) {
-				wmTabletData *wmtab= event->customdata;
-				if(wmtab->Active != EVT_TABLET_NONE)
-					pressure = brush->flag & BRUSH_ALPHA_PRESSURE ? wmtab->Pressure : 1;
-				if(wmtab->Active == EVT_TABLET_ERASER)
-					flip = 1;
-			}
+		if ( brush->draw_pressure && brush->flag & BRUSH_ALPHA_PRESSURE)
+			visual_strength *= brush->pressure_value;
 
-			visual_strength = strength * pressure;
-		}
+		// remove effect of strength multiplier
+		visual_strength /= brush->strength_multiplier;
 
+		// don't show effect of strength past the soft limit
+		if (visual_strength > 1) visual_strength = 1;
+
 		view3d_set_viewcontext(C, &vc);
 
 		if (brush->draw_anchored) {
@@ -507,6 +502,9 @@
 				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->flag & BRUSH_LOCK_SIZE)) 
 			sculpt_set_brush_unprojected_radius(C, brush, unprojected_radius);
 
@@ -750,36 +748,44 @@
    towards the final mouse location. */
 static int paint_space_stroke(bContext *C, wmOperator *op, wmEvent *event, const float final_mouse[2])
 {
-    PaintStroke *stroke = op->customdata;
-    int cnt = 0;
+	PaintStroke *stroke = op->customdata;
+	int cnt = 0;
 
-    if(paint_space_stroke_enabled(stroke->brush)) {
-        float mouse[2];
-        float vec[2];
-        float length, scale;
+	if(paint_space_stroke_enabled(stroke->brush)) {
+		float mouse[2];
+		float vec[2];
+		float length, scale;
 
-        copy_v2_v2(mouse, stroke->last_mouse_position);
-        sub_v2_v2v2(vec, final_mouse, mouse);
+		copy_v2_v2(mouse, stroke->last_mouse_position);
+		sub_v2_v2v2(vec, final_mouse, mouse);
 
-        length = len_v2(vec);
+		length = len_v2(vec);
 
-        if(length > FLT_EPSILON) {
-            int steps;
-            int i;
+		if(length > FLT_EPSILON) {
+			int steps;
+			int i;
+			float pressure = 1;
 
-            scale = (stroke->brush->size*stroke->brush->spacing/50.0f) / length;
-            mul_v2_fl(vec, scale);
+			// XXX duplicate code
+			if(event->custom == EVT_DATA_TABLET) {
+				wmTabletData *wmtab= event->customdata;
+				if(wmtab->Active != EVT_TABLET_NONE)
+					pressure = stroke->brush->flag & BRUSH_SIZE_PRESSURE ? wmtab->Pressure : 1;
+			}
 
-            steps = (int)(1.0f / scale);
+			scale = (stroke->brush->size*pressure*stroke->brush->spacing/50.0f) / length;
+			mul_v2_fl(vec, scale);
 
-            for(i = 0; i < steps; ++i, ++cnt) {
-                add_v2_v2(mouse, vec);
-                paint_brush_stroke_add_step(C, op, event, mouse);
-            }
-        }
-    }
+			steps = (int)(1.0f / scale);
 
-    return cnt;
+			for(i = 0; i < steps; ++i, ++cnt) {
+				add_v2_v2(mouse, vec);
+				paint_brush_stroke_add_step(C, op, event, mouse);
+			}
+		}
+	}
+
+	return cnt;
 }
 
 /**** Public API ****/

Modified: branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c	2010-06-11 09:09:57 UTC (rev 29401)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c	2010-06-11 10:27:02 UTC (rev 29402)
@@ -754,18 +754,23 @@
 		case SCULPT_TOOL_FILL:
 		case SCULPT_TOOL_SCRAPE:
 		case SCULPT_TOOL_FLATTEN:
-		case SCULPT_TOOL_GRAB:
 			return alpha * dir * flip * pressure * overlap;
 
 		case SCULPT_TOOL_SMOOTH:
-			return alpha * 4 * pressure * overlap;
+			return alpha * 4.0f * pressure * overlap;
 
 		case SCULPT_TOOL_PINCH:
-			return alpha / 2 * dir * pressure * flip * overlap;
+			return alpha / 2.0f * dir * pressure * flip * overlap;
 
-		case SCULPT_TOOL_YANK:
-			return 1;
+		case SCULPT_TOOL_GRAB:
+			return dir*flip > 0 ? 0.5f : -0.5f;
 
+		case SCULPT_TOOL_NUDGE:
+			return alpha * pressure * overlap;
+
+		case SCULPT_TOOL_THUMB:
+			return 0.5f;
+
 		default:
 			return 0;
 	}
@@ -1384,22 +1389,29 @@
 	int n;
 	float len;
 
-	calc_area_normal(sd, ss, an, nodes, totnode);
+	if (brush->normal_weight > 0)
+		calc_area_normal(sd, ss, an, nodes, totnode);
 
 	copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
 
 	len = len_v3(grab_delta);
 
-	mul_v3_fl(an, len/2.0f);
-	mul_v3_fl(grab_delta, 0.5f);
-	add_v3_v3(grab_delta, an);
+	if (bstrength < 0)
+		negate_v3(grab_delta);
 
+	if (brush->normal_weight > 0) {
+		mul_v3_fl(an, len*brush->normal_weight);
+		mul_v3_fl(grab_delta, 1.0f - brush->normal_weight);
+		add_v3_v3(grab_delta, an);
+	}
+
 	for(n=0; n<totnode; n++) {
 		PBVHVertexIter vd;
 		SculptBrushTest test;
 		float (*origco)[3];
 	
 		origco= sculpt_undo_push_node(ss, nodes[n])->co;
+
 		sculpt_brush_test_init(ss, &test);
 
 		BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
@@ -1425,34 +1437,40 @@
 	}
 }
 
-static void do_yank_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_nudge_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
 {
 	Brush *brush = paint_brush(&sd->paint);
-	float bstrength= ss->cache->bstrength;
+	float bstrength = ss->cache->bstrength;
 	float grab_delta[3];
 	int n;
-	
+	float an[3];
+
 	copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
 
-	//#pragma omp parallel for private(n) schedule(static)
-	for(n=0; n<totnode; n++) {
+	calc_area_normal(sd, ss, an, nodes, totnode);
+
+	for(n = 0; n < totnode; n++) {
 		PBVHVertexIter vd;
 		SculptBrushTest test;
-		float (*origco)[3];
-		
-		origco= sculpt_undo_push_node(ss, nodes[n])->co;
+
+		sculpt_undo_push_node(ss, nodes[n]);
 		sculpt_brush_test_init(ss, &test);
 
 		BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
-			if(sculpt_brush_test(&test, origco[vd.i])) {
-				float fade = tex_strength(ss, brush, origco[vd.i], test.dist)*bstrength;
+			if(sculpt_brush_test(&test, vd.co)) {
+				float fade = bstrength*tex_strength(ss, brush, vd.co, test.dist);
 				float val[3];
+				float tmp[3];
 
+				cross_v3_v3v3(tmp, an, grab_delta);
+				cross_v3_v3v3(val, an, tmp);
+
 				mul_v3_v3fl(val, grab_delta, fade);
 				symmetry_feather(sd, ss, vd.co, val);
 				add_v3_v3(val, vd.co);
 
-				sculpt_clip(sd, ss, vd.co, val);			
+				sculpt_clip(sd, ss, vd.co, val);
+
 				if(vd.mvert) {
 					vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
 					if(brush->flag & BRUSH_SUBDIV) vd.mvert->flag = 1; 
@@ -1465,6 +1483,53 @@
 	}
 }
 
+static void do_thumb_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+{
+	Brush *brush = paint_brush(&sd->paint);
+	float bstrength = ss->cache->bstrength;
+	float grab_delta[3];
+	int n;
+	float an[3];
+
+	copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
+
+	calc_area_normal(sd, ss, an, nodes, totnode);
+
+	for(n = 0; n < totnode; n++) {
+		PBVHVertexIter vd;
+		SculptBrushTest test;
+		float (*origco)[3];
+
+		origco=sculpt_undo_push_node(ss, nodes[n])->co;
+		sculpt_brush_test_init(ss, &test);
+
+		BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+			if(sculpt_brush_test(&test, origco[vd.i])) {
+				float fade = bstrength*tex_strength(ss, brush, origco[vd.i], test.dist);
+				float val[3];
+				float tmp[3];
+
+				cross_v3_v3v3(tmp, an, grab_delta);
+				cross_v3_v3v3(val, an, tmp);
+
+				mul_v3_v3fl(val, grab_delta, fade);
+				symmetry_feather(sd, ss, origco[vd.i], val);
+				add_v3_v3(val, origco[vd.i]);
+
+				sculpt_clip(sd, ss, vd.co, val);
+
+				if(vd.mvert) {
+					vd.mvert->flag |= ME_VERT_PBVH_UPDATE;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list