68 const Eigen::MatrixXd& matrix,
70 bool preserve_precision)
73 switch (matrix.rows()) {
78 error<std::invalid_argument>(
81 std::source_location::current(),
82 "Ambiguous 2-row matrix. Specify {} or {}",
96 error<std::invalid_argument>(
99 std::source_location::current(),
100 "Cannot auto-interpret {}-row matrix. Specify MatrixInterpretation explicitly.",
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);
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));
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));
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)));
143 std::vector<glm::vec2> data(matrix.cols());
144 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
146 static_cast<float>(matrix(0, i)),
147 static_cast<float>(matrix(1, i)));
154 std::vector<glm::vec3> data(matrix.cols());
155 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
157 static_cast<float>(matrix(0, i)),
158 static_cast<float>(matrix(1, i)),
159 static_cast<float>(matrix(2, i)));
166 std::vector<glm::vec4> data(matrix.cols());
167 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
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)));
179 std::vector<glm::mat4> data(matrix.cols());
180 for (Eigen::Index i = 0; i < matrix.cols(); ++i) {
182 for (
int j = 0; j < 16; ++j) {
183 mat_data[j] =
static_cast<float>(matrix(j, i));
185 data[i] = glm::make_mat4(mat_data);
192 error<std::invalid_argument>(
195 std::source_location::current(),
196 "Invalid MatrixInterpretation: {}",
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.