[Bf-blender-cvs] [b970edb97e9] sculpt-dev: Sculpt: Add plane mode for draw sharp brush
Joseph Eagar
noreply at git.blender.org
Thu Oct 7 03:27:07 CEST 2021
Commit: b970edb97e902adf8a7973149ae36c3abec26998
Author: Joseph Eagar
Date: Wed Oct 6 18:26:19 2021 -0700
Branches: sculpt-dev
https://developer.blender.org/rBb970edb97e902adf8a7973149ae36c3abec26998
Sculpt: Add plane mode for draw sharp brush
===================================================================
M release/scripts/startup/bl_ui/properties_paint_common.py
M source/blender/blenkernel/BKE_blender_version.h
M source/blender/blenkernel/intern/brush_channel_define.h
M source/blender/blenkernel/intern/brush_engine_presets.c
M source/blender/blenloader/intern/versioning_300.c
M source/blender/editors/sculpt_paint/sculpt.c
M source/blender/editors/sculpt_paint/sculpt_intern.h
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index f7809f21af6..eb8db807fd2 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -1907,10 +1907,16 @@ def brush_settings_advanced(layout, context, brush, popover=False):
# Draw shared settings.
if use_accumulate:
- layout.prop(brush, "use_accumulate")
+ UnifiedPaintPanel.channel_unified(layout.column(),
+ context,
+ brush,
+ "accumulate")
if use_frontface:
- layout.prop(brush, "use_frontface", text="Front Faces Only")
+ UnifiedPaintPanel.channel_unified(layout.column(),
+ context,
+ brush,
+ "use_frontface", text="Front Faces Only")
def draw_color_settings(context, layout, brush, color_type=False):
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index d8112de760d..5ee86f9446e 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -39,7 +39,7 @@ extern "C" {
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
-#define BLENDER_FILE_SUBVERSION 34
+#define BLENDER_FILE_SUBVERSION 35
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and show a warning if the file
diff --git a/source/blender/blenkernel/intern/brush_channel_define.h b/source/blender/blenkernel/intern/brush_channel_define.h
index e7149aefd3b..a9b1bf2c7c3 100644
--- a/source/blender/blenkernel/intern/brush_channel_define.h
+++ b/source/blender/blenkernel/intern/brush_channel_define.h
@@ -578,6 +578,12 @@ MAKE_ENUM(smear_deform_type, "Deformation", "Deformation type that is used in th
MAKE_FLOAT(smear_deform_blend, "Smear Blend", "Blend with existing paint", 1.0f, 0.0f, 1.0f)
+MAKE_ENUM_EX(sharp_mode, "Sharp Mode", "", 0, 0, {
+ {0, "SIMPLE", "NONE", "Simple", ""},
+ {1, "PLANE", "NONE", "Plane", ""},
+ {-1}
+})
+
//MAKE_FLOAT3_EX
/* clang-format on */
#if defined(BRUSH_CHANNEL_DEFINE_TYPES) || defined(BRUSH_CHANNEL_DEFINE_EXTERNAL)
diff --git a/source/blender/blenkernel/intern/brush_engine_presets.c b/source/blender/blenkernel/intern/brush_engine_presets.c
index cb74a32aa01..b94b4382fdc 100644
--- a/source/blender/blenkernel/intern/brush_engine_presets.c
+++ b/source/blender/blenkernel/intern/brush_engine_presets.c
@@ -267,6 +267,7 @@ static bool check_builtin_init()
// SETCAT(radius, "Basic");
// SETCAT(direction, "Basic");
SETCAT(accumulate, "Basic");
+ SETCAT(use_frontface, "Basic");
SETCAT(smear_deform_type, "Smear");
SETCAT(smear_deform_blend, "Smear");
@@ -973,7 +974,9 @@ void BKE_brush_builtin_patch(Brush *brush, int tool)
ADDCH(strength);
ADDCH(radius_unit);
ADDCH(unprojected_radius);
+ ADDCH(use_frontface);
+ ADDCH(sharp_mode);
ADDCH(show_origco);
ADDCH(use_surface_falloff);
@@ -1245,6 +1248,7 @@ void BKE_brush_channelset_ui_init(Brush *brush, int tool)
if (!ELEM(tool, SCULPT_TOOL_PAINT, SCULPT_TOOL_SMEAR)) {
SHOWWRK(autosmooth);
SHOWWRK(topology_rake);
+ SHOWWRK(topology_rake_mode);
SHOWCTX(autosmooth);
}
@@ -1264,6 +1268,12 @@ void BKE_brush_channelset_ui_init(Brush *brush, int tool)
SHOWWRK(dyntopo_disabled);
switch (tool) {
+ case SCULPT_TOOL_DRAW_SHARP:
+ SHOWWRK(sharp_mode);
+ SHOWCTX(sharp_mode);
+ // SHOWWRK(plane_offset);
+ // SHOWCTX(plane_offset);
+ break;
case SCULPT_TOOL_INFLATE:
case SCULPT_TOOL_BLOB:
SHOWCTX(crease_pinch_factor);
diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c
index 5020eb180d9..3906a2210d4 100644
--- a/source/blender/blenloader/intern/versioning_300.c
+++ b/source/blender/blenloader/intern/versioning_300.c
@@ -1796,6 +1796,13 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
}
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 300, 35)) {
+ LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
+ BKE_brush_channelset_ui_init(brush, brush->sculpt_tool);
+ }
+ }
+
if (!MAIN_VERSION_ATLEAST(bmain, 300, 27)) {
LISTBASE_FOREACH (Brush *, brush, &bmain->brushes) {
if (brush->channels) {
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 367b38c4fd6..621a112cb3d 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -5251,9 +5251,9 @@ static void do_draw_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
BLI_task_parallel_range(0, totnode, &data, do_draw_brush_task_cb_ex, &settings);
}
-static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata,
- const int n,
- const TaskParallelTLS *__restrict tls)
+static void do_draw_sharp_brush_task_cb_ex_plane(void *__restrict userdata,
+ const int n,
+ const TaskParallelTLS *__restrict tls)
{
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
@@ -5273,6 +5273,13 @@ static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata,
ss, &test, data->brush->falloff_shape);
const int thread_id = BLI_task_parallel_thread_id(tls);
+ float planeco[3], noffset[3];
+ copy_v3_v3(planeco, ss->cache->location);
+ add_v3_v3(planeco, offset);
+
+ copy_v3_v3(noffset, offset);
+ normalize_v3(noffset);
+
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
// SCULPT_orig_vert_data_update(&orig_data, vd.vertex);
SCULPT_vertex_check_origdata(ss, vd.vertex);
@@ -5303,17 +5310,95 @@ static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_node_mark_update(data->nodes[n]);
}
+static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata,
+ const int n,
+ const TaskParallelTLS *__restrict tls)
+{
+ SculptThreadedTaskData *data = userdata;
+ SculptSession *ss = data->ob->sculpt;
+ const Brush *brush = data->brush;
+ const float *offset = data->offset;
+
+ PBVHVertexIter vd;
+ SculptOrigVertData orig_data;
+ float(*proxy)[3];
+
+ proxy = BKE_pbvh_node_add_proxy(ss->pbvh, data->nodes[n])->co;
+
+ SculptBrushTest test;
+ SculptBrushTestFn sculpt_brush_test_sq_fn = SCULPT_brush_test_init_with_falloff_shape(
+ ss, &test, data->brush->falloff_shape);
+ const int thread_id = BLI_task_parallel_thread_id(tls);
+
+ float planeco[3], noffset[3];
+ copy_v3_v3(planeco, ss->cache->location);
+ add_v3_v3(planeco, offset);
+
+ copy_v3_v3(noffset, offset);
+ normalize_v3(noffset);
+
+ BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
+ // SCULPT_orig_vert_data_update(&orig_data, vd.vertex);
+ SCULPT_vertex_check_origdata(ss, vd.vertex);
+ MSculptVert *mv = SCULPT_vertex_get_mdyntopo(ss, vd.vertex);
+
+ if (!sculpt_brush_test_sq_fn(&test, mv->origco)) {
+ continue;
+ }
+ /* Offset vertex. */
+ const float fade = SCULPT_brush_strength_factor(ss,
+ brush,
+ mv->origco,
+ sqrtf(test.dist),
+ NULL,
+ mv->origno,
+ vd.mask ? *vd.mask : 0.0f,
+ vd.vertex,
+ thread_id);
+
+ float vec[3];
+ // copy_v3_v3(noffset, mv->origno);
+
+ copy_v3_v3(planeco, ss->cache->location);
+ madd_v3_v3fl(planeco, offset, fade);
+
+ sub_v3_v3v3(vec, mv->origco, planeco);
+ madd_v3_v3fl(vec, noffset, -dot_v3v3(noffset, vec));
+
+ add_v3_v3(vec, planeco);
+ sub_v3_v3(vec, vd.co);
+
+ mul_v3_v3fl(proxy[vd.i], vec, fade * fade);
+
+ if (vd.mvert) {
+ vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
+ }
+ }
+ BKE_pbvh_vertex_iter_end;
+
+ BKE_pbvh_node_mark_update(data->nodes[n]);
+}
+
static void do_draw_sharp_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
SculptSession *ss = ob->sculpt;
- Brush *brush = BKE_paint_brush(&sd->paint);
+ Brush *brush = ss->cache->brush ? ss->cache->brush : BKE_paint_brush(&sd->paint);
float offset[3];
const float bstrength = ss->cache->bstrength;
+ bool mode = SCULPT_get_int(ss, sharp_mode, sd, brush);
+ float plane_offset = SCULPT_get_float(ss, plane_offset, sd, brush);
+
/* Offset with as much as possible factored in already. */
float effective_normal[3];
SCULPT_tilt_effective_normal_get(ss, brush, effective_normal);
- mul_v3_v3fl(offset, effective_normal, ss->cache->radius);
+
+ if (mode == SCULPT_SHARP_PLANE) { // average with view normal
+ add_v3_v3(effective_normal, ss->cache->view_normal);
+ mul_v3_fl(effective_normal, 0.5f);
+ }
+
+ mul_v3_v3fl(offset, effective_normal, ss->cache->radius + ss->cache->radius * plane_offset);
mul_v3_v3(offset, ss->cache->scale);
mul_v3_fl(offset, bstrength);
@@ -5332,7 +5417,13 @@ static void do_draw_sharp_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int to
TaskParallelSettings settings;
BKE_pbvh_parallel_range_settings(&settings, true, totnode);
- BLI_task_parallel_range(0, totnode, &data, do_draw_sharp_brush_task_cb_ex, &settings);
+
+ if (mode == SCULPT_SHARP_SIMPLE) {
+ BLI_task_parallel_range(0, totnode, &data, do_draw_sharp_brush_task_cb_ex, &settings);
+ }
+ else {
+ BLI_task_parallel_range(0, totnode, &data, do_draw_sharp_brush_task_cb_ex_plane, &settings);
+ }
}
/* -------------------------------------------------------------------- */
diff --git a/source/blender/editors/sc
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list