[Bf-blender-cvs] [379f116a2ac] temp-geometry-nodes-curve-deform-node: Merge branch 'master' into temp-geometry-nodes-curve-deform-node

Hans Goudey noreply at git.blender.org
Fri Jun 25 05:19:06 CEST 2021


Commit: 379f116a2ac929883d29519b41c1e63cffe6e591
Author: Hans Goudey
Date:   Wed Jun 23 22:55:01 2021 -0500
Branches: temp-geometry-nodes-curve-deform-node
https://developer.blender.org/rB379f116a2ac929883d29519b41c1e63cffe6e591

Merge branch 'master' into temp-geometry-nodes-curve-deform-node

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



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

diff --cc release/scripts/startup/nodeitems_builtins.py
index 9db2670d7c0,e7d991622e8..005e282fc0f
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@@ -501,11 -501,13 +501,14 @@@ geometry_node_categories = 
          NodeItem("ShaderNodeCombineRGB"),
      ]),
      GeometryNodeCategory("GEO_CURVE", "Curve", items=[
+         NodeItem("GeometryNodeCurveSubdivide"),
          NodeItem("GeometryNodeCurveToMesh"),
          NodeItem("GeometryNodeCurveResample"),
 +        NodeItem("GeometryNodeCurveDeform"),
          NodeItem("GeometryNodeMeshToCurve"),
+         NodeItem("GeometryNodeCurveToPoints"),
          NodeItem("GeometryNodeCurveLength"),
+         NodeItem("GeometryNodeCurveReverse"),
      ]),
      GeometryNodeCategory("GEO_GEOMETRY", "Geometry", items=[
          NodeItem("GeometryNodeBoundBox"),
diff --cc source/blender/blenkernel/BKE_node.h
index 5fa7d2b2a95,a0f6be6b3e9..87140964ccb
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@@ -1434,7 -1434,11 +1434,12 @@@ int ntreeTexExecTree(struct bNodeTree *
  #define GEO_NODE_CURVE_LENGTH 1054
  #define GEO_NODE_SELECT_BY_MATERIAL 1055
  #define GEO_NODE_CONVEX_HULL 1056
- #define GEO_NODE_CURVE_DEFORM 1057
+ #define GEO_NODE_CURVE_TO_POINTS 1057
+ #define GEO_NODE_CURVE_REVERSE 1058
+ #define GEO_NODE_SEPARATE_COMPONENTS 1059
+ #define GEO_NODE_CURVE_SUBDIVIDE 1060
+ #define GEO_NODE_RAYCAST 1061
++#define GEO_NODE_CURVE_DEFORM 1062
  
  /** \} */
  
diff --cc source/blender/blenkernel/BKE_spline.hh
index 60a9b9bb89a,24b5a78e598..8b8de115330
--- a/source/blender/blenkernel/BKE_spline.hh
+++ b/source/blender/blenkernel/BKE_spline.hh
@@@ -170,22 -167,19 +169,22 @@@ 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;
 +
    LookupResult lookup_data_from_index_factor(const float index_factor) const;
  
-   void sample_based_on_index_factors(const blender::fn::GVArray &src,
-                                      blender::Span<float> index_factors,
-                                      blender::fn::GMutableSpan dst) const;
+   void sample_with_index_factors(const blender::fn::GVArray &src,
+                                  blender::Span<float> index_factors,
+                                  blender::fn::GMutableSpan dst) const;
    template<typename T>
-   void sample_based_on_index_factors(const blender::VArray<T> &src,
-                                      blender::Span<float> index_factors,
-                                      blender::MutableSpan<T> dst) const
+   void sample_with_index_factors(const blender::VArray<T> &src,
+                                  blender::Span<float> index_factors,
+                                  blender::MutableSpan<T> dst) const
    {
-     this->sample_based_on_index_factors(
+     this->sample_with_index_factors(
          blender::fn::GVArray_For_VArray(src), index_factors, blender::fn::GMutableSpan(dst));
    }
    template<typename T>
diff --cc source/blender/blenkernel/intern/node.cc
index a3eb55d8c4a,db18cecb5d3..4e0e784a5b8
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@@ -5055,10 -5053,12 +5053,13 @@@ static void registerGeometryNodes(
    register_node_type_geo_bounding_box();
    register_node_type_geo_collection_info();
    register_node_type_geo_convex_hull();
 +  register_node_type_geo_curve_deform();
    register_node_type_geo_curve_length();
    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();
    register_node_type_geo_delete_geometry();
    register_node_type_geo_edge_split();
    register_node_type_geo_input_material();
diff --cc source/blender/blenkernel/intern/spline_base.cc
index 8956ba6adae,aa0d95d4d61..584156ea40f
--- a/source/blender/blenkernel/intern/spline_base.cc
+++ b/source/blender/blenkernel/intern/spline_base.cc
@@@ -331,67 -463,20 +475,67 @@@ Array<float> Spline::sample_uniform_ind
    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);
 +  for (const int i : IndexRange(1, data.size() - 1)) {
 +    BLI_assert(data[i] >= data[i - 1]);
 +  }
 +  BLI_assert(data.last() <= max);
 +}
 +#endif
 +
 +/**
 + * Transform an array of sorted length parameters into index factors. The result is indices
 + * and factors to the next index, encoded in floats. The logic for converting from the float
 + * values to interpolation data is in #lookup_data_from_index_factor.
 + *
 + * \param parameters: Lengths along the spline to be transformed into index factors
 + * (to save another allocation). Must be between zero and the total length of the spline.
 + *
 + * \note The implementation is similar to #sample_uniform_index_factors(), though
 + * the two loops are inverted, and obviously custom parameters are provided.
 + */
 +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). */
 +  float prev_length = 0.0f;
 +  int i_evaluated = 0;
 +  for (const int i_sample : parameters.index_range()) {
 +    const float sample_length = parameters[i_sample];
 +
 +    /* Skip over every evaluated point that fits before this sample. */
 +    while (lengths[i_evaluated] < sample_length) {
 +      prev_length = lengths[i_evaluated];
 +      i_evaluated++;
 +    }
 +
 +    const float factor = (sample_length - prev_length) / (lengths[i_evaluated] - prev_length);
 +    parameters[i_sample] = i_evaluated + factor;
 +  }
 +}
 +
  Spline::LookupResult Spline::lookup_data_from_index_factor(const float index_factor) const
  {
-   const int points_len = this->evaluated_points_size();
+   const int eval_size = this->evaluated_points_size();
  
    if (is_cyclic_) {
-     if (index_factor < points_len) {
+     if (index_factor < eval_size) {
        const int index = std::floor(index_factor);
-       const int next_index = (index < points_len - 1) ? index + 1 : 0;
+       const int next_index = (index < eval_size - 1) ? index + 1 : 0;
        return LookupResult{index, next_index, index_factor - index};
      }
-     return LookupResult{points_len - 1, 0, 1.0f};
+     return LookupResult{eval_size - 1, 0, 1.0f};
    }
  
-   if (index_factor < points_len - 1) {
+   if (index_factor < eval_size - 1) {
      const int index = std::floor(index_factor);
      const int next_index = index + 1;
      return LookupResult{index, next_index, index_factor - index};
diff --cc source/blender/makesdna/DNA_node_types.h
index 6c1a141448f,12625d3408d..186d5cc9884
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@@ -1362,11 -1362,16 +1362,21 @@@ typedef struct NodeGeometryCurveResampl
    uint8_t mode;
  } NodeGeometryCurveResample;
  
 +typedef struct NodeGeometryCurveDeform {
 +  /* GeometryNodeCurveDeformAxis. */
 +  uint8_t axis;
 +} NodeGeometryCurveDeform;
 +
+ typedef struct NodeGeometryCurveSubdivide {
+   /* GeometryNodeAttributeInputMode (integer or attribute). */
+   uint8_t cuts_type;
+ } NodeGeometryCurveSubdivide;
+ 
+ typedef struct NodeGeometryCurveToPoints {
+   /* GeometryNodeCurveSampleMode. */
+   uint8_t mode;
+ } NodeGeometryCurveToPoints;
+ 
  typedef struct NodeGeometryAttributeTransfer {
    /* AttributeDomain. */
    int8_t domain;
@@@ -1885,15 -1900,11 +1905,20 @@@ typedef enum GeometryNodeAttributeTrans
    GEO_NODE_ATTRIBUTE_TRANSFER_NEAREST = 1,
  } GeometryNodeAttributeTransferMapMode;
  
 +typedef enum GeometryNodeCurveDeformAxis {
 +  GEO_NODE_CURVE_DEFORM_POSX = 0,
 +  GEO_NODE_CURVE_DEFORM_POSY = 1,
 +  GEO_NODE_CURVE_DEFORM_POSZ = 2,
 +  GEO_NODE_CURVE_DEFORM_NEGX = 3,
 +  GEO_NODE_CURVE_DEFORM_NEGY = 4,
 +  GEO_NODE_CURVE_DEFORM_NEGZ = 5,
 +} GeometryNodeCurveDeformAxis;
 +
+ typedef enum GeometryNodeRaycastMapMode {
+   GEO_NODE_RAYCAST_INTERPOLATED = 0,
+   GEO_NODE_RAYCAST_NEAREST = 1,
+ } GeometryNodeRaycastMapMode;
+ 
  #ifdef __cplusplus
  }
  #endif
diff --cc source/blender/makesrna/intern/rna_nodetree.c
index 1a0a6a9514d,c26e9e883d6..e27c3e6dada
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@@ -9842,28 -9859,50 +9859,72 @@@ static void def_geo_curve_resample(Stru
    RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
  }
  
 +static void def_geo_curve_deform(StructRNA *srna)
 +{
 +  PropertyRNA *prop;
 +
 +  static const EnumPropertyItem axis_items[] = {
 +      {GEO_NODE_CURVE_DEFORM_POSX, "POS_X", 0, "X", ""},
 +      {GEO_NODE_CURVE_DEFORM_POSY, "POS_Y", 0, "Y", ""},
 +      {GEO_NODE_CURVE_DEFORM_POSZ, "POS_Z", 0, "Z", ""},
 +      {GEO_NODE_CURVE_DEFORM_NEGX, "NEG_X", 0, "-X", ""},
 +      {GEO_NODE_CURVE_DEFORM_NEGY, "NEG_Y", 0, "-Y", ""},
 +      {GEO_NODE_CURVE_DEFORM_NEGZ, "NEG_Z", 0, "-Z", ""},
 +      {0, NULL, 0, NULL, NULL},
 +  };
 +
 +  RNA_def_struct_sdna_from(srna, "NodeGeometryCurveDeform", "storage");
 +
 +  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");
 +}
 +
+ static void def_geo_curve_subdivide(StructRNA *srna)
+ {
+   PropertyRNA *prop;
+ 
+   RNA_def_struct_sdna_from(srna, "NodeGeometryCurveSubdivide", "storage");
+ 
+   prop = RNA_def_p

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list