[Bf-blender-cvs] [779a268c6ec] sculpt-dev: Sculpt IPMask: Initial refactor to support step interpolation

Pablo Dobarro noreply at git.blender.org
Mon Mar 1 22:16:00 CET 2021


Commit: 779a268c6ec4824a35e59ad2f83f6a6cbc2926ec
Author: Pablo Dobarro
Date:   Mon Mar 1 18:52:27 2021 +0100
Branches: sculpt-dev
https://developer.blender.org/rB779a268c6ec4824a35e59ad2f83f6a6cbc2926ec

Sculpt IPMask: Initial refactor to support step interpolation

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

M	source/blender/editors/sculpt_paint/sculpt_filter_mask.c

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

diff --git a/source/blender/editors/sculpt_paint/sculpt_filter_mask.c b/source/blender/editors/sculpt_paint/sculpt_filter_mask.c
index c61e1e65b22..9f4b14959bb 100644
--- a/source/blender/editors/sculpt_paint/sculpt_filter_mask.c
+++ b/source/blender/editors/sculpt_paint/sculpt_filter_mask.c
@@ -614,18 +614,17 @@ static float *sculpt_ipmask_apply_delta_step(MaskFilterDeltaStep *delta_step,
   return next_mask;
 }
 
-static void sculpt_ipmask_restore_state_from_delta(SculptSession *ss,
+static float *sculpt_ipmask_restore_state_from_delta(SculptSession *ss,
                                                    MaskFilterDeltaStep *delta_step,
                                                    MaskFilterStepDirectionType direction)
 {
   float *current_mask = sculpt_ipmask_current_state_get(ss);
   float *next_mask = sculpt_ipmask_apply_delta_step(delta_step, current_mask, direction);
   MEM_freeN(current_mask);
-  sculpt_ipmask_apply_mask_data(ss, next_mask);
-  MEM_freeN(next_mask);
+  return next_mask;
 }
 
-static void sculpt_ipmask_compute_and_store_step(SculptSession *ss,
+static float *sculpt_ipmask_compute_and_store_step(SculptSession *ss,
                                                  const int iterations,
                                                  const int delta_index,
                                                  MaskFilterStepDirectionType direction)
@@ -655,29 +654,21 @@ static void sculpt_ipmask_compute_and_store_step(SculptSession *ss,
   BLI_ghash_insert(ss->filter_cache->mask_delta_step, POINTER_FROM_INT(delta_index), delta_step);
   MEM_freeN(original_mask);
 
-  /* Store the result in the sculpt mesh. */
-  sculpt_ipmask_apply_mask_data(ss, next_mask);
-  MEM_freeN(next_mask);
+  return next_mask;
 }
 
-
-static void sculpt_ipmask_filter_update_to_target_step(SculptSession *ss, const int target_step, const int iteration_count) {
-  FilterCache *filter_cache = ss->filter_cache;
-  while (filter_cache->mask_filter_current_step != target_step) {
+static float *sculpt_ipmask_filter_mask_for_step_get(SculptSession *ss, MaskFilterStepDirectionType direction, const int iteration_count) {
+    FilterCache *filter_cache = ss->filter_cache;
     int next_step = filter_cache->mask_filter_current_step;
     int delta_index = next_step;
-    MaskFilterStepDirectionType direction;
-
     /* Get the next step and the delta step index associated with it. */
-    if (target_step > filter_cache->mask_filter_current_step) {
+    if (direction == MASK_FILTER_STEP_DIRECTION_FORWARD) {
       next_step = filter_cache->mask_filter_current_step + 1;
       delta_index = filter_cache->mask_filter_current_step;
-      direction = MASK_FILTER_STEP_DIRECTION_FORWARD;
     }
     else {
       next_step = filter_cache->mask_filter_current_step - 1;
       delta_index = filter_cache->mask_filter_current_step - 1;
-      direction = MASK_FILTER_STEP_DIRECTION_BACKWARD;
     }
 
     /* Update the data one step forward/backward. */
@@ -685,16 +676,51 @@ static void sculpt_ipmask_filter_update_to_target_step(SculptSession *ss, const
       /* This step was already computed, restore it from the current step and a delta. */
       MaskFilterDeltaStep *delta_step = BLI_ghash_lookup(filter_cache->mask_delta_step,
                                                          POINTER_FROM_INT(delta_index));
-      sculpt_ipmask_restore_state_from_delta(ss, delta_step, direction);
+      return sculpt_ipmask_restore_state_from_delta(ss, delta_step, direction);
+    }
+
+    /* New step that was not yet computed. Compute and store the delta. */
+    return sculpt_ipmask_compute_and_store_step(ss, iteration_count, delta_index, direction);
+}
+
+static void sculpt_ipmask_filter_update_to_target_step(SculptSession *ss, const int target_step, const int iteration_count, const float step_interpolation) {
+  FilterCache *filter_cache = ss->filter_cache;
+
+    MaskFilterStepDirectionType direction;
+    /* Get the next step and the delta step index associated with it. */
+    if (target_step > filter_cache->mask_filter_current_step) {
+      direction = MASK_FILTER_STEP_DIRECTION_FORWARD;
     }
     else {
-      /* New step that was not yet computed. Compute and store the delta. */
-      sculpt_ipmask_compute_and_store_step(ss, iteration_count, delta_index, direction);
+      direction = MASK_FILTER_STEP_DIRECTION_BACKWARD;
     }
 
-    /* Update the current step. */
-    filter_cache->mask_filter_current_step = next_step;
+  while (filter_cache->mask_filter_current_step != target_step) {
+    /* Restore or compute a mask in the given direction. */
+    float *new_mask = sculpt_ipmask_filter_mask_for_step_get(ss, direction, iteration_count);
+
+    /* Apply the mask data to the mesh. */
+    sculpt_ipmask_apply_mask_data(ss, new_mask);
+    MEM_freeN(new_mask);
+
+    /* Update the current step count. */
+    if (direction ==  MASK_FILTER_STEP_DIRECTION_FORWARD) {
+        filter_cache->mask_filter_current_step += 1;
+    }
+    else {
+        filter_cache->mask_filter_current_step -= 1;
+    }
   }
+
+  if (step_interpolation != 0.0f) {
+
+
+  }
+
+}
+
+bool sculpt_ipmask_filter_apply_from_original(const eSculptIPMaskFilterType filter_type) {
+    return true;
 }
 
 #define IPMASK_FILTER_STEP_SENSITIVITY 0.05f
@@ -723,13 +749,12 @@ static int sculpt_ipmask_filter_modal(bContext *C, wmOperator *op, const wmEvent
 
   const float len = event->x - event->prevclickx;
   const int target_step = len * IPMASK_FILTER_STEP_SENSITIVITY * UI_DPI_FAC;
-  if (target_step == filter_cache->mask_filter_current_step) {
-    return OPERATOR_RUNNING_MODAL;
-  }
+  const float step_interpolation = 0.5f;
+
 
   BKE_sculpt_update_object_for_edit(depsgraph, ob, true, true, false);
 
-  sculpt_ipmask_filter_update_to_target_step(ss, target_step, iteration_count);
+  sculpt_ipmask_filter_update_to_target_step(ss, target_step, iteration_count, step_interpolation);
 
   SCULPT_tag_update_overlays(C);



More information about the Bf-blender-cvs mailing list