MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
EigenInsertion.cpp
Go to the documentation of this file.
1#include "EigenInsertion.hpp"
2
5
6#include <glm/gtc/type_ptr.hpp>
7
8namespace MayaFlux::Kakshya {
9
11{
12 switch (interp) {
14 return 1;
17 return 2;
19 return 3;
21 return 4;
23 return 16;
25 return -1;
26 }
27 return -1;
28}
29
31 const Eigen::MatrixXd& matrix,
32 MatrixInterpretation interpretation) const
33{
34 const auto expected_rows = get_expected_rows(interpretation);
35
36 if (matrix.rows() != expected_rows) {
37 error<std::invalid_argument>(
40 std::source_location::current(),
41 "{} interpretation requires {} rows, but matrix has {} rows",
42 Reflect::enum_to_string(interpretation),
43 expected_rows,
44 matrix.rows());
45 }
46}
47
49 const Eigen::VectorXd& vec,
50 bool preserve_precision)
51{
52 if (preserve_precision) {
53 std::vector<double> data(vec.size());
54 for (Eigen::Index i = 0; i < vec.size(); ++i) {
55 data[i] = vec(i);
56 }
57 m_variant = Kakshya::DataVariant { std::move(data) };
58 } else {
59 std::vector<float> data(vec.size());
60 for (Eigen::Index i = 0; i < vec.size(); ++i) {
61 data[i] = static_cast<float>(vec(i));
62 }
63 m_variant = Kakshya::DataVariant { std::move(data) };
64 }
65}
66
68 const Eigen::MatrixXd& matrix,
69 MatrixInterpretation interpretation,
70 bool preserve_precision)
71{
72 if (interpretation == MatrixInterpretation::AUTO) {
73 switch (matrix.rows()) {
74 case 1:
75 interpretation = MatrixInterpretation::SCALAR;
76 break;
77 case 2:
78 error<std::invalid_argument>(
81 std::source_location::current(),
82 "Ambiguous 2-row matrix. Specify {} or {}",
85 break;
86 case 3:
87 interpretation = MatrixInterpretation::VEC3;
88 break;
89 case 4:
90 interpretation = MatrixInterpretation::VEC4;
91 break;
92 case 16:
93 interpretation = MatrixInterpretation::MAT4;
94 break;
95 default:
96 error<std::invalid_argument>(
99 std::source_location::current(),
100 "Cannot auto-interpret {}-row matrix. Specify MatrixInterpretation explicitly.",
101 matrix.rows());
102 }
103 }
104
105 validate_matrix_dimensions(matrix, interpretation);
106
107 switch (interpretation) {
109 if (preserve_precision) {
110 std::vector<double> data(matrix.cols());
111 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
112 data[i] = matrix(0, i);
113 }
114 m_variant = Kakshya::DataVariant { std::move(data) };
115 } else {
116 std::vector<float> data(matrix.cols());
117 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
118 data[i] = static_cast<float>(matrix(0, i));
119 }
120 m_variant = Kakshya::DataVariant { std::move(data) };
121 }
122 break;
123
125 if (preserve_precision) {
126 std::vector<std::complex<double>> data(matrix.cols());
127 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
128 data[i] = std::complex<double>(matrix(0, i), matrix(1, i));
129 }
130 m_variant = Kakshya::DataVariant { std::move(data) };
131 } else {
132 std::vector<std::complex<float>> data(matrix.cols());
133 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
134 data[i] = std::complex<float>(
135 static_cast<float>(matrix(0, i)),
136 static_cast<float>(matrix(1, i)));
137 }
138 m_variant = Kakshya::DataVariant { std::move(data) };
139 }
140 break;
141
143 std::vector<glm::vec2> data(matrix.cols());
144 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
145 data[i] = glm::vec2(
146 static_cast<float>(matrix(0, i)),
147 static_cast<float>(matrix(1, i)));
148 }
149 m_variant = Kakshya::DataVariant { std::move(data) };
150 break;
151 }
152
154 std::vector<glm::vec3> data(matrix.cols());
155 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
156 data[i] = glm::vec3(
157 static_cast<float>(matrix(0, i)),
158 static_cast<float>(matrix(1, i)),
159 static_cast<float>(matrix(2, i)));
160 }
161 m_variant = Kakshya::DataVariant { std::move(data) };
162 break;
163 }
164
166 std::vector<glm::vec4> data(matrix.cols());
167 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
168 data[i] = glm::vec4(
169 static_cast<float>(matrix(0, i)),
170 static_cast<float>(matrix(1, i)),
171 static_cast<float>(matrix(2, i)),
172 static_cast<float>(matrix(3, i)));
173 }
174 m_variant = Kakshya::DataVariant { std::move(data) };
175 break;
176 }
177
179 std::vector<glm::mat4> data(matrix.cols());
180 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
181 float mat_data[16];
182 for (int j = 0; j < 16; ++j) {
183 mat_data[j] = static_cast<float>(matrix(j, i));
184 }
185 data[i] = glm::make_mat4(mat_data);
186 }
187 m_variant = Kakshya::DataVariant { std::move(data) };
188 break;
189 }
190
191 default:
192 error<std::invalid_argument>(
195 std::source_location::current(),
196 "Invalid MatrixInterpretation: {}",
197 Reflect::enum_to_string(interpretation));
198 }
199}
200
202{
203 m_variant = Kakshya::DataVariant { std::vector<double> {} };
204}
205
206} // namespace MayaFlux::Kakshya
static constexpr Eigen::Index get_expected_rows(MatrixInterpretation interp)
void insert_vector(const Eigen::VectorXd &vec, bool preserve_precision=true)
Insert Eigen vector as scalar data.
void clear()
Clear variant data.
void validate_matrix_dimensions(const Eigen::MatrixXd &matrix, MatrixInterpretation interpretation) const
void insert_matrix(const Eigen::MatrixXd &matrix, MatrixInterpretation interpretation=MatrixInterpretation::AUTO, bool preserve_precision=true)
Insert Eigen matrix with automatic interpretation.
@ Runtime
General runtime operations (default fallback)
@ Kakshya
Containers[Signalsource, Stream, File], Regions, DataProcessors.
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
Definition NDData.hpp:73
MatrixInterpretation
How to interpret Eigen matrix rows/columns.
@ MAT4
16 rows → glm::mat4 (flattened)
@ SCALAR
Single row → scalar values.
@ COMPLEX
2 rows → complex (row 0 = real, row 1 = imag)
constexpr std::string_view enum_to_string(EnumType value) noexcept
Universal enum to string converter using magic_enum (original case)