MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ build_interpolated_path()

void MayaFlux::Nodes::GpuSync::TopologyGeneratorNode::build_interpolated_path ( std::span< LineVertex points,
size_t  num_points 
)
private

Definition at line 293 of file TopologyGeneratorNode.cpp.

296{
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;
302 }
303
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);
306
307 Eigen::MatrixXd dense_points = Kinesis::generate_interpolated_points(
308 control_points,
309 total_samples,
311 0.5);
312
315 dense_points, total_samples);
316 }
317
318 m_vertices.clear();
319 m_vertices.reserve((dense_points.cols() - 1) * 2);
320
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);
324
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);
327
328 glm::vec3 color0 = m_force_uniform_color ? m_line_color : points[segment_idx0].color;
329 glm::vec3 color1 = m_force_uniform_color ? m_line_color : points[segment_idx1].color;
330
331 float thick0 = m_force_uniform_thickness ? m_line_thickness : points[segment_idx0].thickness;
332 float thick1 = m_force_uniform_thickness ? m_line_thickness : points[segment_idx1].thickness;
333
334 m_vertices.emplace_back(LineVertex {
335 .position = glm::vec3(dense_points(0, i), dense_points(1, i), dense_points(2, i)),
336 .color = color0,
337 .thickness = thick0 });
338
339 m_vertices.emplace_back(LineVertex {
340 .position = glm::vec3(dense_points(0, i + 1), dense_points(1, i + 1), dense_points(2, i + 1)),
341 .color = color1,
342 .thickness = thick1 });
343 }
344}
bool m_force_uniform_color
If true, all vertices use m_line_color instead of per-vertex color.
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.
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.

References MayaFlux::Kinesis::generate_interpolated_points(), m_force_uniform_color, m_force_uniform_thickness, m_line_color, m_line_thickness, m_path_interpolation_mode, m_samples_per_segment, m_use_arc_length_reparameterization, m_vertices, MayaFlux::Nodes::LineVertex::position, and MayaFlux::Kinesis::reparameterize_by_arc_length().

Referenced by build_vertex_buffer().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: