Commit: 0d43e832235e1abde3a2acfde2b64006b0549868 Author: Jacques Lucke Date: Tue Jan 17 22:25:47 2023 +0100 Branches: temp-offset-array-ref https://developer.blender.org/rB0d43e832235e1abde3a2acfde2b64006b0549868
initial offset array =================================================================== M source/blender/blenkernel/BKE_curves.hh A source/blender/blenlib/BLI_offset_array_ref.hh M source/blender/geometry/intern/trim_curves.cc M source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc M source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc M source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc =================================================================== diff --git a/source/blender/blenkernel/BKE_curves.hh b/source/blender/blenkernel/BKE_curves.hh index 1ed872c8ab8..1530b2ea7eb 100644 --- a/source/blender/blenkernel/BKE_curves.hh +++ b/source/blender/blenkernel/BKE_curves.hh @@ -18,6 +18,7 @@ #include "BLI_generic_virtual_array.hh" #include "BLI_index_mask.hh" #include "BLI_math_vector_types.hh" +#include "BLI_offset_array_ref.hh" #include "BLI_shared_cache.hh" #include "BLI_span.hh" #include "BLI_task.hh" @@ -176,6 +177,11 @@ class CurvesGeometry : public ::CurvesGeometry { Span<int> offsets() const; MutableSpan<int> offsets_for_write(); + /** + * The offsets of every curve into arrays on the points domain. + */ + OffsetArrayRef<int> points_by_curve() const; + /** * Access a range of indices of point data for a specific curve. */ @@ -884,6 +890,11 @@ inline const std::array<int, CURVE_TYPES_NUM> &CurvesGeometry::curve_type_counts return this->runtime->type_counts; } +inline OffsetArrayRef<int> CurvesGeometry::points_by_curve() const +{ + return OffsetArrayRef<int>({this->curve_offsets, this->curve_num + 1}); +} + inline IndexRange CurvesGeometry::points_for_curve(const int index) const { /* Offsets are not allocated when there are no curves. */ diff --git a/source/blender/blenlib/BLI_offset_array_ref.hh b/source/blender/blenlib/BLI_offset_array_ref.hh new file mode 100644 index 00000000000..39d4386faab --- /dev/null +++ b/source/blender/blenlib/BLI_offset_array_ref.hh @@ -0,0 +1,39 @@ +#pragma once + +#include "BLI_index_range.hh" +#include "BLI_span.hh" + +namespace blender { + +template<typename T> class OffsetArrayRef { + private: + static_assert(std::is_integral_v<T>); + + Span<T> offsets_; + + public: + OffsetArrayRef(const Span<T> offsets) : offsets_(offsets) + { + BLI_assert(std::is_sorted(offsets_.begin(), offsets_.end())); + } + + IndexRange operator[](const int64_t index) const + { + BLI_assert(index >= 0); + BLI_assert(index < offsets_.size() - 1); + const int64_t begin = offsets_[index]; + const int64_t end = offsets_[index + 1]; + const int64_t size = end - begin; + return IndexRange(begin, size); + } + + IndexRange operator[](const IndexRange indices) const + { + const int64_t begin = offsets_[indices.start()]; + const int64_t end = offsets_[indices.one_after_last()]; + const int64_t size = end - begin; + return IndexRange(begin, size); + } +}; + +} // namespace blender diff --git a/source/blender/geometry/intern/trim_curves.cc b/source/blender/geometry/intern/trim_curves.cc index 361415aa540..b4b2b3e7d5f 100644 --- a/source/blender/geometry/intern/trim_curves.cc +++ b/source/blender/geometry/intern/trim_curves.cc @@ -617,11 +617,13 @@ static void trim_polygonal_curves(const bke::CurvesGeometry &src_curves, { const Span<float3> src_positions = src_curves.positions(); MutableSpan<float3> dst_positions = dst_curves.positions_for_write(); + const OffsetArrayRef<int> src_points_by_curve = src_curves.points_by_curve(); + const OffsetArrayRef<int> dst_points_by_curve = dst_curves.points_by_curve(); threading::parallel_for(selection.index_range(), 512, [&](const IndexRange range) { for (const int64_t curve_i : selection.slice(range)) { - const IndexRange src_points = src_curves.points_for_curve(curve_i); - const IndexRange dst_points = dst_curves.points_for_curve(curve_i); + const IndexRange src_points = src_points_by_curve[curve_i]; + const IndexRange dst_points = dst_points_by_curve[curve_i]; sample_interval_linear<float3>(src_positions.slice(src_points), dst_positions, diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc index 9f0d40bb0d7..f63d12e6c03 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_handle_type_selection.cc @@ -55,9 +55,10 @@ static void select_by_handle_type(const bke::CurvesGeometry &curves, VArray<int8_t> curve_types = curves.curve_types(); VArray<int8_t> left = curves.handle_types_left(); VArray<int8_t> right = curves.handle_types_right(); + const OffsetArrayRef<int> points_by_curve = curves.points_by_curve(); for (const int i_curve : curves.curves_range()) { - const IndexRange points = curves.points_for_curve(i_curve); + const IndexRange points = points_by_curve[i_curve]; if (curve_types[i_curve] != CURVE_TYPE_BEZIER) { r_selection.slice(points).fill(false); } diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc index bd7a8c716ae..48dbace2463 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc @@ -315,6 +315,7 @@ class SampleCurveFunction : public mf::MultiFunction { const VArray<int> curve_indices = params.readonly_single_input<int>(0, "Curve Index"); const VArraySpan<float> lengths = params.readonly_single_input<float>(1, "Length"); const VArray<bool> cyclic = curves.cyclic(); + const OffsetArrayRef<int> points_by_curve = curves.points_by_curve(); Array<int> indices; Array<float> factors; @@ -377,7 +378,7 @@ class SampleCurveFunction : public mf::MultiFunction { } } if (!sampled_values.is_empty()) { - const IndexRange points = curves.points_for_curve(curve_i); + const IndexRange points = points_by_curve[curve_i]; src_original_values.reinitialize(points.size()); source_data_->materialize_compressed_to_uninitialized(points, src_original_values.data()); src_evaluated_values.reinitialize(curves.evaluated_points_for_curve(curve_i).size()); diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc index 4ffada76497..944fb52da1a 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_curve_topology_points_of_curve.cc @@ -62,6 +62,7 @@ class PointsOfCurveInput final : public bke::CurvesFieldInput { point_evaluator.add(sort_weight_); point_evaluator.evaluate(); const VArray<float> all_sort_weights = point_evaluator.get_evaluated<float>(0); + const OffsetArrayRef points_by_curve = curves.points_by_curve(); Array<int> point_of_curve(mask.min_array_size()); threading::parallel_for(mask.index_range(), 256, [&](const IndexRange range) { @@ -77,7 +78,7 @@ class PointsOfCurveInput final : public bke::CurvesFieldInput { continue; } - const IndexRange points = curves.points_for_curve(curve_i); + const IndexRange points = points_by_curve[curve_i]; /* Retrieve the weights for each point. */ sort_weights.reinitialize(points.size()); _______________________________________________ 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