[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