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

◆ evaluate_planar()

void MayaFlux::Kinesis::CurveEvaluator::evaluate_planar ( std::span< const double >  control_points,
size_t  dim,
Eigen::Index  num_samples,
std::vector< double > &  out 
)

Evaluate a curve into a coordinate-major buffer.

Parameters
control_pointsPoint-major, dim * control_count doubles.
dimCoordinate count per point, at least 1.
num_samplesOutput sample count, at least 2.
outResized to dim * num_samples, coordinate-major.

control_points and out must not alias.

Definition at line 617 of file MotionCurves.cpp.

622{
623 if (num_samples < 2) {
624 error<std::invalid_argument>(
627 std::source_location::current(),
628 "num_samples must be at least 2, but got {}",
629 num_samples);
630 }
631
632 if (dim == 0) {
633 error<std::invalid_argument>(
636 std::source_location::current(),
637 "dim must be at least 1");
638 }
639
640 const auto control_count = static_cast<Eigen::Index>(control_points.size() / dim);
641
642 if (control_count < 2) {
643 error<std::invalid_argument>(
646 std::source_location::current(),
647 "Need at least 2 control points, but got {}",
648 control_count);
649 }
650
651 if (m_points_per_segment == 0) {
652 error<std::invalid_argument>(
655 std::source_location::current(),
656 "Unsupported interpolation mode: {}",
657 static_cast<int>(m_mode));
658 }
659
660 if (!m_supports_multi && control_count != m_points_per_segment) {
661 error<std::invalid_argument>(
664 std::source_location::current(),
665 "{} interpolation requires exactly {} control points, but got {}",
666 static_cast<int>(m_mode), m_points_per_segment, control_count);
667 }
668
669 Eigen::Index active_count = 0;
670 const double* active = extend(control_points, dim, active_count);
671
672 const Eigen::Index num_segments = compute_num_segments(
673 active_count, m_points_per_segment, m_overlap);
674
675 if (num_segments < 1) {
676 error<std::invalid_argument>(
679 std::source_location::current(),
680 "Need sufficient control points for multi-segment {} interpolation, but got {}",
681 static_cast<int>(m_mode), control_count);
682 }
683
684 const auto stride = static_cast<size_t>(num_samples);
685 out.resize(dim * stride);
686
687 build_chunks(num_samples, num_segments, active_count);
688
689 const Eigen::Index pps = m_points_per_segment;
690 const bool trig = m_trigonometric;
691 const double* basis = m_basis.data();
692 double* out_base = out.data();
693
694 if (m_chunks.size() > 1 && num_samples >= k_parallel_min_samples) {
695 P::for_each(P::par_unseq, m_chunks.begin(), m_chunks.end(),
696 [&](const CurveChunk& chunk) {
697 const auto count = static_cast<size_t>(chunk.sample_count);
698 std::vector<double> params(count);
699 fill_parameters(params.data(), chunk, num_samples, num_segments);
700
701 double* dst = out_base + static_cast<size_t>(chunk.sample_begin);
702
703 if (trig) {
704 evaluate_chunk_cosine(active, chunk.start_col, params.data(),
705 dim, count, dst, stride);
706 return;
707 }
708
709 std::vector<double> folded(dim * static_cast<size_t>(pps));
710 fold_controls(active, chunk.start_col, dim, pps, basis, folded.data());
711
712 evaluate_chunk_polynomial(folded.data(), params.data(),
713 dim, pps, count, dst, stride);
714 });
715
716 return;
717 }
718
719 for (const CurveChunk& chunk : m_chunks) {
720 const auto count = static_cast<size_t>(chunk.sample_count);
721
722 m_tbuf.resize(count);
723 fill_parameters(m_tbuf.data(), chunk, num_samples, num_segments);
724
725 double* dst = out_base + static_cast<size_t>(chunk.sample_begin);
726
727 if (trig) {
728 evaluate_chunk_cosine(active, chunk.start_col, m_tbuf.data(),
729 dim, count, dst, stride);
730 continue;
731 }
732
733 m_folded.resize(dim * static_cast<size_t>(pps));
734 fold_controls(active, chunk.start_col, dim, pps, basis, m_folded.data());
735
736 evaluate_chunk_polynomial(m_folded.data(), m_tbuf.data(),
737 dim, pps, count, dst, stride);
738 }
739}
size_t count
const double * extend(std::span< const double > control_points, size_t dim, Eigen::Index &count)
void build_chunks(Eigen::Index num_samples, Eigen::Index num_segments, Eigen::Index active_count)
std::vector< CurveChunk > m_chunks
@ Runtime
General runtime operations (default fallback)
@ Kinesis
General mathematical and physics algorithns.

References build_chunks(), count, extend(), MayaFlux::Journal::Kinesis, m_basis, m_chunks, m_mode, m_overlap, m_points_per_segment, m_supports_multi, m_trigonometric, MayaFlux::Journal::Runtime, and MayaFlux::Kinesis::CurveChunk::start_col.

Referenced by MayaFlux::Nodes::GpuSync::TopologyGeneratorNode::build_interpolated_path(), and MayaFlux::Nodes::GpuSync::PathGeneratorNode::write_curve_segment().

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