10 : m_init_mode(Kinesis::SpatialDistribution::EMPTY)
16 "Created empty PointCloudNetwork");
21 const glm::vec3& bounds_min,
22 const glm::vec3& bounds_max,
24 : m_num_points(num_points)
25 , m_bounds(bounds_min, bounds_max)
26 , m_init_mode(init_mode)
32 "Created PointCloudNetwork with {} points, bounds [{:.2f}, {:.2f}, {:.2f}] to [{:.2f}, {:.2f}, {:.2f}]",
34 bounds_min.x, bounds_min.y, bounds_min.z,
35 bounds_max.x, bounds_max.y, bounds_max.z);
48 auto topology = std::make_unique<TopologyOperator>();
57 "Initialized PointCloudNetwork: {} points, operator={}",
64 const glm::vec3& bounds_min,
65 const glm::vec3& bounds_max,
68 m_bounds = { .
min = bounds_min, .max = bounds_max };
75 auto topology = std::make_unique<TopologyOperator>();
85 "Cannot set null operator");
89 std::vector<LineVertex> vertices;
92 vertices = old_path->extract_vertices();
94 vertices = old_topo->extract_vertices();
96 vertices = old_field->extract_line_vertices();
103 if (
auto* new_path =
dynamic_cast<PathOperator*
>(op.get())) {
104 new_path->initialize(vertices);
106 new_topo->initialize(vertices);
107 }
else if (
auto* new_field =
dynamic_cast<FieldOperator*
>(op.get())) {
108 new_field->initialize(vertices);
111 "PointCloudNetwork: unsupported operator type '{}'", op->get_type_name());
146 for (
unsigned int frame = 0; frame < num_samples; ++frame) {
151 "PointCloudNetwork processed {} frames with {} operator",
167 return graphics_op->get_point_count();
179 return static_cast<double>(index);
188 metadata[
"bounds_min"] = std::format(
"({:.2f}, {:.2f}, {:.2f})",
190 metadata[
"bounds_max"] = std::format(
"({:.2f}, {:.2f}, {:.2f})",
194 if (
auto connections = topology_op->query_state(
"connection_count")) {
195 metadata[
"connection_count"] = std::to_string(
static_cast<size_t>(*connections));
197 if (
auto topology_count = topology_op->query_state(
"topology_count")) {
198 metadata[
"topology_count"] = std::to_string(
static_cast<size_t>(*topology_count));
203 if (
auto vertex_count = path_op->query_state(
"vertex_count")) {
204 metadata[
"vertex_count"] = std::to_string(
static_cast<size_t>(*vertex_count));
206 if (
auto path_count = path_op->query_state(
"path_count")) {
207 metadata[
"path_count"] = std::to_string(
static_cast<size_t>(*path_count));
227 "No operator to set vertices on; vertices cached but not applied");
231 "Updated PointCloudNetwork vertices: {} points", vertices.size());
238 for (
size_t i = 0; i <
count; ++i) {
239 const float t =
count > 1 ?
static_cast<float>(i) /
static_cast<float>(
count - 1) : 0.0F;
246 "Applied linear color gradient to {} points",
count);
250 const glm::vec3& center_color,
251 const glm::vec3& edge_color,
252 const glm::vec3& center)
256 float max_distance = 0.0F;
258 const float dist = glm::length(v.position - center);
259 max_distance = std::max(max_distance, dist);
262 for (
size_t i = 0; i <
count; ++i) {
264 const float t = max_distance > 0.0F ? dist / max_distance : 0.0F;
271 "Applied radial color gradient to {} points",
count);
278 return topo_op->extract_vertices();
282 return path_op->extract_vertices();
311 topology_op->set_connection_radius(
radius);
314 "set_connection_radius requires TopologyOperator");
321 topology_op->set_parameter(
"k_neighbors",
static_cast<double>(k));
324 "set_k_neighbors requires TopologyOperator");
331 topology_op->set_global_line_thickness(thickness);
333 path_op->set_global_thickness(thickness);
340 topology_op->set_global_line_color(
color);
342 path_op->set_global_color(
color);
349 path_op->set_samples_per_segment(
static_cast<Eigen::Index
>(samples));
352 "set_samples_per_segment requires PathOperator");
359 path_op->set_tension(tension);
362 "set_tension requires PathOperator");
374 double value = mapping.broadcast_source->get_last_output();
375 m_operator->set_parameter(mapping.param_name, value);
378 m_operator->apply_one_to_one(mapping.param_name, mapping.network_source);
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_RT_TRACE(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
std::optional< glm::vec3 > color
Pure field-driven vertex manipulation via Tendency evaluation.
Operator that produces GPU-renderable geometry.
std::vector< ParameterMapping > m_parameter_mappings
virtual void set_topology(Topology topology)
Set the network's topology.
bool is_enabled() const
Check if network is enabled.
virtual std::unordered_map< std::string, std::string > get_metadata() const
Get network metadata for debugging/visualization.
void set_output_mode(OutputMode mode)
Set the network's output routing mode.
size_t get_node_count() const override
Get the number of nodes in the network.
void apply_radial_gradient(const glm::vec3 ¢er_color, const glm::vec3 &edge_color, const glm::vec3 ¢er=glm::vec3(0.0F))
Apply radial color gradient from center.
Kinesis::SpatialDistribution m_init_mode
void update_mapped_parameters()
Update mapped parameters before path/topology processing.
void set_topology(Topology topology) override
Set the network's topology.
std::unique_ptr< NetworkOperator > m_operator
void set_operator(std::unique_ptr< NetworkOperator > op)
void apply_color_gradient(const glm::vec3 &start_color, const glm::vec3 &end_color)
Set colors for all points.
void process_batch(unsigned int num_samples) override
Process the network for the given number of samples.
PointCloudNetwork()
Create empty point cloud network.
void set_line_thickness(float thickness)
Set line thickness for topology/path rendering.
Kinesis::SamplerBounds m_bounds
void set_connection_radius(float radius)
Set connection radius for topology generation (TopologyOperator only)
std::vector< LineVertex > generate_initial_positions()
void set_vertices(const std::vector< LineVertex > &vertices)
Set all point vertices.
std::vector< LineVertex > get_vertices() const
Get all point vertices.
void set_k_neighbors(size_t k)
Set K value for K-nearest neighbors (TopologyOperator only)
std::unordered_map< std::string, std::string > get_metadata() const override
Get network metadata for debugging/visualization.
Kinesis::Stochastic::Stochastic m_random_gen
void reinitialize(size_t count, const glm::vec3 &bounds_min, const glm::vec3 &bounds_max, Kinesis::SpatialDistribution mode)
Reinitialize point cloud with new parameters.
void set_samples_per_segment(size_t samples)
Set samples per segment for path interpolation (PathOperator only)
void reset() override
Reset network to initial state.
std::optional< double > get_node_output(size_t index) const override
Get output of specific internal node (for ONE_TO_ONE mapping)
void set_line_color(const glm::vec3 &color)
Set global line color for topology/path rendering.
void update_vertex(size_t index, const LineVertex &vertex)
Update single vertex completely.
void initialize() override
Called once before first process_batch()
std::vector< LineVertex > m_cached_vertices
void set_tension(double tension)
Set tension for Catmull-Rom interpolation (PathOperator only)
@ NodeProcessing
Node graph processing (Nodes::NodeGraphManager)
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.
std::vector< Nodes::LineVertex > to_line_vertices(std::span< const SampleResult > samples, glm::vec2 thickness_range)
Batch-project SampleResult vector to LineVertex.
SpatialDistribution
Spatial distribution mode for point cloud and particle generation.
std::vector< SampleResult > generate_samples(SpatialDistribution dist, size_t count, const SamplerBounds &bounds, Stochastic::Stochastic &rng)
Generate a batch of spatially distributed samples.
Topology
Defines the structural relationships between nodes in the network.
@ INDEPENDENT
No connections, nodes process independently.
@ ONE_TO_ONE
Node array/network → network nodes (must match count)
@ BROADCAST
One node → all network nodes.
@ GRAPHICS_BIND
State available for visualization (read-only)
Vertex type for line primitives (LINE_LIST / LINE_STRIP topology)