[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