[Bf-blender-cvs] [36ea32a3f03] temp-geometry-nodes-curve-sample: Basic structure is funcitonal, needs polishing and additional options (may crash)

Hans Goudey noreply at git.blender.org
Thu Jul 15 14:25:28 CEST 2021


Commit: 36ea32a3f03164b89db12d8d1f1ce6b8ec8d25a7
Author: Hans Goudey
Date:   Thu Jul 15 08:25:20 2021 -0400
Branches: temp-geometry-nodes-curve-sample
https://developer.blender.org/rB36ea32a3f03164b89db12d8d1f1ce6b8ec8d25a7

Basic structure is funcitonal, needs polishing and additional options (may crash)

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_geometry_set.hh
M	source/blender/blenkernel/BKE_spline.hh
M	source/blender/blenkernel/intern/node.cc
M	source/blender/blenkernel/intern/spline_base.cc
M	source/blender/nodes/CMakeLists.txt
M	source/blender/nodes/NOD_geometry.h
M	source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index d617cfab988..783a55c6500 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -504,6 +504,7 @@ geometry_node_categories = [
         NodeItem("GeometryNodeCurveSubdivide"),
         NodeItem("GeometryNodeCurveToMesh"),
         NodeItem("GeometryNodeCurveResample"),
+        NodeItem("GeometryNodeCurveSample"),
         NodeItem("GeometryNodeMeshToCurve"),
         NodeItem("GeometryNodeCurveToPoints"),
         NodeItem("GeometryNodeCurveEndpoints"),
diff --git a/source/blender/blenkernel/BKE_geometry_set.hh b/source/blender/blenkernel/BKE_geometry_set.hh
index c79977752c9..77e827bf6f2 100644
--- a/source/blender/blenkernel/BKE_geometry_set.hh
+++ b/source/blender/blenkernel/BKE_geometry_set.hh
@@ -180,18 +180,6 @@ class GeometryComponent {
     return blender::fn::GVArray_Typed<T>(std::move(varray));
   }
 
-  /* Should be used instead of the method above when the requested data type is known at compile
-   * time for better type safety. */
-  template<typename T>
-  blender::fn::GVArray_Typed<T> attribute_get_for_read(const blender::StringRef attribute_name,
-                                                       const T &default_value) const
-  {
-    const blender::fn::CPPType &cpp_type = blender::fn::CPPType::get<T>();
-    const CustomDataType type = blender::bke::cpp_type_to_custom_data_type(cpp_type);
-    std::unique_ptr varray = this->attribute_get_for_read(attribute_name, type, &default_value);
-    return blender::fn::GVArray_Typed<T>(std::move(varray));
-  }
-
   /**
    * Returns an "output attribute", which is essentially a mutable virtual array with some commonly
    * used convince features. The returned output attribute might be empty if requested attribute
diff --git a/source/blender/blenkernel/BKE_spline.hh b/source/blender/blenkernel/BKE_spline.hh
index f1c66de7773..176e44b3245 100644
--- a/source/blender/blenkernel/BKE_spline.hh
+++ b/source/blender/blenkernel/BKE_spline.hh
@@ -56,7 +56,7 @@ using SplinePtr = std::unique_ptr<Spline>;
  *     along the length of a curve.
  *  3. #sample_uniform_index_factors returns an array that stores uniform-length samples
  *     along the spline which can be used to interpolate data from method 1.
- *  4. #sample_length_parameters_to_index_factors does the same, but uses arbitrary parameter
+ *  4. #sample_lengths_to_index_factors does the same, but uses arbitrary parameter
  *     inputs, instead of sampling uniformly.
  *
  * Commonly used evaluated data is stored in caches on the spline itself so that operations on
@@ -172,13 +172,16 @@ class Spline {
   LookupResult lookup_evaluated_length(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;
+  blender::Array<float> sample_lengths_to_index_factors(blender::Span<float> parameters) const;
 
   LookupResult lookup_data_from_index_factor(const float index_factor) const;
 
   void sample_with_index_factors(const blender::fn::GVArray &src,
                                  blender::Span<float> index_factors,
                                  blender::fn::GMutableSpan dst) const;
+  void sample_with_index_factors(blender::fn::GSpan src,
+                                 blender::Span<float> index_factors,
+                                 blender::fn::GMutableSpan dst) const;
   template<typename T>
   void sample_with_index_factors(const blender::VArray<T> &src,
                                  blender::Span<float> index_factors,
@@ -209,8 +212,6 @@ class Spline {
     return blender::fn::GVArray_Typed<T>(this->interpolate_to_evaluated(blender::fn::GSpan(data)));
   }
 
-  blender::fn::GVArrayPtr get_evaluated_attribute(const blender::StringRef name) const;
-
  protected:
   virtual void correct_end_tangents() const = 0;
   virtual void copy_settings(Spline &dst) const = 0;
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 715c2fa91d2..cc71151c1b0 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5116,8 +5116,6 @@ static void registerGeometryNodes()
   register_node_type_geo_curve_primitive_spiral();
   register_node_type_geo_curve_primitive_star();
   register_node_type_geo_curve_sample();
-  register_node_type_geo_curve_to_mesh();
-  register_node_type_geo_curve_to_points();
   register_node_type_geo_curve_resample();
   register_node_type_geo_curve_reverse();
   register_node_type_geo_curve_subdivide();
diff --git a/source/blender/blenkernel/intern/spline_base.cc b/source/blender/blenkernel/intern/spline_base.cc
index e5e2fd7e87e..87d8825ad90 100644
--- a/source/blender/blenkernel/intern/spline_base.cc
+++ b/source/blender/blenkernel/intern/spline_base.cc
@@ -484,14 +484,19 @@ static void assert_sorted_array_in_range(Span<float> data, const float min, cons
  *
  * \note The implementation is similar to #sample_uniform_index_factors(), though
  * the two loops are inverted, and obviously custom parameters are provided.
+ *
+ * \note This could have a result data argument instead of returning a span in the future.
  */
-void Spline::sample_length_parameters_to_index_factors(MutableSpan<float> parameters) const
+Array<float> Spline::sample_lengths_to_index_factors(const Span<float> parameters) const
 {
   const Span<float> lengths = this->evaluated_lengths();
+  const float total_length = this->length();
 #ifdef DEBUG
-  assert_sorted_array_in_range(parameters, 0.0f, this->length());
+  // assert_sorted_array_in_range(parameters, 0.0f, this->length());
 #endif
 
+  Array<float> index_factors(parameters.size());
+
   /* 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). */
   float prev_length = 0.0f;
@@ -506,8 +511,10 @@ void Spline::sample_length_parameters_to_index_factors(MutableSpan<float> parame
     }
 
     const float factor = (sample_length - prev_length) / (lengths[i_evaluated] - prev_length);
-    parameters[i_sample] = i_evaluated + factor;
+    index_factors[i_sample] = i_evaluated + factor;
   }
+
+  return index_factors;
 }
 
 Spline::LookupResult Spline::lookup_data_from_index_factor(const float index_factor) const
@@ -544,6 +551,13 @@ GVArrayPtr Spline::interpolate_to_evaluated(GSpan data) const
   return this->interpolate_to_evaluated(GVArray_For_GSpan(data));
 }
 
+void Spline::sample_with_index_factors(GSpan src,
+                                       Span<float> index_factors,
+                                       GMutableSpan dst) const
+{
+  return this->sample_with_index_factors(GVArray_For_GSpan(src), index_factors, dst);
+}
+
 /**
  * Sample any input data with a value for each evaluated point (already interpolated to evaluated
  * points) to arbitrary parameters in between the evaluated points. The interpolation is quite
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 09085ac8799..e9ce823967e 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -174,8 +174,6 @@ set(SRC
   geometry/nodes/node_geo_curve_primitive_spiral.cc
   geometry/nodes/node_geo_curve_primitive_star.cc
   geometry/nodes/node_geo_curve_sample.cc
-  geometry/nodes/node_geo_curve_to_mesh.cc
-  geometry/nodes/node_geo_curve_to_points.cc
   geometry/nodes/node_geo_curve_resample.cc
   geometry/nodes/node_geo_curve_reverse.cc
   geometry/nodes/node_geo_curve_subdivide.cc
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index 8a2b77118e5..73e711eb401 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -61,8 +61,6 @@ void register_node_type_geo_curve_primitive_quadrilateral(void);
 void register_node_type_geo_curve_primitive_spiral(void);
 void register_node_type_geo_curve_primitive_star(void);
 void register_node_type_geo_curve_sample(void);
-void register_node_type_geo_curve_to_mesh(void);
-void register_node_type_geo_curve_to_points(void);
 void register_node_type_geo_curve_resample(void);
 void register_node_type_geo_curve_reverse(void);
 void register_node_type_geo_curve_subdivide(void);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc
index 5e8094169d7..d7f8bdd6bc4 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc
@@ -30,26 +30,29 @@ using blender::fn::GVArray_For_GSpan;
 using blender::fn::GVArray_For_Span;
 using blender::fn::GVArray_Typed;
 
-static bNodeSocketTemplate geo_node_curve_resample_in[] = {
+static bNodeSocketTemplate geo_node_curve_sample_in[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
     {SOCK_STRING, N_("Parameter")},
     {SOCK_GEOMETRY, N_("Curve")},
-    {SOCK_GEOMETRY, N_("Attribute")},
-    {SOCK_GEOMETRY, N_("Result")},
+    {SOCK_STRING, N_("Position")},
+    {SOCK_STRING, N_("Tangent")},
+    {SOCK_STRING, N_("Normal")},
+    {SOCK_STRING, N_("Attribute")},
+    {SOCK_STRING, N_("Result")},
     {-1, ""},
 };
 
-static bNodeSocketTemplate geo_node_curve_resample_out[] = {
+static bNodeSocketTemplate geo_node_curve_sample_out[] = {
     {SOCK_GEOMETRY, N_("Geometry")},
     {-1, ""},
 };
 
-static void geo_node_curve_resample_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
+static void geo_node_curve_sample_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 {
   uiItemR(layout, ptr, "mode", UI_ITEM_R_EXPAND, nullptr, ICON_NONE);
 }
 
-static void geo_node_curve_resample_init(bNodeTree *UNUSED(tree), bNode *node)
+static void geo_node_curve_sample_init(bNodeTree *UNUSED(tree), bNode *node)
 {
   NodeGeometryCurveSample *data = (NodeGeometryCurveSample *)MEM_callocN(
       sizeof(NodeGeometryCurveSample), __func__);
@@ -58,7 +61,7 @@ static void geo_node_curve_resample_init(bNodeTree *UNUSED(tree), bNode *node)
   n

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list