Detects data modality from dimension information.
Consolidates modality detection logic that was duplicated across analyzers. Uses dimension roles and count to determine appropriate processing approach.
124{
125 if (dimensions.empty()) {
126 return DataModality::UNKNOWN;
127 }
128
129 size_t time_dims = 0, spatial_dims = 0, channel_dims = 0, frequency_dims = 0, custom_dims = 0;
130 size_t total_spatial_elements = 1;
131 size_t total_channels = 0;
132
133 for (const auto& dim : dimensions) {
134 if (dim.grouping) {
135 switch (dim.role) {
136 case DataDimension::Role::POSITION:
137 return DataModality::VERTEX_POSITIONS_3D;
138 case DataDimension::Role::NORMAL:
139 return DataModality::VERTEX_NORMALS_3D;
140 case DataDimension::Role::TANGENT:
141 case DataDimension::Role::BITANGENT:
142 return DataModality::VERTEX_TANGENTS_3D;
143 case DataDimension::Role::UV:
144 return DataModality::TEXTURE_COORDS_2D;
145 case DataDimension::Role::COLOR:
146 if (dim.grouping->count == 3)
147 return DataModality::VERTEX_COLORS_RGB;
148 if (dim.grouping->count == 4)
149 return DataModality::VERTEX_COLORS_RGBA;
150 break;
151 default:
152 if (dim.grouping->count == 16)
153 return DataModality::TRANSFORMATION_MATRIX;
154 break;
155 }
156 }
157 }
158
159 for (const auto& dim : dimensions) {
160 switch (dim.role) {
161 case DataDimension::Role::TIME:
162 time_dims++;
163 break;
164 case DataDimension::Role::SPATIAL_X:
165 case DataDimension::Role::SPATIAL_Y:
166 case DataDimension::Role::SPATIAL_Z:
167 spatial_dims++;
168 total_spatial_elements *= dim.size;
169 break;
170 case DataDimension::Role::CHANNEL:
171 channel_dims++;
172 total_channels += dim.size;
173 break;
174 case DataDimension::Role::FREQUENCY:
175 frequency_dims++;
176 break;
177 case DataDimension::Role::CUSTOM:
178 default:
179 custom_dims++;
180 break;
181 }
182 }
183
184 if (time_dims == 1 && spatial_dims == 0 && frequency_dims == 0) {
185 if (channel_dims == 0) {
186 return DataModality::AUDIO_1D;
187 } else if (channel_dims == 1) {
188 return (total_channels <= 1) ? DataModality::AUDIO_1D : DataModality::AUDIO_MULTICHANNEL;
189 } else {
190 return DataModality::AUDIO_MULTICHANNEL;
191 }
192 }
193
194 if (time_dims >= 1 && frequency_dims >= 1) {
195 if (spatial_dims == 0 && channel_dims <= 1) {
196 return DataModality::SPECTRAL_2D;
197 }
198 return DataModality::TENSOR_ND;
199 }
200
201 if (spatial_dims >= 2 && time_dims == 0) {
202 if (spatial_dims == 2) {
203 if (channel_dims == 0) {
204 return DataModality::IMAGE_2D;
205 } else if (channel_dims == 1 && total_channels >= 3) {
206 return DataModality::IMAGE_COLOR;
207 } else {
208 return DataModality::IMAGE_2D;
209 }
210 } else if (spatial_dims == 3) {
211 return DataModality::VOLUMETRIC_3D;
212 }
213 }
214
215 if (time_dims >= 1 && spatial_dims >= 2) {
216 if (spatial_dims == 2) {
217 if (channel_dims == 0 || (channel_dims == 1 && total_channels <= 1)) {
218 return DataModality::VIDEO_GRAYSCALE;
219 } else {
220 return DataModality::VIDEO_COLOR;
221 }
222 }
223 return DataModality::TENSOR_ND;
224 }
225
226 if (spatial_dims == 2 && time_dims == 0 && channel_dims >= 1) {
227 if (total_spatial_elements >= 64 && total_channels >= 1) {
228 return DataModality::TEXTURE_2D;
229 }
230 }
231
232 return DataModality::TENSOR_ND;
233}