[Bf-blender-cvs] [df7857a364d] sculpt-dev: Sculpt Expand: vertex colors target

Pablo Dobarro noreply at git.blender.org
Sat Jan 16 01:21:47 CET 2021


Commit: df7857a364dfadfd007762166c67f8c5a3011184
Author: Pablo Dobarro
Date:   Sat Jan 16 00:42:26 2021 +0100
Branches: sculpt-dev
https://developer.blender.org/rBdf7857a364dfadfd007762166c67f8c5a3011184

Sculpt Expand: vertex colors target

===================================================================

M	source/blender/editors/sculpt_paint/sculpt_expand.c
M	source/blender/editors/sculpt_paint/sculpt_intern.h

===================================================================

diff --git a/source/blender/editors/sculpt_paint/sculpt_expand.c b/source/blender/editors/sculpt_paint/sculpt_expand.c
index 7372c1bd82e..7d430081f7e 100644
--- a/source/blender/editors/sculpt_paint/sculpt_expand.c
+++ b/source/blender/editors/sculpt_paint/sculpt_expand.c
@@ -63,6 +63,9 @@
 #include "paint_intern.h"
 #include "sculpt_intern.h"
 
+#include "IMB_colormanagement.h"
+#include "IMB_imbuf.h"
+
 #include "bmesh.h"
 
 #include <math.h>
@@ -79,7 +82,7 @@ enum {
   SCULPT_EXPAND_MODAL_FALLOFF_CYCLE,
 };
 
-static EnumPropertyItem prop_sculpt_expand_faloff_type_items[] = {
+static EnumPropertyItem prop_sculpt_expand_falloff_type_items[] = {
     {SCULPT_EXPAND_FALLOFF_GEODESICS, "GEODESICS", 0, "Surface", ""},
     {SCULPT_EXPAND_FALLOFF_TOPOLOGY, "TOPOLOGY", 0, "Topology", ""},
     {SCULPT_EXPAND_FALLOFF_NORMALS, "NORMALS", 0, "Normals", ""},
@@ -88,6 +91,13 @@ static EnumPropertyItem prop_sculpt_expand_faloff_type_items[] = {
     {0, NULL, 0, NULL, NULL},
 };
 
+static EnumPropertyItem prop_sculpt_expand_target_type_items[] = {
+    {SCULPT_EXPAND_TARGET_MASK, "MASK", 0, "Mask", ""},
+    {SCULPT_EXPAND_TARGET_FACE_SETS, "FACE_SETS", 0, "Face Sets", ""},
+    {SCULPT_EXPAND_TARGET_COLORS, "COLOR", 0, "Color", ""},
+    {0, NULL, 0, NULL, NULL},
+};
+
 static float *sculpt_expand_geodesic_falloff_create(Sculpt *sd, Object *ob, const int vertex)
 {
   return SCULPT_geodesic_from_vertex_and_symm(sd, ob, vertex, FLT_MAX);
@@ -359,6 +369,7 @@ static void sculpt_expand_cache_free(ExpandCache *expand_cache)
   MEM_SAFE_FREE(expand_cache->falloff_factor);
   MEM_SAFE_FREE(expand_cache->initial_mask);
   MEM_SAFE_FREE(expand_cache->initial_face_sets);
+  MEM_SAFE_FREE(expand_cache->initial_color);
   MEM_SAFE_FREE(expand_cache);
 }
 
@@ -476,6 +487,59 @@ static void sculpt_expand_mask_update_task_cb(void *__restrict userdata,
   }
 }
 
+static void sculpt_expand_colors_update_task_cb(void *__restrict userdata,
+                                                const int i,
+                                                const TaskParallelTLS *__restrict UNUSED(tls))
+{
+  SculptThreadedTaskData *data = userdata;
+  SculptSession *ss = data->ob->sculpt;
+  PBVHNode *node = data->nodes[i];
+  ExpandCache *expand_cache = ss->expand_cache;
+
+  bool any_changed = false;
+
+  PBVHVertexIter vd;
+  BKE_pbvh_vertex_iter_begin(ss->pbvh, node, vd, PBVH_ITER_ALL)
+  {
+    float initial_color[4];
+    copy_v4_v4(initial_color, vd.col);
+
+    const bool enabled = sculpt_expand_state_get(expand_cache, vd.index);
+    float fade;
+
+    if (enabled) {
+      fade = sculpt_expand_gradient_falloff_get(expand_cache, vd.index);
+    }
+    else {
+      fade = 0.0f;
+    }
+
+    fade = clamp_f(fade, 0.0f, 1.0f);
+
+    float final_color[4];
+    float final_fill_color[4];
+    mul_v4_v4fl(final_fill_color, expand_cache->fill_color, fade);
+    IMB_blend_color_float(final_color,
+                          expand_cache->initial_color[vd.index],
+                          final_fill_color,
+                          expand_cache->blend_mode);
+
+    if (equals_v4v4(initial_color, final_color)) {
+      continue;
+    }
+
+    copy_v4_v4(vd.col, final_color);
+    any_changed = true;
+    if (vd.mvert) {
+      vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
+    }
+  }
+  BKE_pbvh_vertex_iter_end;
+  if (any_changed) {
+    BKE_pbvh_node_mark_update_color(node);
+  }
+}
+
 static void sculpt_expand_flush_updates(bContext *C)
 {
   Object *ob = CTX_data_active_object(C);
@@ -483,7 +547,21 @@ static void sculpt_expand_flush_updates(bContext *C)
   for (int i = 0; i < ss->expand_cache->totnode; i++) {
     BKE_pbvh_node_mark_redraw(ss->expand_cache->nodes[i]);
   }
-  SCULPT_flush_update_step(C, SCULPT_UPDATE_MASK);
+
+  switch (ss->expand_cache->target) {
+    case SCULPT_EXPAND_TARGET_MASK:
+      SCULPT_flush_update_step(C, SCULPT_UPDATE_MASK);
+      break;
+    case SCULPT_EXPAND_TARGET_FACE_SETS:
+      SCULPT_flush_update_step(C, SCULPT_UPDATE_MASK);
+      break;
+    case SCULPT_EXPAND_TARGET_COLORS:
+      SCULPT_flush_update_step(C, SCULPT_UPDATE_COLOR);
+      break;
+
+    default:
+      break;
+  }
 }
 
 static void sculpt_expand_initial_state_store(Object *ob, ExpandCache *expand_cache)
@@ -501,6 +579,13 @@ static void sculpt_expand_initial_state_store(Object *ob, ExpandCache *expand_ca
   for (int i = 0; i < totface; i++) {
     expand_cache->initial_face_sets[i] = ss->face_sets[i];
   }
+
+  if (expand_cache->target == SCULPT_EXPAND_TARGET_COLORS) {
+    expand_cache->initial_color = MEM_malloc_arrayN(totvert, sizeof(float[4]), "initial colors");
+    for (int i = 0; i < totvert; i++) {
+      copy_v4_v4(expand_cache->initial_color[i], SCULPT_vertex_color_get(ss, i));
+    }
+  }
 }
 
 static void sculpt_expand_update_for_vertex(bContext *C, Object *ob, const int vertex)
@@ -525,8 +610,21 @@ static void sculpt_expand_update_for_vertex(bContext *C, Object *ob, const int v
 
   TaskParallelSettings settings;
   BKE_pbvh_parallel_range_settings(&settings, true, expand_cache->totnode);
-  BLI_task_parallel_range(
-      0, expand_cache->totnode, &data, sculpt_expand_mask_update_task_cb, &settings);
+
+  switch (expand_cache->target) {
+    case SCULPT_EXPAND_TARGET_MASK:
+      BLI_task_parallel_range(
+          0, expand_cache->totnode, &data, sculpt_expand_mask_update_task_cb, &settings);
+      break;
+    case SCULPT_EXPAND_TARGET_FACE_SETS:
+      BLI_task_parallel_range(
+          0, expand_cache->totnode, &data, sculpt_expand_mask_update_task_cb, &settings);
+      break;
+    case SCULPT_EXPAND_TARGET_COLORS:
+      BLI_task_parallel_range(
+          0, expand_cache->totnode, &data, sculpt_expand_colors_update_task_cb, &settings);
+      break;
+  }
 
   sculpt_expand_flush_updates(C);
 }
@@ -550,9 +648,23 @@ static void sculpt_expand_finish(bContext *C)
 {
   Object *ob = CTX_data_active_object(C);
   SculptSession *ss = ob->sculpt;
-  sculpt_expand_cache_free(ss->expand_cache);
   SCULPT_undo_push_end();
-  SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK);
+
+  switch (ss->expand_cache->target) {
+    case SCULPT_EXPAND_TARGET_MASK:
+      SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK);
+      break;
+    case SCULPT_EXPAND_TARGET_FACE_SETS:
+      SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_MASK);
+      break;
+    case SCULPT_EXPAND_TARGET_COLORS:
+      SCULPT_flush_update_done(C, ob, SCULPT_UPDATE_COLOR);
+      break;
+    default:
+      break;
+  }
+
+  sculpt_expand_cache_free(ss->expand_cache);
   ED_workspace_status_text(C, NULL);
 }
 
@@ -595,32 +707,50 @@ static int sculpt_expand_modal(bContext *C, wmOperator *op, const wmEvent *event
   return OPERATOR_RUNNING_MODAL;
 }
 
-static void sculpt_expand_cache_initial_config_set(ExpandCache *expand_cache, wmOperator *op)
+static void sculpt_expand_cache_initial_config_set(Sculpt *sd,
+                                                   Object *ob,
+                                                   ExpandCache *expand_cache,
+                                                   wmOperator *op)
 {
+
   expand_cache->invert = RNA_boolean_get(op->ptr, "invert");
   expand_cache->mask_preserve = RNA_boolean_get(op->ptr, "use_mask_preserve");
   expand_cache->falloff_gradient = RNA_boolean_get(op->ptr, "use_falloff_gradient");
+  expand_cache->target = RNA_enum_get(op->ptr, "target");
+
+  SculptSession *ss = ob->sculpt;
+  Brush *brush = BKE_paint_brush(&sd->paint);
+  copy_v4_fl(expand_cache->fill_color, 1.0f);
+  copy_v3_v3(expand_cache->fill_color, BKE_brush_color_get(ss->scene, brush));
+  IMB_colormanagement_srgb_to_scene_linear_v3(expand_cache->fill_color);
+
+  expand_cache->blend_mode = brush->blend;
 }
 
 static int sculpt_expand_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
-  Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
+  Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
   Object *ob = CTX_data_active_object(C);
   SculptSession *ss = ob->sculpt;
   Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
 
+  /* Create and configure the Expand Cache. */
+  ss->expand_cache = MEM_callocN(sizeof(ExpandCache), "expand cache");
+  sculpt_expand_cache_initial_config_set(sd, ob, ss->expand_cache, op);
+
   /* Update object. */
-  BKE_sculpt_update_object_for_edit(depsgraph, ob, true, true, false);
+  const bool needs_colors = ss->expand_cache->target = SCULPT_EXPAND_TARGET_COLORS;
+
+  if (needs_colors) {
+    BKE_sculpt_color_layer_create_if_needed(ob);
+    depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
+  }
+
+  BKE_sculpt_update_object_for_edit(depsgraph, ob, true, true, needs_colors);
   SCULPT_vertex_random_access_ensure(ss);
   SCULPT_boundary_info_ensure(ob);
   SCULPT_undo_push_begin(ob, "expand");
 
-  /* Create the Expand Cache. */
-  ss->expand_cache = MEM_callocN(sizeof(ExpandCache), "expand cache");
-
-  /* Configure the cache with the operator properties. */
-  sculpt_expand_cache_initial_config_set(ss->expand_cache, op);
-
   /* Set the initial element for expand. */
   int initial_vertex = sculpt_expand_target_vertex_update_and_get(C, ob, event);
   if (initial_vertex == SCULPT_EXPAND_VERTEX_NONE) {
@@ -699,6 +829,14 @@ void SCULPT_OT_expand(wmOperatorType *ot)
   ot->poll = SCULPT_mode_poll;
 
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+  RNA_def_enum(ot->srna,
+               "target",
+               prop_sculpt_expand_target_type_items,
+               SCULPT_EXPAND_TARGET_COLORS,
+               "Data Target",
+               "Data that is going to be modified in the expand operation");
+
   ot->prop = RNA_def_boolean(
       ot->srna, "invert", true, "Invert", "Invert the expand active elements");
   ot->prop = RNA_def_boolean(ot->srna,
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index c2223cda50e..a407fa98c5b 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -1161,6 +1161,7 @@ typedef enum eSculptExpandFalloffType {
 typedef enum eSculptExpandTargetType {
   SCULPT_EXPAND_TARGET_MASK,
   SCULPT_EXPAND_TARGET_FACE_SETS,
+  SCULPT_EXPAND_TARGET_COLORS,
 } eSculptExpandTarg

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list