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);
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))
136 auto span = group->get_vertex_data();
139 span.begin(), span.end());
155 auto layout = *layout_opt;
179 return std::ranges::any_of(
181 [](
const auto& group) {
return group->needs_gpu_update(); });
193 std::vector<DirtyVertexRange> ranges;
198 const auto count =
static_cast<uint32_t
>(
topology->get_vertex_count());
203 .vertex_count =
count });
214 std::vector<DrawRun> runs;
218 const auto count =
static_cast<uint32_t
>(tp->get_vertex_count());
219 const auto topo = tp->get_primitive_topology();
221 if (!runs.empty() && runs.back().topology == topo && is_concatenable_topology(topo)) {
222 runs.back().vertex_count +=
count;
251 uint32_t cluster = 0;
270 if (param ==
"connection_radius") {
274 }
else if (param ==
"k_neighbors") {
278 }
else if (param ==
"line_thickness") {
287 if (query ==
"point_count") {
291 if (query ==
"connection_count") {
292 size_t total_connections = 0;
294 total_connections +=
topology->get_connection_count();
296 return static_cast<double>(total_connections);
299 if (query ==
"topology_count") {
319 topology->set_line_thickness(thickness);
333 topology->set_samples_per_segment(samples);
344 uint32_t expected = 0;
346 std::memory_order_acquire, std::memory_order_relaxed)) {
347 if (
m_shutdown.load(std::memory_order_relaxed))
352 auto first = vertices.begin();
354 const auto count =
static_cast<std::ptrdiff_t
>(
topology->get_point_count());
355 topology->set_points(std::vector<LineVertex>(first, first +
count));
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
std::vector< glm::vec2 > * points
std::vector< uint64_t > ids
std::vector< glm::vec3 > positions
PrimitiveTopology topology
void * get_data_at(size_t global_index) override
Get mutable access to point at global index.
void set_vertices(const std::vector< LineVertex > &vertices)
Replace every point, in extract_vertices() order, keeping the topologies.
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.
std::optional< Portal::Graphics::PrimitiveTopology > declared_topology() const override
Forwards to the first topology's own get_primitive_topology().
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.
std::vector< DrawRun > topology_runs() const override
Coalesces adjacent topology graphs sharing a concatenable topology into one run.
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().
PrimitiveTopology topology
One contiguous span of vertices sharing a primitive topology.