VTK  9.5.20251127
vtkOpenXRUtilities.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
12
13#ifndef vtkOpenXRUtilities_h
14#define vtkOpenXRUtilities_h
15
16#include "vtkMatrix4x4.h"
17#include "vtkOpenXR.h"
18
19#include <cmath> // for tanf
20
21VTK_ABI_NAMESPACE_BEGIN
23{
24public:
27
32 static void CreateProjectionFov(vtkMatrix4x4* result, XrFovf fov, float nearZ, float farZ);
33
38 static void SetMatrixFromXrPose(vtkMatrix4x4* result, const XrPosef& xrPose);
39
43 static void CreateFromQuaternion(double result[16], const XrQuaternionf& quat);
44
48 static const char* GetActionTypeAsString(const XrActionType& actionType);
49
53 static const char* GetViewConfigurationTypeAsString(
54 const XrViewConfigurationType& viewConfigType);
55
59 static const char* GetStructureTypeAsString(const XrStructureType& structureType);
60
61 static const XrPosef& GetIdentityPose();
62
63protected:
64 vtkOpenXRUtilities() = default;
65 ~vtkOpenXRUtilities() override = default;
66
67private:
69 void operator=(const vtkOpenXRUtilities&) = delete;
70};
71
72//----------------------------------------------------------------------------
74{
75 static const XrPosef pose = {
76 { 0.0, 0.0, 0.0, 1.0 }, // .orientation
77 { 0.0, 0.0, 0.0 } // .position
78 };
79 return pose;
80}
81
82//----------------------------------------------------------------------------
84 vtkMatrix4x4* result, const XrFovf fov, const float nearZ, const float farZ)
85{
86 const float tanAngleLeft = tanf(fov.angleLeft);
87 const float tanAngleRight = tanf(fov.angleRight);
88
89 const float tanAngleDown = tanf(fov.angleDown);
90 const float tanAngleUp = tanf(fov.angleUp);
91
92 const float tanAngleWidth = tanAngleRight - tanAngleLeft;
93
94 // Clip space with
95 // positive Y up (OpenGL / D3D / Metal).
96 const float tanAngleHeight = (tanAngleUp - tanAngleDown);
97
98 double matrixArray[16] = { 0 };
99 if (farZ <= nearZ)
100 {
101 // place the far plane at infinity
102 matrixArray[0] = 2 / tanAngleWidth;
103 matrixArray[4] = 0;
104 matrixArray[8] = (tanAngleRight + tanAngleLeft) / tanAngleWidth;
105 matrixArray[12] = 0;
106
107 matrixArray[1] = 0;
108 matrixArray[5] = 2 / tanAngleHeight;
109 matrixArray[9] = (tanAngleUp + tanAngleDown) / tanAngleHeight;
110 matrixArray[13] = 0;
111
112 matrixArray[2] = 0;
113 matrixArray[6] = 0;
114 matrixArray[10] = -1;
115 matrixArray[14] = -(nearZ + nearZ);
116
117 matrixArray[3] = 0;
118 matrixArray[7] = 0;
119 matrixArray[11] = -1;
120 matrixArray[15] = 0;
121 }
122 else
123 {
124 // normal projection
125 matrixArray[0] = 2 / tanAngleWidth;
126 matrixArray[4] = 0;
127 matrixArray[8] = (tanAngleRight + tanAngleLeft) / tanAngleWidth;
128 matrixArray[12] = 0;
129
130 matrixArray[1] = 0;
131 matrixArray[5] = 2 / tanAngleHeight;
132 matrixArray[9] = (tanAngleUp + tanAngleDown) / tanAngleHeight;
133 matrixArray[13] = 0;
134
135 matrixArray[2] = 0;
136 matrixArray[6] = 0;
137 matrixArray[10] = -(farZ + nearZ) / (farZ - nearZ);
138 matrixArray[14] = -2 * farZ * nearZ / (farZ - nearZ);
139
140 matrixArray[3] = 0;
141 matrixArray[7] = 0;
142 matrixArray[11] = -1;
143 matrixArray[15] = 0;
144 }
145
146 // Set the array to the result vtkMatrix
147 result->DeepCopy(matrixArray);
148 result->Transpose();
149}
150
151//----------------------------------------------------------------------------
152// transpose of vtk standard
153inline void vtkOpenXRUtilities::CreateFromQuaternion(double result[16], const XrQuaternionf& quat)
154{
155 const double x2 = quat.x + quat.x;
156 const double y2 = quat.y + quat.y;
157 const double z2 = quat.z + quat.z;
158
159 const double xx2 = quat.x * x2;
160 const double yy2 = quat.y * y2;
161 const double zz2 = quat.z * z2;
162
163 const double yz2 = quat.y * z2;
164 const double wx2 = quat.w * x2;
165 const double xy2 = quat.x * y2;
166 const double wz2 = quat.w * z2;
167 const double xz2 = quat.x * z2;
168 const double wy2 = quat.w * y2;
169
170 result[0] = 1.0 - yy2 - zz2;
171 result[4] = xy2 + wz2;
172 result[8] = xz2 - wy2;
173 result[12] = 0.0;
174
175 result[1] = xy2 - wz2;
176 result[5] = 1.0 - xx2 - zz2;
177 result[9] = yz2 + wx2;
178 result[13] = 0.0;
179
180 result[2] = xz2 + wy2;
181 result[6] = yz2 - wx2;
182 result[10] = 1.0 - xx2 - yy2;
183 result[14] = 0.0;
184
185 result[3] = 0.0;
186 result[7] = 0.0;
187 result[11] = 0.0;
188 result[15] = 1.0;
189}
190
191//----------------------------------------------------------------------------
192// transpose of VTK standard
193inline void vtkOpenXRUtilities::SetMatrixFromXrPose(vtkMatrix4x4* result, const XrPosef& xrPose)
194{
195 const XrQuaternionf& xrQuat = xrPose.orientation;
196 const XrVector3f& xrPos = xrPose.position;
197
198 double* elems = result->GetData();
200
201 // Add the translation
202 elems[3] = xrPos.x;
203 elems[7] = xrPos.y;
204 elems[11] = xrPos.z;
205
206 result->Modified();
207}
208
209//----------------------------------------------------------------------------
210inline const char* vtkOpenXRUtilities::GetActionTypeAsString(const XrActionType& actionType)
211{
212 switch (actionType)
213 {
214 case XR_ACTION_TYPE_BOOLEAN_INPUT:
215 return "XR_ACTION_TYPE_BOOLEAN_INPUT";
216 case XR_ACTION_TYPE_FLOAT_INPUT:
217 return "XR_ACTION_TYPE_FLOAT_INPUT";
218 case XR_ACTION_TYPE_VECTOR2F_INPUT:
219 return "XR_ACTION_TYPE_VECTOR2F_INPUT";
220 case XR_ACTION_TYPE_POSE_INPUT:
221 return "XR_ACTION_TYPE_POSE_INPUT";
222 case XR_ACTION_TYPE_VIBRATION_OUTPUT:
223 return "XR_ACTION_TYPE_VIBRATION_OUTPUT";
224 default:
225 return "UNRECOGNIZED_ACTION_TYPE";
226 }
227}
228
229//----------------------------------------------------------------------------
231 const XrViewConfigurationType& viewConfigType)
232{
233 switch (viewConfigType)
234 {
235 case XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO:
236 return "XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO";
237 case XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO:
238 return "XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO";
239 case XR_VIEW_CONFIGURATION_TYPE_PRIMARY_QUAD_VARJO:
240 return "XR_VIEW_CONFIGURATION_TYPE_PRIMARY_QUAD_VARJO";
241 case XR_VIEW_CONFIGURATION_TYPE_SECONDARY_MONO_FIRST_PERSON_OBSERVER_MSFT:
242 return "XR_VIEW_CONFIGURATION_TYPE_SECONDARY_MONO_FIRST_PERSON_OBSERVER_MSFT";
243 default:
244 return "UNRECOGNIZED_VIEW_CONFIGURATION_TYPE";
245 }
246}
247
248//----------------------------------------------------------------------------
250 const XrStructureType& structureType)
251{
252 switch (structureType)
253 {
254 case XR_TYPE_API_LAYER_PROPERTIES:
255 return "XR_TYPE_API_LAYER_PROPERTIES";
256 case XR_TYPE_EXTENSION_PROPERTIES:
257 return "XR_TYPE_EXTENSION_PROPERTIES";
258 case XR_TYPE_INSTANCE_CREATE_INFO:
259 return "XR_TYPE_INSTANCE_CREATE_INFO";
260 case XR_TYPE_SYSTEM_GET_INFO:
261 return "XR_TYPE_SYSTEM_GET_INFO";
262 case XR_TYPE_SYSTEM_PROPERTIES:
263 return "XR_TYPE_SYSTEM_PROPERTIES";
264 case XR_TYPE_VIEW_LOCATE_INFO:
265 return "XR_TYPE_VIEW_LOCATE_INFO";
266 case XR_TYPE_VIEW:
267 return "XR_TYPE_VIEW";
268 case XR_TYPE_SESSION_CREATE_INFO:
269 return "XR_TYPE_SESSION_CREATE_INFO";
270 case XR_TYPE_SWAPCHAIN_CREATE_INFO:
271 return "XR_TYPE_SWAPCHAIN_CREATE_INFO";
272 case XR_TYPE_SESSION_BEGIN_INFO:
273 return "XR_TYPE_SESSION_BEGIN_INFO";
274 case XR_TYPE_VIEW_STATE:
275 return "XR_TYPE_VIEW_STATE";
276 case XR_TYPE_FRAME_END_INFO:
277 return "XR_TYPE_FRAME_END_INFO";
278 case XR_TYPE_HAPTIC_VIBRATION:
279 return "XR_TYPE_HAPTIC_VIBRATION";
280 case XR_TYPE_EVENT_DATA_BUFFER:
281 return "XR_TYPE_EVENT_DATA_BUFFER";
282 case XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING:
283 return "XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING";
284 case XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED:
285 return "XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED";
286 case XR_TYPE_ACTION_STATE_BOOLEAN:
287 return "XR_TYPE_ACTION_STATE_BOOLEAN";
288 case XR_TYPE_ACTION_STATE_FLOAT:
289 return "XR_TYPE_ACTION_STATE_FLOAT";
290 case XR_TYPE_ACTION_STATE_VECTOR2F:
291 return "XR_TYPE_ACTION_STATE_VECTOR2F";
292 case XR_TYPE_ACTION_STATE_POSE:
293 return "XR_TYPE_ACTION_STATE_POSE";
294 case XR_TYPE_ACTION_SET_CREATE_INFO:
295 return "XR_TYPE_ACTION_SET_CREATE_INFO";
296 case XR_TYPE_ACTION_CREATE_INFO:
297 return "XR_TYPE_ACTION_CREATE_INFO";
298 case XR_TYPE_INSTANCE_PROPERTIES:
299 return "XR_TYPE_INSTANCE_PROPERTIES";
300 case XR_TYPE_FRAME_WAIT_INFO:
301 return "XR_TYPE_FRAME_WAIT_INFO";
302 case XR_TYPE_COMPOSITION_LAYER_PROJECTION:
303 return "XR_TYPE_COMPOSITION_LAYER_PROJECTION";
304 case XR_TYPE_COMPOSITION_LAYER_QUAD:
305 return "XR_TYPE_COMPOSITION_LAYER_QUAD";
306 case XR_TYPE_REFERENCE_SPACE_CREATE_INFO:
307 return "XR_TYPE_REFERENCE_SPACE_CREATE_INFO";
308 case XR_TYPE_ACTION_SPACE_CREATE_INFO:
309 return "XR_TYPE_ACTION_SPACE_CREATE_INFO";
310 case XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING:
311 return "XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING";
312 case XR_TYPE_VIEW_CONFIGURATION_VIEW:
313 return "XR_TYPE_VIEW_CONFIGURATION_VIEW";
314 case XR_TYPE_SPACE_LOCATION:
315 return "XR_TYPE_SPACE_LOCATION";
316 case XR_TYPE_SPACE_VELOCITY:
317 return "XR_TYPE_SPACE_VELOCITY";
318 case XR_TYPE_FRAME_STATE:
319 return "XR_TYPE_FRAME_STATE";
320 case XR_TYPE_VIEW_CONFIGURATION_PROPERTIES:
321 return "XR_TYPE_VIEW_CONFIGURATION_PROPERTIES";
322 case XR_TYPE_FRAME_BEGIN_INFO:
323 return "XR_TYPE_FRAME_BEGIN_INFO";
324 case XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW:
325 return "XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW";
326 case XR_TYPE_EVENT_DATA_EVENTS_LOST:
327 return "XR_TYPE_EVENT_DATA_EVENTS_LOST";
328 case XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING:
329 return "XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING";
330 case XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED:
331 return "XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED";
332 case XR_TYPE_INTERACTION_PROFILE_STATE:
333 return "XR_TYPE_INTERACTION_PROFILE_STATE";
334 case XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO:
335 return "XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO";
336 case XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO:
337 return "XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO";
338 case XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO:
339 return "XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO";
340 case XR_TYPE_ACTION_STATE_GET_INFO:
341 return "XR_TYPE_ACTION_STATE_GET_INFO";
342 case XR_TYPE_HAPTIC_ACTION_INFO:
343 return "XR_TYPE_HAPTIC_ACTION_INFO";
344 case XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO:
345 return "XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO";
346 case XR_TYPE_ACTIONS_SYNC_INFO:
347 return "XR_TYPE_ACTIONS_SYNC_INFO";
348 case XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO:
349 return "XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO";
350 case XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO:
351 return "XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO";
352 case XR_TYPE_COMPOSITION_LAYER_CUBE_KHR:
353 return "XR_TYPE_COMPOSITION_LAYER_CUBE_KHR";
354 case XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR:
355 return "XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR";
356 case XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR:
357 return "XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR";
358 case XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR:
359 return "XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR";
360 case XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT:
361 return "XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT";
362 case XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR:
363 return "XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR";
364 case XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR:
365 return "XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR";
366 case XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT:
367 return "XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT";
368 case XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT:
369 return "XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT";
370 case XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
371 return "XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT";
372 case XR_TYPE_DEBUG_UTILS_LABEL_EXT:
373 return "XR_TYPE_DEBUG_UTILS_LABEL_EXT";
374 case XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR:
375 return "XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR";
376 case XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR:
377 return "XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR";
378 case XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR:
379 return "XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR";
380 case XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR:
381 return "XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR";
382 case XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR:
383 return "XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR";
384 case XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR:
385 return "XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR";
386 case XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR:
387 return "XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR";
388 case XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR:
389 return "XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR";
390 case XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR:
391 return "XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR";
392 case XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR:
393 return "XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR";
394 case XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR:
395 return "XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR";
396 case XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR:
397 return "XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR";
398 case XR_TYPE_GRAPHICS_BINDING_D3D11_KHR:
399 return "XR_TYPE_GRAPHICS_BINDING_D3D11_KHR";
400 case XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR:
401 return "XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR";
402 case XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR:
403 return "XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR";
404 case XR_TYPE_GRAPHICS_BINDING_D3D12_KHR:
405 return "XR_TYPE_GRAPHICS_BINDING_D3D12_KHR";
406 case XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR:
407 return "XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR";
408 case XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR:
409 return "XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR";
410 case XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT:
411 return "XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT";
412 case XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT:
413 return "XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT";
414 case XR_TYPE_VISIBILITY_MASK_KHR:
415 return "XR_TYPE_VISIBILITY_MASK_KHR";
416 case XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR:
417 return "XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR";
418 case XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX:
419 return "XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX";
420 case XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX:
421 return "XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX";
422 case XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR:
423 return "XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR";
424 case XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT:
425 return "XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT";
426 case XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT:
427 return "XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT";
428 case XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT:
429 return "XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT";
430 case XR_TYPE_GRAPHICS_BINDING_EGL_MNDX:
431 return "XR_TYPE_GRAPHICS_BINDING_EGL_MNDX";
432 case XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT:
433 return "XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT";
434 case XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT:
435 return "XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT";
436 case XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT:
437 return "XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT";
438 case XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT:
439 return "XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT";
440 case XR_TYPE_HAND_JOINT_LOCATIONS_EXT:
441 return "XR_TYPE_HAND_JOINT_LOCATIONS_EXT";
442 case XR_TYPE_HAND_JOINT_VELOCITIES_EXT:
443 return "XR_TYPE_HAND_JOINT_VELOCITIES_EXT";
444 case XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT:
445 return "XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT";
446 case XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT:
447 return "XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT";
448 case XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT:
449 return "XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT";
450 case XR_TYPE_HAND_MESH_MSFT:
451 return "XR_TYPE_HAND_MESH_MSFT";
452 case XR_TYPE_HAND_POSE_TYPE_INFO_MSFT:
453 return "XR_TYPE_HAND_POSE_TYPE_INFO_MSFT";
454 case XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT:
455 return "XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT";
456 case XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT:
457 return "XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT";
458 case XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT:
459 return "XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT";
460 case XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT:
461 return "XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT";
462 case XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT:
463 return "XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT";
464 case XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT:
465 return "XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT";
466 case XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT:
467 return "XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT";
468 case XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT:
469 return "XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT";
470 case XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT:
471 return "XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT";
472 case XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT:
473 return "XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT";
474 case XR_TYPE_CONTROLLER_MODEL_STATE_MSFT:
475 return "XR_TYPE_CONTROLLER_MODEL_STATE_MSFT";
476 case XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC:
477 return "XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC";
478 case XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT:
479 return "XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT";
480 case XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB:
481 return "XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB";
482 case XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE:
483 return "XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE";
484 case XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR:
485 return "XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR";
486 case XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR:
487 return "XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR";
488 case XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR:
489 return "XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR";
490 case XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR:
491 return "XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR";
492 case XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR:
493 return "XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR";
494 case XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB:
495 return "XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB";
496 case XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB:
497 return "XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB";
498 case XR_TYPE_BINDING_MODIFICATIONS_KHR:
499 return "XR_TYPE_BINDING_MODIFICATIONS_KHR";
500 default:
501 return "UNRECOGNIZED_XR_TYPE";
502 }
503}
504
505VTK_ABI_NAMESPACE_END
506#endif
507// VTK-HeaderTest-Exclude: vtkOpenXRUtilities.h
represent and manipulate 4x4 transformation matrices
void DeepCopy(const vtkMatrix4x4 *source)
Set the elements of the matrix to the same values as the elements of the given source matrix.
double * GetData()
Returns the raw double array holding the matrix.
static void Transpose(const vtkMatrix4x4 *in, vtkMatrix4x4 *out)
Transpose the matrix and put it into out.
virtual void Modified()
Update the modification time for this object.
static void CreateFromQuaternion(double result[16], const XrQuaternionf &quat)
Given a quaternion, return elements of equivalent matrix as an array.
static void SetMatrixFromXrPose(vtkMatrix4x4 *result, const XrPosef &xrPose)
Given an XR pose (orientation quaternion + position vector), set the provided matrix from it.
vtkOpenXRUtilities()=default
static const char * GetActionTypeAsString(const XrActionType &actionType)
Return string representation of given XrActionType.
static const char * GetStructureTypeAsString(const XrStructureType &structureType)
Return string representation of given XrStructureType.
static const char * GetViewConfigurationTypeAsString(const XrViewConfigurationType &viewConfigType)
Return string representation of given XrViewConfigurationType.
static void CreateProjectionFov(vtkMatrix4x4 *result, XrFovf fov, float nearZ, float farZ)
Given a field of view (left, right, up, down angles) and near/far clipping builds,...
static vtkOpenXRUtilities * New()
~vtkOpenXRUtilities() override=default
static const XrPosef & GetIdentityPose()
Defines the OpenXR types and extensions common to all platforms.