[Bf-blender-cvs] [d9c3a223cc8] temp-geometry-nodes-curve-deform-node: Curve Deform Node: Refactor, add options, match modifier more closely

Hans Goudey noreply at git.blender.org
Mon Jun 14 00:31:08 CEST 2021


Commit: d9c3a223cc8de1d65be957762c21b3ae8d1ebc58
Author: Hans Goudey
Date:   Sun Jun 13 17:28:52 2021 -0500
Branches: temp-geometry-nodes-curve-deform-node
https://developer.blender.org/rBd9c3a223cc8de1d65be957762c21b3ae8d1ebc58

Curve Deform Node: Refactor, add options, match modifier more closely

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

M	source/blender/blenkernel/BKE_spline.hh
M	source/blender/blenkernel/intern/curve_deform.c
M	source/blender/blenkernel/intern/spline_base.cc
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/modifiers/intern/MOD_curve.c
M	source/blender/nodes/geometry/nodes/node_geo_curve_deform.cc

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

diff --git a/source/blender/blenkernel/BKE_spline.hh b/source/blender/blenkernel/BKE_spline.hh
index eb944fc8b5c..60a9b9bb89a 100644
--- a/source/blender/blenkernel/BKE_spline.hh
+++ b/source/blender/blenkernel/BKE_spline.hh
@@ -170,6 +170,7 @@ class Spline {
   };
   LookupResult lookup_evaluated_factor(const float factor) const;
   LookupResult lookup_evaluated_length(const float length) const;
+  LookupResult lookup_evaluated_length_cyclic(const float length) const;
 
   blender::Array<float> sample_uniform_index_factors(const int samples_size) const;
   void sample_length_parameters_to_index_factors(blender::MutableSpan<float> parameters) const;
diff --git a/source/blender/blenkernel/intern/curve_deform.c b/source/blender/blenkernel/intern/curve_deform.c
index 10c6d2213ff..dc5a093f74a 100644
--- a/source/blender/blenkernel/intern/curve_deform.c
+++ b/source/blender/blenkernel/intern/curve_deform.c
@@ -137,6 +137,8 @@ static bool calc_curve_deform(
     }
   }
 
+  printf("FAC: %.5f\n", fac);
+
   if (BKE_where_on_path(ob_curve, fac, loc, dir, new_quat, &radius, NULL)) { /* returns OK */
     float quat[4], cent[3];
 
diff --git a/source/blender/blenkernel/intern/spline_base.cc b/source/blender/blenkernel/intern/spline_base.cc
index 389420e3ff7..8956ba6adae 100644
--- a/source/blender/blenkernel/intern/spline_base.cc
+++ b/source/blender/blenkernel/intern/spline_base.cc
@@ -255,21 +255,33 @@ Spline::LookupResult Spline::lookup_evaluated_factor(const float factor) const
   return this->lookup_evaluated_length(this->length() * factor);
 }
 
-/**
- * \note This does not support extrapolation currently.
- */
 Spline::LookupResult Spline::lookup_evaluated_length(const float length) const
 {
-  BLI_assert(length >= 0.0f && length <= this->length());
-
+  const int64_t evaluated_size = this->evaluated_points_size();
   Span<float> lengths = this->evaluated_lengths();
 
+  if (is_cyclic_) {
+    const float *offset = std::lower_bound(
+        lengths.begin(), lengths.end(), std::remainder(length, this->length()));
+    const int index = offset - lengths.begin();
+    const int next_index = (index == evaluated_size - 1) ? 0 : index + 1;
+
+    const float previous_length = (index == 0) ? 0.0f : lengths[index - 1];
+    const float factor = (lengths[index] == previous_length) ?
+                             0.0f :
+                             (length - previous_length) / (lengths[index] - previous_length);
+
+    return LookupResult{index, next_index, factor};
+  }
+
   const float *offset = std::lower_bound(lengths.begin(), lengths.end(), length);
-  const int index = offset - lengths.begin();
-  const int next_index = (index == this->size() - 1) ? 0 : index + 1;
+  const int index = std::min(offset - lengths.begin(), evaluated_size - 2);
+  const int next_index = index + 1;
 
   const float previous_length = (index == 0) ? 0.0f : lengths[index - 1];
-  const float factor = (length - previous_length) / (lengths[index] - previous_length);
+  const float factor = (lengths[index] == previous_length) ?
+                           0.0f :
+                           (length - previous_length) / (lengths[index] - previous_length);
 
   return LookupResult{index, next_index, factor};
 }
@@ -319,6 +331,7 @@ Array<float> Spline::sample_uniform_index_factors(const int samples_size) const
   return samples;
 }
 
+#ifdef DEBUG
 static void assert_sorted_array_in_range(Span<float> data, const float min, const float max)
 {
   BLI_assert(data.first() >= min);
@@ -327,6 +340,7 @@ static void assert_sorted_array_in_range(Span<float> data, const float min, cons
   }
   BLI_assert(data.last() <= max);
 }
+#endif
 
 /**
  * Transform an array of sorted length parameters into index factors. The result is indices
@@ -342,7 +356,9 @@ static void assert_sorted_array_in_range(Span<float> data, const float min, cons
 void Spline::sample_length_parameters_to_index_factors(MutableSpan<float> parameters) const
 {
   const Span<float> lengths = this->evaluated_lengths();
+#ifdef DEBUG
   assert_sorted_array_in_range(parameters, 0.0f, this->length());
+#endif
 
   /* Store the length at the previous evaluated point in a variable so it can
    * start out at zero (the lengths array doesn't contain 0 for the first point). */
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index a3cb0215406..6c1a141448f 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1363,14 +1363,8 @@ typedef struct NodeGeometryCurveResample {
 } NodeGeometryCurveResample;
 
 typedef struct NodeGeometryCurveDeform {
-  /* GeometryNodeCurveDeformMode. */
-  uint8_t input_mode;
   /* GeometryNodeCurveDeformAxis. */
   uint8_t axis;
-  /* GeometryNodeAttributeInputMode (float or attribute). */
-  uint8_t attribute_input_type;
-
-  char _pad[5];
 } NodeGeometryCurveDeform;
 
 typedef struct NodeGeometryAttributeTransfer {
@@ -1891,11 +1885,6 @@ typedef enum GeometryNodeAttributeTransferMapMode {
   GEO_NODE_ATTRIBUTE_TRANSFER_NEAREST = 1,
 } GeometryNodeAttributeTransferMapMode;
 
-typedef enum GeometryNodeCurveDeformMode {
-  GEO_NODE_CURVE_DEFORM_POSITION = 0,
-  GEO_NODE_CURVE_DEFORM_ATTRIBUTE = 1,
-} GeometryNodeCurveDeformMode;
-
 typedef enum GeometryNodeCurveDeformAxis {
   GEO_NODE_CURVE_DEFORM_POSX = 0,
   GEO_NODE_CURVE_DEFORM_POSY = 1,
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 5dea9a69ff7..1a0a6a9514d 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -9846,12 +9846,6 @@ static void def_geo_curve_deform(StructRNA *srna)
 {
   PropertyRNA *prop;
 
-  static EnumPropertyItem mode_items[] = {
-      {GEO_NODE_CURVE_DEFORM_POSITION, "POSITION", 0, "Position", ""},
-      {GEO_NODE_CURVE_DEFORM_ATTRIBUTE, "ATTRIBUTE", 0, "Attribute", ""},
-      {0, NULL, 0, NULL, NULL},
-  };
-
   static const EnumPropertyItem axis_items[] = {
       {GEO_NODE_CURVE_DEFORM_POSX, "POS_X", 0, "X", ""},
       {GEO_NODE_CURVE_DEFORM_POSY, "POS_Y", 0, "Y", ""},
@@ -9864,20 +9858,10 @@ static void def_geo_curve_deform(StructRNA *srna)
 
   RNA_def_struct_sdna_from(srna, "NodeGeometryCurveDeform", "storage");
 
-  prop = RNA_def_property(srna, "input_mode", PROP_ENUM, PROP_NONE);
-  RNA_def_property_enum_items(prop, mode_items);
-  RNA_def_property_ui_text(prop, "Input Mode", "How to specify the curve parameter at each point");
-  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
-
   prop = RNA_def_property(srna, "axis", PROP_ENUM, PROP_NONE);
   RNA_def_property_enum_items(prop, axis_items);
   RNA_def_property_ui_text(prop, "Position Axis", "");
   RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
-
-  prop = RNA_def_property(srna, "attribute_input_type", PROP_ENUM, PROP_NONE);
-  RNA_def_property_enum_items(prop, rna_node_geometry_attribute_input_type_items_float);
-  RNA_def_property_ui_text(prop, "Attribute Input Type", "");
-  RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
 }
 
 static void def_geo_attribute_transfer(StructRNA *srna)
diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c
index 20dbb299767..1019839c4c7 100644
--- a/source/blender/modifiers/intern/MOD_curve.c
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -24,6 +24,7 @@
 #include <string.h>
 
 #include "BLI_utildefines.h"
+#include "PIL_time.h"
 
 #include "BLT_translation.h"
 
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_deform.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_deform.cc
index 7c60eb6debf..e5227c38156 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_deform.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_deform.cc
@@ -16,6 +16,7 @@
 
 #include "BLI_array.hh"
 #include "BLI_float4x4.hh"
+#include "BLI_resource_scope.hh"
 #include "BLI_task.hh"
 #include "BLI_timeit.hh"
 
@@ -36,7 +37,8 @@ static bNodeSocketTemplate geo_node_curve_deform_in[] = {
     {SOCK_GEOMETRY, N_("Curve")},
     {SOCK_STRING, N_("Factor")},
     {SOCK_FLOAT, N_("Factor"), 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
-    {SOCK_BOOLEAN, N_("Stretch to Fit")},
+    {SOCK_BOOLEAN, N_("Use Bounds")},
+    {SOCK_BOOLEAN, N_("Stretch")},
     {-1, ""},
 };
 
@@ -47,19 +49,7 @@ static bNodeSocketTemplate geo_node_curve_deform_out[] = {
 
 static void geo_node_curve_deform_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 {
-  const bNode *node = (bNode *)ptr->data;
-  NodeGeometryCurveDeform &node_storage = *(NodeGeometryCurveDeform *)node->storage;
-  const GeometryNodeCurveDeformMode mode = (GeometryNodeCurveDeformMode)node_storage.input_mode;
-
   uiItemR(layout, ptr, "axis", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
-
-  uiItemR(layout, ptr, "input_mode", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
-
-  if (mode == GEO_NODE_CURVE_DEFORM_ATTRIBUTE) {
-    uiLayoutSetPropSep(layout, true);
-    uiLayoutSetPropDecorate(layout, false);
-    uiItemR(layout, ptr, "attribute_input_type", 0, IFACE_("Factor"), ICON_NONE);
-  }
 }
 
 static void geo_node_curve_deform_init(bNodeTree *UNUSED(tree), bNode *node)
@@ -67,48 +57,64 @@ static void geo_node_curve_deform_init(bNodeTree *UNUSED(tree), bNode *node)
   NodeGeometryCurveDeform *data = (NodeGeometryCurveDeform *)MEM_callocN(
       sizeof(NodeGeometryCurveDeform), __func__);
 
-  data->input_mode = GEO_NODE_CURVE_DEFORM_POSITION;
   data->axis = GEO_NODE_CURVE_DEFORM_POSX;
-  data->attribute_input_type = GEO_NODE_ATTRIBUTE_INPUT_ATTRIBUTE;
   node->storage = data;
 }
 
 namespace blender::nodes {
 
-static void geo_node_curve_deform_update(bNodeTree *UNUSED(ntree), bNode *node)
+static constexpr int deform_axis_index(const GeometryNodeCurveDeformAxis axis)
 {
-  NodeGeometryCurveDeform &node_storage = *(NodeGeometryCurveDeform *)node->storage;
-  const GeometryNodeCurveDeformMode mode = (GeometryNodeCurveDeformMode)node_storage.input_mode;
-
-  bNodeSocket *attribute_socket = ((bNodeSocket *)node->inputs.first)->next->next;
+  switch (axis) {
+    case GEO_NODE_CURVE_DEFORM_POSX:
+    case GEO_NODE_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list