11 Eigen::Index samples_per_segment = 32);
13 ~PathOperator()
override { m_shutdown.store(
true, std::memory_order_release); }
18 void initialize(
const std::vector<LineVertex>& vertices);
25 void initialize_paths(
26 const std::vector<std::vector<LineVertex>>& paths,
38 const std::vector<LineVertex>& control_vertices,
39 Kinesis::InterpolationMode mode, uint32_t default_samples_per_segment = 32,
size_t max_control_points = 64,
double tension = 0.5);
54 void add_node(std::shared_ptr<GpuSync::PathGeneratorNode> node);
56 void process(
float dt)
override;
58 [[nodiscard]] std::span<const uint8_t> get_vertex_data()
const override;
59 [[nodiscard]] std::span<const uint8_t> get_vertex_data_for_collection(uint32_t idx)
const override;
61 [[nodiscard]]
size_t get_vertex_count()
const override;
62 [[nodiscard]]
bool is_vertex_data_dirty()
const override;
63 void mark_vertex_data_clean()
override;
69 [[nodiscard]] std::vector<LineVertex> extract_vertices()
const;
71 void set_parameter(std::string_view param,
double value)
override;
72 [[nodiscard]] std::optional<double> query_state(std::string_view query)
const override;
73 [[nodiscard]] std::string_view
get_type_name()
const override {
return "Path"; }
74 [[nodiscard]]
size_t get_point_count()
const override;
81 [[nodiscard]] std::shared_ptr<GpuSync::PathGeneratorNode>
get_path(
size_t i)
const
83 if (i >= m_paths.size()) {
93 void set_samples_per_segment(Eigen::Index samples);
99 void set_tension(
double tension);
105 void set_global_thickness(
float thickness);
111 void set_global_color(
const glm::vec3& color);
122 void* get_data_at(
size_t global_index)
override;
125 std::vector<std::shared_ptr<GpuSync::PathGeneratorNode>>
m_paths;
131 float m_default_thickness { 2.0F };
133 mutable std::atomic<uint32_t> m_access_token { 0 };
134 std::atomic<bool> m_shutdown {
false };