[Bf-blender-cvs] [2255892f5b7] sculpt-dev: Sculpt-dev: add random_[hue/sat/value] color filter options from sculpt-mode-features
Joseph Eagar
noreply at git.blender.org
Sat Nov 20 17:52:59 CET 2021
Commit: 2255892f5b7c4bbe86ede77d41a56f90f027b9d0
Author: Joseph Eagar
Date: Sat Nov 20 08:46:55 2021 -0800
Branches: sculpt-dev
https://developer.blender.org/rB2255892f5b7c4bbe86ede77d41a56f90f027b9d0
Sculpt-dev: add random_[hue/sat/value]
color filter options from
sculpt-mode-features
* Follows comment in mesh filter's randomize and
uses BLI_hash_int_3d.
* Added a seed parameter.
* Also renamed SCULPT_get_mdyntopo to SCULPT_get_sculptvert.
===================================================================
M release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
M source/blender/editors/sculpt_paint/paint_cursor.c
M source/blender/editors/sculpt_paint/sculpt.c
M source/blender/editors/sculpt_paint/sculpt_brushes.c
M source/blender/editors/sculpt_paint/sculpt_filter_color.c
M source/blender/editors/sculpt_paint/sculpt_intern.h
M source/blender/editors/sculpt_paint/sculpt_paint_color.c
M source/blender/editors/sculpt_paint/sculpt_smooth.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index 27e8b982589..9ed8b0d3e56 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -1408,6 +1408,9 @@ class _defs_sculpt:
layout.prop(props, "fill_color", expand=False)
layout.prop(props, "strength")
+ if (props.type in ('RANDOM_HUE', 'RANDOM_SATURATION', 'RANDOM_VALUE')):
+ layout.prop(props, "seed")
+
return dict(idname="builtin.color_filter",
label="Color Filter",
icon="ops.sculpt.color_filter",
diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c
index 8e708ab7e42..bb2b7d804b2 100644
--- a/source/blender/editors/sculpt_paint/paint_cursor.c
+++ b/source/blender/editors/sculpt_paint/paint_cursor.c
@@ -1519,11 +1519,11 @@ static void sculpt_cursor_draw_3D_face_set_preview(PaintCursorContext *pcontext)
int fi = BKE_pbvh_face_index_to_table(ss->pbvh, ss->active_face_index);
+ /*
MPoly *poly = &ss->mpoly[fi];
MLoop *loops = ss->mloop;
const int totpoints = poly->totloop;
- /*
immBegin(GPU_PRIM_LINE_STRIP, totpoints + 1);
for (int i = 0; i < totpoints; i++) {
float co[3];
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index daefa621981..192253f85ba 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -322,7 +322,7 @@ int SCULPT_vertex_count_get(const SculptSession *ss)
return BKE_sculptsession_get_totvert(ss);
}
-MSculptVert *SCULPT_vertex_get_mdyntopo(const SculptSession *ss, SculptVertRef vertex)
+MSculptVert *SCULPT_vertex_get_sculptvert(const SculptSession *ss, SculptVertRef vertex)
{
switch (BKE_pbvh_type(ss->pbvh)) {
case PBVH_BMESH: {
@@ -3071,7 +3071,7 @@ bool SCULPT_vertex_check_origdata(SculptSession *ss, SculptVertRef vertex)
void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, SculptVertRef vertex)
{
// check if we need to update original data for current stroke
- MSculptVert *mv = SCULPT_vertex_get_mdyntopo(orig_data->ss, vertex);
+ MSculptVert *mv = SCULPT_vertex_get_sculptvert(orig_data->ss, vertex);
SCULPT_vertex_check_origdata(orig_data->ss, vertex);
@@ -3146,7 +3146,7 @@ static void paint_mesh_restore_co_task_cb(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
SCULPT_vertex_check_origdata(ss, vd.vertex);
- MSculptVert *mv = SCULPT_vertex_get_mdyntopo(ss, vd.vertex);
+ MSculptVert *mv = SCULPT_vertex_get_sculptvert(ss, vd.vertex);
if (type & SCULPT_UNDO_COORDS) {
if (len_squared_v3v3(vd.co, mv->origco) > FLT_EPSILON) {
diff --git a/source/blender/editors/sculpt_paint/sculpt_brushes.c b/source/blender/editors/sculpt_paint/sculpt_brushes.c
index 6c7a21acde9..07dc2e9f821 100644
--- a/source/blender/editors/sculpt_paint/sculpt_brushes.c
+++ b/source/blender/editors/sculpt_paint/sculpt_brushes.c
@@ -2643,7 +2643,7 @@ static void do_draw_sharp_brush_task_cb_ex(void *__restrict userdata,
BKE_pbvh_vertex_iter_begin (ss->pbvh, data->nodes[n], vd, PBVH_ITER_UNIQUE) {
SCULPT_vertex_check_origdata(ss, vd.vertex);
- MSculptVert *mv = SCULPT_vertex_get_mdyntopo(ss, vd.vertex);
+ MSculptVert *mv = SCULPT_vertex_get_sculptvert(ss, vd.vertex);
if (!sculpt_brush_test_sq_fn(&test, mv->origco)) {
continue;
@@ -2702,7 +2702,7 @@ static void do_draw_sharp_brush_task_cb_ex_plane(void *__restrict userdata,
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);
+ MSculptVert *mv = SCULPT_vertex_get_sculptvert(ss, vd.vertex);
if (!sculpt_brush_test_sq_fn(&test, mv->origco)) {
continue;
diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_color.c b/source/blender/editors/sculpt_paint/sculpt_filter_color.c
index 56ef8d049f6..745d08580b8 100644
--- a/source/blender/editors/sculpt_paint/sculpt_filter_color.c
+++ b/source/blender/editors/sculpt_paint/sculpt_filter_color.c
@@ -27,7 +27,9 @@
#include "BLI_hash.h"
#include "BLI_math.h"
#include "BLI_math_color_blend.h"
+#include "BLI_rand.h"
#include "BLI_task.h"
+#include "PIL_time.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -67,6 +69,9 @@
#include <math.h>
#include <stdlib.h>
+#define COLOR_FILTER_NEEDS_RANDOM(mode) \
+ ELEM(mode, COLOR_FILTER_RANDOM_HUE, COLOR_FILTER_RANDOM_SATURATION, COLOR_FILTER_RANDOM_VALUE)
+
typedef enum eSculptColorFilterTypes {
COLOR_FILTER_FILL,
COLOR_FILTER_HUE,
@@ -78,6 +83,9 @@ typedef enum eSculptColorFilterTypes {
COLOR_FILTER_GREEN,
COLOR_FILTER_BLUE,
COLOR_FILTER_SMOOTH,
+ COLOR_FILTER_RANDOM_HUE,
+ COLOR_FILTER_RANDOM_SATURATION,
+ COLOR_FILTER_RANDOM_VALUE,
} eSculptColorFilterTypes;
static EnumPropertyItem prop_color_filter_types[] = {
@@ -94,24 +102,32 @@ static EnumPropertyItem prop_color_filter_types[] = {
{COLOR_FILTER_RED, "RED", 0, "Red", "Change red channel"},
{COLOR_FILTER_GREEN, "GREEN", 0, "Green", "Change green channel"},
{COLOR_FILTER_BLUE, "BLUE", 0, "Blue", "Change blue channel"},
+
+ {COLOR_FILTER_RANDOM_HUE, "RANDOM_HUE", 0, "Random Hue", "Randomize HSV hue"},
+ {COLOR_FILTER_RANDOM_SATURATION,
+ "RANDOM_SATURATION",
+ 0,
+ "Random Saturation",
+ "Randomize HSV saturation"},
+ {COLOR_FILTER_RANDOM_VALUE, "RANDOM_VALUE", 0, "Random Value", "Randomize HSV value"},
{0, NULL, 0, NULL, NULL},
};
-static void color_filter_task_cb(void *__restrict userdata,
- const int n,
- const TaskParallelTLS *__restrict UNUSED(tls))
+ATTR_NO_OPT static void color_filter_task_cb(void *__restrict userdata,
+ const int n,
+ const TaskParallelTLS *__restrict UNUSED(tls))
{
SculptThreadedTaskData *data = userdata;
SculptSession *ss = data->ob->sculpt;
const int mode = data->filter_type;
-
- SculptOrigVertData orig_data;
- SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n], SCULPT_UNDO_COLOR);
+ const uint random_seed = (uint)data->mask_init_seed;
PBVHVertexIter vd;
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_sculptvert(ss, vd.vertex);
+
float orig_color[3], final_color[4], hsv_color[3];
int hue;
float brightness, contrast, gain, delta, offset;
@@ -123,7 +139,18 @@ static void color_filter_task_cb(void *__restrict userdata,
continue;
}
- copy_v3_v3(orig_color, orig_data.col);
+ float random_factor = 0.0f;
+
+ copy_v3_v3(orig_color, mv->origcolor);
+
+ /* Index is not unique for multires, so hash by vertex coordinates. */
+ if (COLOR_FILTER_NEEDS_RANDOM(mode)) {
+ const uint *hash_co = (const uint *)mv->origco;
+ uint seed = BLI_hash_int_3d(hash_co[0], hash_co[1], hash_co[2]);
+ seed ^= BLI_hash_int(random_seed);
+
+ random_factor = ((float)seed) / (float)0xFFFFFFFFu - 0.5f;
+ }
switch (mode) {
case COLOR_FILTER_FILL: {
@@ -132,7 +159,7 @@ static void color_filter_task_cb(void *__restrict userdata,
fill_color_rgba[3] = 1.0f;
fade = clamp_f(fade, 0.0f, 1.0f);
mul_v4_fl(fill_color_rgba, fade);
- blend_color_mix_float(final_color, orig_data.col, fill_color_rgba);
+ blend_color_mix_float(final_color, mv->origcolor, fill_color_rgba);
break;
}
case COLOR_FILTER_HUE:
@@ -205,12 +232,30 @@ static void color_filter_task_cb(void *__restrict userdata,
blend_color_interpolate_float(final_color, col, smooth_color, fade);
break;
}
+ case COLOR_FILTER_RANDOM_HUE:
+ fade *= random_factor;
+ rgb_to_hsv_v(orig_color, hsv_color);
+ hue = hsv_color[0] + fade;
+ hsv_color[0] = fabs((hsv_color[0] + fade) - hue);
+ hsv_to_rgb_v(hsv_color, final_color);
+ break;
+ case COLOR_FILTER_RANDOM_SATURATION:
+ fade *= random_factor;
+ rgb_to_hsv_v(orig_color, hsv_color);
+ hsv_color[1] = hsv_color[1] + fade;
+ CLAMP(hsv_color[1], 0.0f, 1.0f);
+ hsv_to_rgb_v(hsv_color, final_color);
+ break;
+ case COLOR_FILTER_RANDOM_VALUE:
+ fade *= random_factor;
+ rgb_to_hsv_v(orig_color, hsv_color);
+ hsv_color[2] = hsv_color[2] + fade;
+ CLAMP(hsv_color[2], 0.0f, 1.0f);
+ hsv_to_rgb_v(hsv_color, final_color);
+ break;
}
- float col[4];
- SCULPT_vertex_color_get(ss, vd.vertex, col);
-
- copy_v3_v3(col, final_color);
+ SCULPT_vertex_color_set(ss, vd.vertex, final_color);
if (vd.mvert) {
vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
@@ -253,12 +298,13 @@ static int sculpt_color_filter_modal(bContext *C, wmOperator *op, const wmEvent
.filter_type = mode,
.filter_strength = filter_strength,
.filter_fill_color = fill_color,
+ .mask_init_seed = ss->filter_cache->random_seed,
};
TaskParallelSettings settings;
BLI_parallel_range_settings_defaults(&settings);
- BKE_pbvh_parallel_range_settings(&settings, true, ss->filter_cache->totnode);
+ BKE_pbvh_parallel_range_settings(&settings, false /* XXX debug */, ss->filter_cache->totnode);
BLI_task_parallel_range(0, ss->filter_cache->totnode, &data, color_filter_task_cb, &settings);
SCULPT_flush_update_step(C, SCULPT_UPDATE_COLOR);
@@ -319,6 +365,11 @@ static int sculpt_color_filter_invoke(bContext *C, wmOperator *op, const wmEvent
filter_cache->active_face_set = SCULPT_FACE_SET_NONE;
filter_cache->automasking = SCULPT_automasking_cache_init(sd, NULL, o
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list