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

◆ generate_curve_segment()

void MayaFlux::Nodes::GpuSync::PathGeneratorNode::generate_curve_segment ( const std::vector< LineVertex > &  curve_verts,
size_t  start_idx,
std::vector< LineVertex > &  output 
)
private

Definition at line 111 of file PathGeneratorNode.cpp.

115{
116 if (start_idx + 3 >= curve_verts.size()) {
117 return;
118 }
119
120 Eigen::MatrixXd segment_controls(3, 4);
121 for (Eigen::Index i = 0; i < 4; ++i) {
122 const auto& pt = curve_verts[start_idx + i].position;
123 segment_controls.col(i) << pt.x, pt.y, pt.z;
124 }
125
126 Eigen::MatrixXd interpolated = Kinesis::generate_interpolated_points(
127 segment_controls,
129 m_mode,
130 m_tension);
131
134 interpolated,
136 }
137
138 for (Eigen::Index i = 0; i < interpolated.cols() - 1; ++i) {
139 float t0 = static_cast<float>(i) / static_cast<float>(interpolated.cols() - 1);
140 float t1 = static_cast<float>(i + 1) / static_cast<float>(interpolated.cols() - 1);
141
142 size_t ctrl_idx0 = start_idx + std::min(static_cast<size_t>(t0 * 3), size_t(3));
143 size_t ctrl_idx1 = start_idx + std::min(static_cast<size_t>(t1 * 3), size_t(3));
144
145 glm::vec3 color0 = m_force_uniform_color ? m_current_color : curve_verts[ctrl_idx0].color;
146 glm::vec3 color1 = m_force_uniform_color ? m_current_color : curve_verts[ctrl_idx1].color;
147
148 float thick0 = m_force_uniform_thickness ? m_current_thickness : curve_verts[ctrl_idx0].thickness;
149 float thick1 = m_force_uniform_thickness ? m_current_thickness : curve_verts[ctrl_idx1].thickness;
150
151 glm::vec3 p0(interpolated(0, i), interpolated(1, i), interpolated(2, i));
152 glm::vec3 p1(interpolated(0, i + 1), interpolated(1, i + 1), interpolated(2, i + 1));
153
154 output.push_back({ p0, color0, thick0 });
155 output.push_back({ p1, color1, thick1 });
156 }
157}
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_arc_length_parameterization, m_current_color, m_current_thickness, m_force_uniform_color, m_force_uniform_thickness, m_mode, m_samples_per_segment, m_tension, and MayaFlux::Kinesis::reparameterize_by_arc_length().

Referenced by complete(), generate_interpolated_path(), and regenerate_segment_range().

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