Insert Eigen matrix with automatic interpretation.
71{
73 switch (matrix.rows()) {
74 case 1:
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:
88 break;
89 case 4:
91 break;
92 case 16:
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
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 }
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 }
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 }
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 }
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 }
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 }
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 }
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 }
188 break;
189 }
190
191 default:
192 error<std::invalid_argument>(
195 std::source_location::current(),
196 "Invalid MatrixInterpretation: {}",
198 }
199}
Kakshya::DataVariant & m_variant
void validate_matrix_dimensions(const Eigen::MatrixXd &matrix, MatrixInterpretation interpretation) const
@ 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.
@ MAT4
16 rows → glm::mat4 (flattened)
@ SCALAR
Single row → scalar values.
@ COMPLEX
2 rows → complex (row 0 = real, row 1 = imag)
@ AUTO
Infer from row count.
constexpr std::string_view enum_to_string(EnumType value) noexcept
Universal enum to string converter using magic_enum (original case)