[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29133] branches/soc-2010-jwilkins: * added 'offset' to control the height of clay and other planar brushes separate from strength
Jason Wilkins
Jason.A.Wilkins at gmail.com
Tue Jun 1 19:17:34 CEST 2010
Revision: 29133
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29133
Author: jwilkins
Date: 2010-06-01 19:17:34 +0200 (Tue, 01 Jun 2010)
Log Message:
-----------
* added 'offset' to control the height of clay and other planar brushes separate from strength
* beginnings of experimenting with the brush stroke UI (all commented out so I could commit)
* now applying overlap attenuation to all brushes except grab
* fixed crash bug that happened when clicking on background
Modified Paths:
--------------
branches/soc-2010-jwilkins/release/scripts/ui/space_view3d_toolbar.py
branches/soc-2010-jwilkins/source/blender/blenkernel/intern/brush.c
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-01 17:05:56 UTC (rev 29132)
+++ branches/soc-2010-jwilkins/release/scripts/ui/space_view3d_toolbar.py 2010-06-01 17:17:34 UTC (rev 29133)
@@ -563,6 +563,11 @@
col = layout.column()
+ if brush.sculpt_tool in ('CLAY', 'FLATTEN', 'FILL', 'SCRAPE', 'CONTRAST'):
+ row = col.row(align=True)
+ row.prop(brush, "offset", slider=True)
+ row.prop(brush, "use_offset_pressure", text="")
+
if brush.sculpt_tool in ('DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'):
col.row().prop(brush, "direction", expand=True)
Modified: branches/soc-2010-jwilkins/source/blender/blenkernel/intern/brush.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/blenkernel/intern/brush.c 2010-06-01 17:05:56 UTC (rev 29132)
+++ branches/soc-2010-jwilkins/source/blender/blenkernel/intern/brush.c 2010-06-01 17:17:34 UTC (rev 29133)
@@ -75,6 +75,7 @@
brush->rgb[2]= 1.0f;
brush->alpha= 0.2f;
brush->size= 25;
+ brush->offset= 0.0f;
brush->spacing= 15.0f;
brush->smooth_stroke_radius= 75;
brush->smooth_stroke_factor= 0.9;
@@ -82,6 +83,7 @@
brush->jitter= 0.0f;
brush->clone.alpha= 0.5;
brush->sculpt_tool = SCULPT_TOOL_DRAW;
+ //brush->stroke_tool = STROKE_TOOL_FREEHAND;
brush->flag |= BRUSH_SPACE;
brush_curve_preset(brush, CURVE_PRESET_SMOOTH);
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-01 17:05:56 UTC (rev 29132)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c 2010-06-01 17:17:34 UTC (rev 29133)
@@ -294,7 +294,7 @@
}
}
/* we want the stroke to have the first daub at the start location instead of waiting till we have moved the space distance */
- if(first && paint_space_stroke_enabled(stroke->brush) && !(stroke->brush->flag & BRUSH_ANCHORED))
+ if(first && stroke->stroke_started && paint_space_stroke_enabled(stroke->brush) && !(stroke->brush->flag & BRUSH_ANCHORED))
paint_brush_stroke_add_step(C, op, event, mouse);
return OPERATOR_RUNNING_MODAL;
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-01 17:05:56 UTC (rev 29132)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c 2010-06-01 17:17:34 UTC (rev 29133)
@@ -571,7 +571,6 @@
}
/* percentage of overlap of two circles of radius 1 seperated by d units from their centers */
-/* TODO: cache one minus this value*/
static float circle_overlap_percent(float d)
{
return circle_overlap(d) / M_PI;
@@ -594,7 +593,8 @@
float dir = brush->flag & BRUSH_DIR_IN ? -1 : 1;
float pressure = brush->flag & BRUSH_ALPHA_PRESSURE ? cache->pressure : 1;
float flip = cache->flip ? -1 : 1;
- float overlap = (brush->flag & BRUSH_SPACE && !(brush->flag & BRUSH_ANCHORED)) && (brush->spacing < 100.0f) ? 1 - circle_overlap_percent(brush->spacing/50.0f) : 1; // spacing is integer percentage of radius, divide by 50 to get normalized diameter
+ //float overlap = (brush->flag & BRUSH_SPACE && !(brush->flag & BRUSH_ANCHORED)) && (brush->spacing < 100.0f) ? 1 - circle_overlap_percent(brush->spacing/50.0f) : 1; // spacing is integer percentage of radius, divide by 50 to get normalized diameter
+ float overlap = (brush->flag & BRUSH_SPACE && !(brush->flag & BRUSH_ANCHORED)) && (brush->spacing < 100.0f) ? brush->spacing/100.0f : 1; // spacing is integer percentage of radius, divide by 50 to get normalized diameter
switch(brush->sculpt_tool){
case SCULPT_TOOL_DRAW:
@@ -607,13 +607,13 @@
case SCULPT_TOOL_FILL:
case SCULPT_TOOL_SCRAPE:
case SCULPT_TOOL_CONTRAST:
- return alpha * pressure * flip;
+ return alpha * pressure * flip * overlap;
case SCULPT_TOOL_SMOOTH:
- return alpha * 4 * pressure;
+ return alpha * 4 * pressure * overlap;
case SCULPT_TOOL_PINCH:
- return alpha / 2 * dir * pressure * flip;
+ return alpha / 2 * dir * pressure * flip * overlap;
case SCULPT_TOOL_GRAB:
return 1;
@@ -1453,48 +1453,74 @@
return dot_v3v3(plane_normal, delta) <= 0.0f;
}
+static float get_offset(Sculpt *sd, SculptSession *ss)
+{
+ Brush* brush = paint_brush(&sd->paint);
+
+ float rv = brush->offset;
+
+ if (brush->flag & BRUSH_OFFSET_PRESSURE) {
+ rv *= ss->cache->pressure;
+ }
+
+ return rv;
+}
+
static void do_flatten_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
{
- Brush *brush = paint_brush(&sd->paint);
+ Brush *brush = paint_brush(&sd->paint);
- float bstrength = ss->cache->bstrength;
+ float bstrength = ss->cache->bstrength;
+ const float radius = ss->cache->radius;
- float area_normal[3];
- float center[3];
+ float an[3];
+ float fc[3];
- int n;
+ float offset = get_offset(sd, ss);
- calc_area_normal_and_flatten_center(sd, ss, nodes, totnode, area_normal, center);
+ float displace;
- for(n = 0; n < totnode; n++) {
- PBVHVertexIter vd;
- SculptBrushTest test;
+ int n;
- sculpt_undo_push_node(ss, nodes[n]);
+ float temp[3];
- sculpt_brush_test_init(ss, &test);
+ calc_area_normal_and_flatten_center(sd, ss, nodes, totnode, an, fc);
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- if(sculpt_brush_test(&test, vd.co)) {
- float intr[3];
- float val[3];
+ displace = radius*offset;
- const float fade = bstrength * tex_strength(ss, brush, vd.co, test.dist);
+ mul_v3_v3v3(temp, an, ss->cache->scale);
+ mul_v3_fl(temp, displace);
+ add_v3_v3(fc, temp);
- point_plane_project(intr, vd.co, area_normal, center);
- sub_v3_v3v3(val, intr, vd.co);
- mul_v3_fl(val, fade);
- add_v3_v3(val, vd.co);
+ for(n = 0; n < totnode; n++) {
+ PBVHVertexIter vd;
+ SculptBrushTest test;
- sculpt_clip(sd, ss, vd.co, val);
+ sculpt_undo_push_node(ss, nodes[n]);
- if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
- }
- BLI_pbvh_vertex_iter_end;
+ sculpt_brush_test_init(ss, &test);
- BLI_pbvh_node_mark_update(nodes[n]);
- }
+ BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+ if(sculpt_brush_test(&test, vd.co)) {
+ float intr[3];
+ float val[3];
+
+ const float fade = bstrength * tex_strength(ss, brush, vd.co, test.dist);
+
+ point_plane_project(intr, vd.co, an, fc);
+ sub_v3_v3v3(val, intr, vd.co);
+ mul_v3_fl(val, fade);
+ add_v3_v3(val, vd.co);
+
+ sculpt_clip(sd, ss, vd.co, val);
+
+ if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
+ }
+ }
+ BLI_pbvh_vertex_iter_end;
+
+ BLI_pbvh_node_mark_update(nodes[n]);
+ }
}
static void do_clay_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
@@ -1502,8 +1528,9 @@
Brush *brush = paint_brush(&sd->paint);
float bstrength = ss->cache->bstrength;
- const float radius = ss->cache->radius;
-
+ float radius = ss->cache->radius;
+ float offset = get_offset(sd, ss);
+
float displace;
float an[3]; // area normal
@@ -1517,14 +1544,19 @@
calc_area_normal_and_flatten_center(sd, ss, nodes, totnode, an, fc);
- displace = bstrength*radius;
+ flip = bstrength < 0;
+ if (flip) {
+ bstrength = -bstrength;
+ radius = -radius;
+ }
+
+ displace = radius * (1+offset);
+
mul_v3_v3v3(temp, an, ss->cache->scale);
mul_v3_fl(temp, displace);
add_v3_v3(fc, temp);
- flip = bstrength < 0;
-
for (n = 0; n < totnode; n++) {
PBVHVertexIter vd;
SculptBrushTest test;
@@ -1539,7 +1571,7 @@
float intr[3];
float val[3];
- const float fade = tex_strength(ss, brush, vd.co, sqrt(test.dist));
+ const float fade = bstrength*tex_strength(ss, brush, vd.co, sqrt(test.dist));
point_plane_project(intr, vd.co, an, fc);
sub_v3_v3v3(val, intr, vd.co);
@@ -1560,138 +1592,174 @@
static void do_contrast_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
{
- Brush *brush = paint_brush(&sd->paint);
+ Brush *brush = paint_brush(&sd->paint);
- float bstrength = ss->cache->bstrength;
+ float bstrength = ss->cache->bstrength;
+ const float radius = ss->cache->radius;
- float area_normal[3];
- float center[3];
+ float an[3];
+ float fc[3];
+ float offset = get_offset(sd, ss);
- int n;
+ float displace;
- calc_area_normal_and_flatten_center(sd, ss, nodes, totnode, area_normal, center);
+ int n;
- for(n = 0; n < totnode; n++) {
- PBVHVertexIter vd;
- SculptBrushTest test;
+ float temp[3];
- sculpt_undo_push_node(ss, nodes[n]);
+ calc_area_normal_and_flatten_center(sd, ss, nodes, totnode, an, fc);
- sculpt_brush_test_init(ss, &test);
+ displace = radius*offset;
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- if(sculpt_brush_test(&test, vd.co)) {
- float intr[3];
- float val[3];
+ mul_v3_v3v3(temp, an, ss->cache->scale);
+ mul_v3_fl(temp, displace);
+ add_v3_v3(fc, temp);
- const float fade = bstrength * tex_strength(ss, brush, vd.co, test.dist);
+ for(n = 0; n < totnode; n++) {
+ PBVHVertexIter vd;
+ SculptBrushTest test;
- point_plane_project(intr, vd.co, area_normal, center);
- sub_v3_v3v3(val, intr, vd.co);
- mul_v3_fl(val, -fade);
- add_v3_v3(val, vd.co);
+ sculpt_undo_push_node(ss, nodes[n]);
- sculpt_clip(sd, ss, vd.co, val);
+ sculpt_brush_test_init(ss, &test);
- if(vd.mvert) vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
- }
- }
- BLI_pbvh_vertex_iter_end;
+ BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+ if(sculpt_brush_test(&test, vd.co)) {
+ float intr[3];
+ float val[3];
- BLI_pbvh_node_mark_update(nodes[n]);
- }
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list