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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs