8 float distance_squared(
const glm::vec3&
a,
const glm::vec3&
b)
10 glm::vec3 diff =
b -
a;
11 return glm::dot(diff, diff);
21 , m_points(max_points)
22 , m_auto_connect(auto_connect)
28 layout.vertex_count = 0;
35 "Created TopologyGeneratorNode with mode {}, auto_connect={}, capacity={}",
36 static_cast<int>(mode), auto_connect, max_points);
44 , m_mode(Kinesis::ProximityMode::CUSTOM)
45 , m_custom_func(
std::move(custom_func))
46 , m_points(max_points)
47 , m_auto_connect(auto_connect)
53 layout.vertex_count = 0;
60 "Created TopologyGeneratorNode with custom function");
78 "Point index {} out of range", index);
82 auto view =
m_points.linearized_view();
83 std::vector<LineVertex> temp_points(view.begin(), view.end());
84 temp_points.erase(temp_points.begin() +
static_cast<uint32_t
>(index));
87 for (
const auto& pt : temp_points) {
102 "Point index {} out of range", index);
118 for (
const auto& pt : points) {
217 "Point index {} out of range", index);
219 return default_point;
227 auto view =
m_points.linearized_view();
228 return { view.begin(), view.end() };
256 size_t num_points = points.size();
277#ifdef MAYAFLUX_PLATFORM_MACOS
278 std::vector<LineVertex> expanded = expand_lines_to_triangles(
m_vertices);
279 set_vertices<LineVertex>(std::span { expanded.data(), expanded.size() });
282 layout->vertex_count =
static_cast<uint32_t
>(expanded.size());
288 layout->vertex_count =
static_cast<uint32_t
>(
m_vertices.size());
294 std::span<LineVertex> points,
297 Eigen::MatrixXd control_points(3, num_points);
298 for (Eigen::Index i = 0; i < num_points; ++i) {
299 control_points.col(i) << points[i].position.x,
300 points[i].position.y,
301 points[i].position.z;
304 size_t num_segments = num_points - 1;
305 Eigen::Index total_samples = 1 + (Eigen::Index)num_segments * ((Eigen::Index)
m_samples_per_segment - 1);
315 dense_points, total_samples);
319 m_vertices.reserve((dense_points.cols() - 1) * 2);
321 for (Eigen::Index i = 0; i < dense_points.cols() - 1; ++i) {
322 float t0 = float(i) / float(total_samples - 1);
323 float t1 = float(i + 1) / float(total_samples - 1);
325 auto segment_idx0 = std::min<size_t>(
size_t(t0 *
float(num_segments)), num_segments - 1);
326 auto segment_idx1 = std::min<size_t>(
size_t(t1 *
float(num_segments)), num_segments - 1);
335 .
position = glm::vec3(dense_points(0, i), dense_points(1, i), dense_points(2, i)),
337 .thickness = thick0 });
340 .
position = glm::vec3(dense_points(0, i + 1), dense_points(1, i + 1), dense_points(2, i + 1)),
342 .thickness = thick1 });
347 std::span<LineVertex> points,
350 size_t valid_connections = std::ranges::count_if(
m_connections,
351 [num_points](
const auto& conn) {
352 return conn.first < num_points && conn.second < num_points;
359 if (
a >= num_points ||
b >= num_points) {
372 .thickness = thick_a });
377 .thickness = thick_b });
383 auto view =
m_points.linearized_view();
384 Eigen::MatrixXd matrix(3, view.size());
386 Eigen::Index idx = 0;
387 for (
const auto& point : view) {
388 matrix.col(idx++) << point.position.x,
#define MF_ERROR(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
bool m_vertex_data_dirty
Flag: vertex data or layout changed since last GPU upload.
std::optional< Kakshya::VertexLayout > get_vertex_layout() const
Get cached vertex layout.
void set_vertex_layout(const Kakshya::VertexLayout &layout)
Set cached vertex layout.
void set_vertex_stride(size_t stride)
Set vertex stride (bytes per vertex)
bool m_needs_layout_update
Flag indicating if layout needs update.
Base class for nodes that generate 3D geometry data.
void set_line_color(const glm::vec3 &color, bool force_uniform=true)
Set line color (applied to all connections)
void force_uniform_color(bool should_force)
Force uniform color for all vertices.
std::vector< LineVertex > m_vertices
Eigen::MatrixXd points_to_eigen() const
std::function< std::vector< std::pair< size_t, size_t > >(const Eigen::MatrixXd &)> CustomConnectionFunction
void add_point(const LineVertex &point)
Add point to topology.
void set_path_interpolation_mode(Kinesis::InterpolationMode mode)
Set custom connection function (for CUSTOM mode)
void set_line_thickness(float thickness, bool force_uniform=true)
Set line thickness.
CustomConnectionFunction m_custom_func
void regenerate_topology()
Manually trigger connection regeneration.
void build_direct_connections(std::span< LineVertex > points, size_t num_points)
std::vector< std::pair< size_t, size_t > > m_connections
void set_samples_per_segment(size_t samples)
Set number of samples per segment for interpolation.
void build_interpolated_path(std::span< LineVertex > points, size_t num_points)
void remove_point(size_t index)
Remove point by index.
void set_arc_length_reparameterization(bool enable)
Enable or disable arc-length reparameterization for interpolation.
void set_k_neighbors(size_t k)
Set K parameter for K_NEAREST mode.
void force_uniform_thickness(bool should_force)
Force uniform thickness for all vertices.
bool m_force_uniform_color
If true, all vertices use m_line_color instead of per-vertex color.
void build_vertex_buffer()
float m_connection_radius
void set_points(const std::vector< LineVertex > &points)
Set all points at once.
Kinesis::ProximityMode m_mode
void compute_frame() override
Compute frame - generates vertex data from points and connections.
TopologyGeneratorNode(Kinesis::ProximityMode mode=Kinesis::ProximityMode::SEQUENTIAL, bool auto_connect=true, size_t max_points=256)
Create topology generator.
void set_connection_mode(Kinesis::ProximityMode mode)
Set connection mode.
size_t m_samples_per_segment
Controls smoothness vs performance.
bool m_force_uniform_thickness
If true, all vertices use m_line_thickness instead of per-vertex thickness.
bool m_use_arc_length_reparameterization
Optional constant-speed.
const LineVertex & get_point(size_t index) const
Get point by index.
void update_point(size_t index, const LineVertex &point)
Update point data.
void set_auto_connect(bool enable)
Enable/disable automatic connection regeneration.
Kinesis::InterpolationMode m_path_interpolation_mode
void set_connection_radius(float radius)
Set radius for RADIUS_THRESHOLD mode.
std::vector< LineVertex > get_points() const
Get all points.
void clear()
Clear all points and connections.
Memory::HistoryBuffer< LineVertex > m_points
@ NodeProcessing
Node graph processing (Nodes::NodeGraphManager)
@ Nodes
DSP Generator and Filter Nodes, graph pipeline, node management.
std::vector< Nodes::LineVertex > reparameterize_by_arc_length(const std::vector< Nodes::LineVertex > &path_vertices, size_t num_samples)
Resample path vertices for arc-length parameterization.
Eigen::MatrixXd generate_interpolated_points(const Eigen::MatrixXd &control_points, Eigen::Index num_samples, InterpolationMode mode, double tension)
Generate interpolated points from control points.
InterpolationMode
Mathematical interpolation methods.
EdgeList generate_proximity_graph(const Eigen::MatrixXd &points, const ProximityConfig &config)
Generate proximity graph using specified mode.
static VertexLayout for_lines(uint32_t stride=36)
Factory: Create layout for line primitives (position, color, thickness)
std::function< EdgeList(const Eigen::MatrixXd &)> custom_function