Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc')
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc62
1 files changed, 2 insertions, 60 deletions
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc
index 2cb75eda202..32bcbe2c608 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_reverse.cc
@@ -29,31 +29,6 @@ static void geo_node_curve_reverse_declare(NodeDeclarationBuilder &b)
b.add_output<decl::Geometry>("Curve");
}
-/**
- * Reverse the data in a MutableSpan object.
- */
-template<typename T> static void reverse_data(MutableSpan<T> r_data)
-{
- const int size = r_data.size();
- for (const int i : IndexRange(size / 2)) {
- std::swap(r_data[size - 1 - i], r_data[i]);
- }
-}
-
-/**
- * Reverse and Swap the data between 2 MutableSpans.
- */
-template<typename T> static void reverse_data(MutableSpan<T> left, MutableSpan<T> right)
-{
- BLI_assert(left.size() == right.size());
- const int size = left.size();
-
- for (const int i : IndexRange(size / 2 + size % 2)) {
- std::swap(left[i], right[size - 1 - i]);
- std::swap(right[i], left[size - 1 - i]);
- }
-}
-
static void geo_node_curve_reverse_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Curve");
@@ -74,42 +49,9 @@ static void geo_node_curve_reverse_exec(GeoNodeExecParams params)
threading::parallel_for(splines.index_range(), 128, [&](IndexRange range) {
for (const int i : range) {
- if (!selection[i]) {
- continue;
- }
-
- reverse_data<float3>(splines[i]->positions());
- reverse_data<float>(splines[i]->radii());
- reverse_data<float>(splines[i]->tilts());
-
- splines[i]->attributes.foreach_attribute(
- [&](const AttributeIDRef &attribute_id, const AttributeMetaData &meta_data) {
- std::optional<blender::fn::GMutableSpan> output_attribute =
- splines[i]->attributes.get_for_write(attribute_id);
- if (!output_attribute) {
- BLI_assert_unreachable();
- return false;
- }
- attribute_math::convert_to_static_type(meta_data.data_type, [&](auto dummy) {
- using T = decltype(dummy);
- reverse_data(output_attribute->typed<T>());
- });
- return true;
- },
- ATTR_DOMAIN_POINT);
-
- /* Deal with extra info on derived types. */
- if (BezierSpline *spline = dynamic_cast<BezierSpline *>(splines[i].get())) {
- reverse_data<BezierSpline::HandleType>(spline->handle_types_left());
- reverse_data<BezierSpline::HandleType>(spline->handle_types_right());
- reverse_data<float3>(spline->handle_positions_left(), spline->handle_positions_right());
+ if (selection[i]) {
+ splines[i]->reverse();
}
- else if (NURBSpline *spline = dynamic_cast<NURBSpline *>(splines[i].get())) {
- reverse_data<float>(spline->weights());
- }
- /* Nothing to do for poly splines. */
-
- splines[i]->mark_cache_invalid();
}
});