11 : m_default_mode(mode)
14 "TopologyOperator created with mode {}",
static_cast<int>(mode));
23 if (vertices.empty()) {
25 "Cannot initialize topology with zero vertices");
33 "TopologyOperator initialized with {} points in 1 topology",
42 const std::vector<std::vector<LineVertex>>& topologies,
45 for (
const auto& topo : topologies) {
50 "TopologyOperator initialized with {} topologies",
55 const std::vector<LineVertex>& vertices,
58 if (vertices.empty()) {
60 "Cannot add topology with zero vertices");
64 auto topology = std::make_shared<GpuSync::TopologyGeneratorNode>(mode,
true, 1024);
66 topology->set_points(vertices);
67 topology->compute_frame();
69 uint32_t expected = 0;
71 std::memory_order_acquire, std::memory_order_relaxed)) {
72 if (
m_shutdown.load(std::memory_order_relaxed))
82 "Added topology #{} with {} points, {} connections",
93 uint32_t expected = 0;
95 std::memory_order_acquire, std::memory_order_relaxed)) {
96 if (
m_shutdown.load(std::memory_order_relaxed))
102 topology->compute_frame();
114 std::vector<LineVertex> positions;
117 auto points = topology->get_points();
118 for (
const auto& pt :
points) {
119 positions.push_back(pt);
138 auto span = group->get_vertex_data();
141 span.begin(), span.end());
157 auto layout = *layout_opt;
166 total += topology->get_vertex_count();
173 return std::ranges::any_of(
175 [](
const auto& group) {
return group->needs_gpu_update(); });
181 topology->mark_vertex_data_dirty(
false);
187 std::vector<DirtyVertexRange> ranges;
192 const auto count =
static_cast<uint32_t
>(topology->get_vertex_count());
193 if (topology->needs_gpu_update()) {
197 .vertex_count =
count });
210 total += topology->get_point_count();
224 uint32_t cluster = 0;
226 const size_t count = topology->get_vertex_count();
227 for (
size_t i = 0; i <
count &&
offset + i < ids.size(); ++i) {
228 ids[
offset + i] = cluster;
243 if (param ==
"connection_radius") {
245 topology->set_connection_radius(
static_cast<float>(
value));
247 }
else if (param ==
"k_neighbors") {
249 topology->set_k_neighbors(
static_cast<size_t>(
value));
251 }
else if (param ==
"line_thickness") {
261 if (query ==
"point_count") {
265 if (query ==
"connection_count") {
266 size_t total_connections = 0;
268 total_connections += topology->get_connection_count();
270 return static_cast<double>(total_connections);
273 if (query ==
"topology_count") {
286 topology->set_connection_radius(
radius);
294 topology->set_line_thickness(thickness);
301 topology->set_line_color(color);
308 topology->set_samples_per_segment(samples);
317 size_t local_index = global_index -
offset;
318 return &group->get_points()[local_index];
320 offset += group->get_point_count();
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
std::vector< glm::vec2 > * points
void * get_data_at(size_t global_index) override
Get mutable access to point at global index.
void set_samples_per_segment(size_t samples)
Set number of samples per segment for interpolation for all topologies.
std::vector< uint32_t > build_cluster_ids() const override
Overrides GraphicsOperator::build_cluster_ids() for real multi-topology scenes.
std::atomic< uint32_t > m_access_token
void add_topology(const std::vector< LineVertex > &vertices, Kinesis::ProximityMode mode)
Add a single topology with full per-vertex control.
std::span< const uint8_t > get_vertex_data_for_collection(uint32_t idx) const override
Get vertex data for specific collection (if multiple)
void initialize(const std::vector< LineVertex > &vertices)
Initialize a single topology with single set of vertices.
void process(float dt) override
Process for one batch cycle.
bool is_vertex_data_dirty() const override
Check if geometry changed this frame.
void set_parameter(std::string_view param, double value) override
Set operator parameter.
float m_default_thickness
void set_connection_radius(float radius)
Set the connection radius for topology generation.
size_t get_vertex_count() const override
Get number of vertices (may differ from point count for topology/path)
std::vector< LineVertex > extract_vertices() const
Extract current vertex data as LineVertex array.
std::vector< uint8_t > m_vertex_data_aggregate
void set_global_line_color(const glm::vec3 &color)
Set the line color for all topologies.
Kakshya::VertexLayout get_vertex_layout() const override
Get vertex layout describing vertex structure.
std::vector< DirtyVertexRange > dirty_vertex_ranges() const override
One DirtyVertexRange per topology whose TopologyGeneratorNode needs a GPU update, so add_topology() o...
std::vector< std::shared_ptr< GpuSync::TopologyGeneratorNode > > m_topologies
std::span< const uint8_t > get_vertex_data() const override
Get vertex data for GPU upload.
void set_global_line_thickness(float thickness)
Set the number of neighbors (k) for K-Nearest topology mode.
Kinesis::ProximityMode m_default_mode
void mark_vertex_data_clean() override
Clear dirty flag after GPU upload.
size_t get_point_count() const override
Get source point count (before topology expansion)
void initialize_topologies(const std::vector< std::vector< LineVertex > > &topologies, Kinesis::ProximityMode mode)
Initialize multiple topologies with given positions and properties.
std::optional< double > query_state(std::string_view query) const override
Query operator internal state.
TopologyOperator(Kinesis::ProximityMode mode=Kinesis::ProximityMode::K_NEAREST)
std::atomic< bool > m_shutdown
@ NodeProcessing
Node graph processing (Nodes::NodeGraphManager)
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.
uint32_t vertex_count
Total number of vertices in this buffer.
Complete description of vertex data layout in a buffer.
A contiguous span of vertex records that changed since the last mark_vertex_data_clean().