VisuTwin Canvas
C++ 3D Engine — Metal Backend
Loading...
Searching...
No Matches
curveSet.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2025-2026 Arnis Lektauers
3#include "curveSet.h"
4
5#include <algorithm>
6
7namespace visutwin::canvas
8{
10 {
11 curves.emplace_back();
12 }
13
14 CurveSet::CurveSet(const size_t numCurves)
15 {
16 curves.reserve(numCurves);
17 for (size_t i = 0; i < numCurves; ++i) {
18 curves.emplace_back();
19 }
20 }
21
22 CurveSet::CurveSet(const std::vector<std::vector<float>>& keys)
23 {
24 if (keys.empty()) {
25 curves.emplace_back();
26 return;
27 }
28
29 curves.reserve(keys.size());
30 for (const auto& keyData : keys) {
31 curves.emplace_back(keyData);
32 }
33 }
34
36 {
37 _type = value;
38 for (auto& curve : curves) {
39 curve.type = value;
40 }
41 }
42
43 Curve& CurveSet::get(const size_t index)
44 {
45 return curves[index];
46 }
47
48 const Curve& CurveSet::get(const size_t index) const
49 {
50 return curves[index];
51 }
52
53 std::vector<float> CurveSet::value(const float time, std::vector<float> result)
54 {
55 const size_t len = curves.size();
56 result.resize(len);
57
58 for (size_t i = 0; i < len; i++) {
59 result[i] = curves[i].value(time);
60 }
61
62 return result;
63 }
64
66 {
67 CurveSet result;
68 result.curves.clear();
69
70 for (const auto& curve : curves) {
71 result.curves.push_back(curve.clone());
72 }
73
74 result._type = _type;
75 return result;
76 }
77
78 std::vector<float> CurveSet::quantize(size_t precision)
79 {
80 precision = std::max<size_t>(precision, 2);
81
82 const size_t numCurves = curves.size();
83 std::vector<float> values(precision * numCurves, 0.0f);
84 const float step = 1.0f / static_cast<float>(precision - 1);
85
86 for (size_t c = 0; c < numCurves; c++) {
87 for (size_t i = 0; i < precision; i++) {
88 values[i * numCurves + c] = curves[c].value(step * static_cast<float>(i));
89 }
90 }
91
92 return values;
93 }
94
95 std::vector<float> CurveSet::quantizeClamped(const size_t precision, const float min, const float max)
96 {
97 auto result = quantize(precision);
98 for (auto& v : result) {
99 v = std::min(max, std::max(min, v));
100 }
101 return result;
102 }
103}
std::vector< Curve > curves
Definition curveSet.h:15
Curve & get(size_t index)
Definition curveSet.cpp:43
std::vector< float > quantize(size_t precision)
Definition curveSet.cpp:78
void setType(CurveType value)
Definition curveSet.cpp:35
std::vector< float > quantizeClamped(size_t precision, float min, float max)
Definition curveSet.cpp:95
CurveSet clone() const
Definition curveSet.cpp:65
std::vector< float > value(float time, std::vector< float > result={})
Definition curveSet.cpp:53