[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