diff --git a/com.htc.upm.vive.openxr/CHANGELOG.md b/com.htc.upm.vive.openxr/CHANGELOG.md new file mode 100644 index 0000000..7c8a4e3 --- /dev/null +++ b/com.htc.upm.vive.openxr/CHANGELOG.md @@ -0,0 +1,75 @@ +# **VIVE OpenXR Plugin - Windows** For Unity - v1.0.12 +Copyright HTC Corporation. All Rights Reserved. + +**VIVE OpenXR Plugin - Windows**: This plugin provides support for openxr based on the following specifications. + - [Vive Facial Tracking](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_HTC_facial_tracking) + - [Vive Cosmos Controller](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_HTC_vive_cosmos_controller_interaction) + - [Scene Understanding](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_MSFT_scene_understanding) + - [Hand Tracking](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_EXT_hand_tracking) + - [Vive Focus3 Controller](https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html#XR_HTC_vive_focus3_controller_interaction) + - [Hand Interaction](https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html#XR_HTC_hand_interaction) + - [Palm pose](https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html#XR_EXT_palm_pose) +--- +## Changes for v1.0.12 - 2023/06/02 + - Remove Eye gaze sample.It is recommended to use the Controller sample provided by the Unity OpenXR Plugin to test eye gaze. + +## Changes for v1.0.11 - 2023/02/16 + - Add openxr XR_EXT_palm_pose support for Vive Focus3 controller and Vive Cosmos controller. + - Add Hand Interaction extension support. + - Add hand interaction demo in hand tracking sample. + +## Changes for v1.0.10 - 2023/01/13 + - Add eye gaze sample. + +## Changes for v1.0.9 - 2022/11/10 + - Fix the dependency issue with OpenXR plugin. + + +## Changes for v1.0.8 - 2022/10/11 + - Update the package name from **Vive Wave OpenXR Plugin - Windows** to **VIVE OpenXR Plugin - Windows**. + - Fixed problem that blendshapes and input element columns of facial tracking sample not aligned correctly in Unity Inspector.​ + - Fix haptic problem for cosmos controller profile. + - Add Focus3 controller extension support. + +## Changes for v1.0.7 - 2022/09/26 + - Fixed function type conversion problem when using handtracking feature with other OpenXR features at the same time. + +## Changes for v1.0.6 - 2022/09/15 +### Vive Hand Tracking + - Fixed delay problem when locating controller with HandTracking extension. + +## Changes for v1.0.5 - 2022/06/24 + - Update documentation links for (1) Vive Facial Tracking (2) Vive Cosmos Controller (3) Scene Understanding (4) Hand Tracking. + - Refine plugin and sample for (1) Vive Facial Tracking (2) Hand Tracking. +### Vive Hand Tracking + - Implement extension XR_EXT_hand_joints_motion_range for Hand tracking. + - Fixed incorrect joint rotation. + +### Vive Facial Tracking + - Fixed incorrect eye gaze direction for sample. + +## Changes for v1.0.4 - 2022/4/28: + - Update the package name from **Vive OpenXR Plugin** to **VIVE Wave OpenXR Plugin - Windows**. + - Fixed missing material for Hand Tracking sample. + - Fixed Hand tracking sample crashed issue. + - Add 3D HandTracking Sample. + +## Changes for v1.0.3 - 2022/4/08: + - Refactor Hand Tracking sample. + - Fixed build error related to Scene Understanding plugin. + +## Changes for v1.0.2 - 2022/3/23: + - Add support for openxr hand tracking extension. + +## Changes for v1.0.1 - 2022/2/10: + +### Vive Cosmos Controller + - Correct the input path of menu key. + +### Scene Understanding + - Move Mesh subsystem from plugin part to sample code. + +## Changes for v1.0.0 - 2021/1/06: + +* This is the first release of Vive OpenXR Unity Plugin. + diff --git a/com.htc.upm.vive.openxr/CHANGELOG.md.meta b/com.htc.upm.vive.openxr/CHANGELOG.md.meta new file mode 100644 index 0000000..95f4e32 --- /dev/null +++ b/com.htc.upm.vive.openxr/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 246f86eb5fe015f4c8d5f3104a3ee3c0 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/Editor.meta b/com.htc.upm.vive.openxr/Editor.meta new file mode 100644 index 0000000..3a7981a --- /dev/null +++ b/com.htc.upm.vive.openxr/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 28769a4eba0d8bf448df06f6edc80599 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/Editor/FeatureSets.meta b/com.htc.upm.vive.openxr/Editor/FeatureSets.meta new file mode 100644 index 0000000..0519cfd --- /dev/null +++ b/com.htc.upm.vive.openxr/Editor/FeatureSets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ec562c28cd0f3494e93c60ccddce2117 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/Editor/FeatureSets/ViveFeatureSet.cs b/com.htc.upm.vive.openxr/Editor/FeatureSets/ViveFeatureSet.cs new file mode 100644 index 0000000..d06f364 --- /dev/null +++ b/com.htc.upm.vive.openxr/Editor/FeatureSets/ViveFeatureSet.cs @@ -0,0 +1,34 @@ +using UnityEditor; +using UnityEditor.XR.OpenXR.Features; + +namespace HTC.Vive.OpenXR.Editor +{ + [OpenXRFeatureSet( + FeatureSetId = featureSetId, + FeatureIds = new string[] + { + "com.htc.openxr.sceneunderstanding.feature", + "com.htc.openxr.facialtracking.feature", + "com.htc.openxr.feature.input.htcvivecosmos", + "com.company.openxr.handtracking.feature", + "com.htc.openxr.feature.input.htcvivefocus3", + "com.htc.openxr.feature.input.htcvivehandinteraction" + }, + DefaultFeatureIds = new string[] + { + "com.htc.openxr.sceneunderstanding.feature", + "com.htc.openxr.facialtracking.feature", + "com.htc.openxr.feature.input.htcvivecosmos", + "com.company.openxr.handtracking.feature", + "com.htc.openxr.feature.input.htcvivefocus3", + "com.htc.openxr.feature.input.htcvivehandinteraction" + }, + UiName = "VIVE OpenXR", + Description = "Enable the full suite of features for Vive OpenXR.", + SupportedBuildTargets = new BuildTargetGroup[] { BuildTargetGroup.Standalone } + )] + sealed class VIVEFeatureSet + { + internal const string featureSetId = "com.HTC.openxr.featureset.vive"; + } +} diff --git a/com.htc.upm.vive.openxr/Editor/FeatureSets/ViveFeatureSet.cs.meta b/com.htc.upm.vive.openxr/Editor/FeatureSets/ViveFeatureSet.cs.meta new file mode 100644 index 0000000..b8420de --- /dev/null +++ b/com.htc.upm.vive.openxr/Editor/FeatureSets/ViveFeatureSet.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 72994ea3e7babea4daa8c5d92f610bf3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/Editor/HTC.Vive.OpenXR.Editor.asmdef b/com.htc.upm.vive.openxr/Editor/HTC.Vive.OpenXR.Editor.asmdef new file mode 100644 index 0000000..b53e35f --- /dev/null +++ b/com.htc.upm.vive.openxr/Editor/HTC.Vive.OpenXR.Editor.asmdef @@ -0,0 +1,21 @@ +{ + "name": "HTC.Vive.OpenXR.Editor", + "rootNamespace": "HTC.Vive.OpenXR.Editor", + "references": [ + "GUID:e40ba710768534012815d3193fa296cb", + "GUID:f9fe0089ec81f4079af78eb2287a6163", + "GUID:4847341ff46394e83bb78fbd0652937e", + "GUID:96aa6ba065960476598f8f643e7252b6" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/Editor/HTC.Vive.OpenXR.Editor.asmdef.meta b/com.htc.upm.vive.openxr/Editor/HTC.Vive.OpenXR.Editor.asmdef.meta new file mode 100644 index 0000000..a8e6000 --- /dev/null +++ b/com.htc.upm.vive.openxr/Editor/HTC.Vive.OpenXR.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 09e2b6d68cbe25441a6d03f68841252e +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/HTC.VIVE.OPENXR.asmdef b/com.htc.upm.vive.openxr/HTC.VIVE.OPENXR.asmdef new file mode 100644 index 0000000..485b471 --- /dev/null +++ b/com.htc.upm.vive.openxr/HTC.VIVE.OPENXR.asmdef @@ -0,0 +1,18 @@ +{ + "name": "HTC.VIVE.OPENXR", + "rootNamespace": "", + "references": [ + "GUID:4847341ff46394e83bb78fbd0652937e", + "GUID:75469ad4d38634e559750d17036d5f7c", + "GUID:96aa6ba065960476598f8f643e7252b6" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/HTC.VIVE.OPENXR.asmdef.meta b/com.htc.upm.vive.openxr/HTC.VIVE.OPENXR.asmdef.meta new file mode 100644 index 0000000..1358951 --- /dev/null +++ b/com.htc.upm.vive.openxr/HTC.VIVE.OPENXR.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c34271c4bb951904aa11cacc978a4396 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/Include.meta b/com.htc.upm.vive.openxr/Include.meta new file mode 100644 index 0000000..abe05ee --- /dev/null +++ b/com.htc.upm.vive.openxr/Include.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3af3c139ab2eee9498a484a154cad9af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/Include/OpenXR.cs b/com.htc.upm.vive.openxr/Include/OpenXR.cs new file mode 100644 index 0000000..561a1d5 --- /dev/null +++ b/com.htc.upm.vive.openxr/Include/OpenXR.cs @@ -0,0 +1,1413 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using UnityEngine; + +namespace VIVE +{ + delegate int xrGetInstanceProcDelegate(ulong instance, string name, out IntPtr function); + + public enum XrStructureType + { + XR_TYPE_UNKNOWN = 0, + XR_TYPE_API_LAYER_PROPERTIES = 1, + XR_TYPE_EXTENSION_PROPERTIES = 2, + XR_TYPE_INSTANCE_CREATE_INFO = 3, + XR_TYPE_SYSTEM_GET_INFO = 4, + XR_TYPE_SYSTEM_PROPERTIES = 5, + XR_TYPE_VIEW_LOCATE_INFO = 6, + XR_TYPE_VIEW = 7, + XR_TYPE_SESSION_CREATE_INFO = 8, + XR_TYPE_SWAPCHAIN_CREATE_INFO = 9, + XR_TYPE_SESSION_BEGIN_INFO = 10, + XR_TYPE_VIEW_STATE = 11, + XR_TYPE_FRAME_END_INFO = 12, + XR_TYPE_HAPTIC_VIBRATION = 13, + XR_TYPE_EVENT_DATA_BUFFER = 16, + XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING = 17, + XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED = 18, + XR_TYPE_ACTION_STATE_BOOLEAN = 23, + XR_TYPE_ACTION_STATE_FLOAT = 24, + XR_TYPE_ACTION_STATE_VECTOR2F = 25, + XR_TYPE_ACTION_STATE_POSE = 27, + XR_TYPE_ACTION_SET_CREATE_INFO = 28, + XR_TYPE_ACTION_CREATE_INFO = 29, + XR_TYPE_INSTANCE_PROPERTIES = 32, + XR_TYPE_FRAME_WAIT_INFO = 33, + XR_TYPE_COMPOSITION_LAYER_PROJECTION = 35, + XR_TYPE_COMPOSITION_LAYER_QUAD = 36, + XR_TYPE_REFERENCE_SPACE_CREATE_INFO = 37, + XR_TYPE_ACTION_SPACE_CREATE_INFO = 38, + XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING = 40, + XR_TYPE_VIEW_CONFIGURATION_VIEW = 41, + XR_TYPE_SPACE_LOCATION = 42, + XR_TYPE_SPACE_VELOCITY = 43, + XR_TYPE_FRAME_STATE = 44, + XR_TYPE_VIEW_CONFIGURATION_PROPERTIES = 45, + XR_TYPE_FRAME_BEGIN_INFO = 46, + XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW = 48, + XR_TYPE_EVENT_DATA_EVENTS_LOST = 49, + XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING = 51, + XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED = 52, + XR_TYPE_INTERACTION_PROFILE_STATE = 53, + XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO = 55, + XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO = 56, + XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO = 57, + XR_TYPE_ACTION_STATE_GET_INFO = 58, + XR_TYPE_HAPTIC_ACTION_INFO = 59, + XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO = 60, + XR_TYPE_ACTIONS_SYNC_INFO = 61, + XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO = 62, + XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO = 63, + XR_TYPE_COMPOSITION_LAYER_CUBE_KHR = 1000006000, + XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR = 1000008000, + XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR = 1000010000, + XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR = 1000014000, + XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT = 1000015000, + XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR = 1000017000, + XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR = 1000018000, + XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000019000, + XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000019001, + XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000019002, + XR_TYPE_DEBUG_UTILS_LABEL_EXT = 1000019003, + XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR = 1000023000, + XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR = 1000023001, + XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR = 1000023002, + XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR = 1000023003, + XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR = 1000023004, + XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR = 1000023005, + XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR = 1000024001, + XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR = 1000024002, + XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR = 1000024003, + XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR = 1000025000, + XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR = 1000025001, + XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR = 1000025002, + XR_TYPE_GRAPHICS_BINDING_D3D11_KHR = 1000027000, + XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR = 1000027001, + XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR = 1000027002, + XR_TYPE_GRAPHICS_BINDING_D3D12_KHR = 1000028000, + XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR = 1000028001, + XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR = 1000028002, + XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT = 1000030000, + XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT = 1000030001, + XR_TYPE_VISIBILITY_MASK_KHR = 1000031000, + XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR = 1000031001, + XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX = 1000033000, + XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX = 1000033003, + XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR = 1000034000, + XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT = 1000039000, + XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT = 1000039001, + XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT = 1000046000, + XR_TYPE_GRAPHICS_BINDING_EGL_MNDX = 1000048004, + XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT = 1000049000, + XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT = 1000051000, + XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT = 1000051001, + XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT = 1000051002, + XR_TYPE_HAND_JOINT_LOCATIONS_EXT = 1000051003, + XR_TYPE_HAND_JOINT_VELOCITIES_EXT = 1000051004, + XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT = 1000052000, + XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT = 1000052001, + XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT = 1000052002, + XR_TYPE_HAND_MESH_MSFT = 1000052003, + XR_TYPE_HAND_POSE_TYPE_INFO_MSFT = 1000052004, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT = 1000053000, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT = 1000053001, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT = 1000053002, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT = 1000053003, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT = 1000053004, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT = 1000053005, + XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT = 1000055000, + XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT = 1000055001, + XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT = 1000055002, + XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT = 1000055003, + XR_TYPE_CONTROLLER_MODEL_STATE_MSFT = 1000055004, + XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC = 1000059000, + XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT = 1000063000, + XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB = 1000070000, + XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB = 1000071000, + XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB = 1000071001, + XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE = 1000079000, + XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT = 1000080000, + XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR = 1000089000, + XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR = 1000090000, + XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR = 1000090001, + XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR = 1000090003, + XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR = 1000091000, + XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT = 1000097000, + XR_TYPE_SCENE_CREATE_INFO_MSFT = 1000097001, + XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT = 1000097002, + XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT = 1000097003, + XR_TYPE_SCENE_COMPONENTS_MSFT = 1000097004, + XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT = 1000097005, + XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT = 1000097006, + XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT = 1000097007, + XR_TYPE_SCENE_OBJECTS_MSFT = 1000097008, + XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT = 1000097009, + XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT = 1000097010, + XR_TYPE_SCENE_PLANES_MSFT = 1000097011, + XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT = 1000097012, + XR_TYPE_SCENE_MESHES_MSFT = 1000097013, + XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT = 1000097014, + XR_TYPE_SCENE_MESH_BUFFERS_MSFT = 1000097015, + XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT = 1000097016, + XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT = 1000097017, + XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT = 1000097018, + XR_TYPE_SERIALIZED_SCENE_FRAGMENT_DATA_GET_INFO_MSFT = 1000098000, + XR_TYPE_SCENE_DESERIALIZE_INFO_MSFT = 1000098001, + XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB = 1000101000, + XR_TYPE_SYSTEM_PASS_THROUGH_PROPERTIES_HTC = 1000103000, + XR_TYPE_PASS_THROUGH_CREATE_INFO_HTC = 1000103001, + XR_TYPE_PASS_THROUGH_FRAME_HTC = 1000103002, + XR_TYPE_PASS_THROUGH_ACQUIRE_INFO_HTC = 1000103003, + XR_TYPE_EVENT_DATA_RUNTIME_EVENT_HTC = 1000103004, + XR_TYPE_SYSTEM_FACIAL_TRACKING_PROPERTIES_HTC = 1000104000, + XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC = 1000104001, + XR_TYPE_FACIAL_EXPRESSIONS_HTC = 1000104002, + XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB = 1000108000, + XR_TYPE_BINDING_MODIFICATIONS_KHR = 1000120000, + XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO = 1000121000, + XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO = 1000121001, + XR_TYPE_SYSTEM_FOVEATED_RENDERING_PROPERTIES_VARJO = 1000121002, + XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_VARJO = 1000122000, + XR_TYPE_GRAPHICS_BINDING_VULKAN2_KHR = XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR, + XR_TYPE_SWAPCHAIN_IMAGE_VULKAN2_KHR = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR, + XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN2_KHR = XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR, + XR_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF + } + public enum XrResult + { + XR_SUCCESS = 0, + XR_TIMEOUT_EXPIRED = 1, + XR_SESSION_LOSS_PENDING = 3, + XR_EVENT_UNAVAILABLE = 4, + XR_SPACE_BOUNDS_UNAVAILABLE = 7, + XR_SESSION_NOT_FOCUSED = 8, + XR_FRAME_DISCARDED = 9, + XR_ERROR_VALIDATION_FAILURE = -1, + XR_ERROR_RUNTIME_FAILURE = -2, + XR_ERROR_OUT_OF_MEMORY = -3, + XR_ERROR_API_VERSION_UNSUPPORTED = -4, + XR_ERROR_INITIALIZATION_FAILED = -6, + XR_ERROR_FUNCTION_UNSUPPORTED = -7, + XR_ERROR_FEATURE_UNSUPPORTED = -8, + XR_ERROR_EXTENSION_NOT_PRESENT = -9, + XR_ERROR_LIMIT_REACHED = -10, + XR_ERROR_SIZE_INSUFFICIENT = -11, + XR_ERROR_HANDLE_INVALID = -12, + XR_ERROR_INSTANCE_LOST = -13, + XR_ERROR_SESSION_RUNNING = -14, + XR_ERROR_SESSION_NOT_RUNNING = -16, + XR_ERROR_SESSION_LOST = -17, + XR_ERROR_SYSTEM_INVALID = -18, + XR_ERROR_PATH_INVALID = -19, + XR_ERROR_PATH_COUNT_EXCEEDED = -20, + XR_ERROR_PATH_FORMAT_INVALID = -21, + XR_ERROR_PATH_UNSUPPORTED = -22, + XR_ERROR_LAYER_INVALID = -23, + XR_ERROR_LAYER_LIMIT_EXCEEDED = -24, + XR_ERROR_SWAPCHAIN_RECT_INVALID = -25, + XR_ERROR_SWAPCHAIN_FORMAT_UNSUPPORTED = -26, + XR_ERROR_ACTION_TYPE_MISMATCH = -27, + XR_ERROR_SESSION_NOT_READY = -28, + XR_ERROR_SESSION_NOT_STOPPING = -29, + XR_ERROR_TIME_INVALID = -30, + XR_ERROR_REFERENCE_SPACE_UNSUPPORTED = -31, + XR_ERROR_FILE_ACCESS_ERROR = -32, + XR_ERROR_FILE_CONTENTS_INVALID = -33, + XR_ERROR_FORM_FACTOR_UNSUPPORTED = -34, + XR_ERROR_FORM_FACTOR_UNAVAILABLE = -35, + XR_ERROR_API_LAYER_NOT_PRESENT = -36, + XR_ERROR_CALL_ORDER_INVALID = -37, + XR_ERROR_GRAPHICS_DEVICE_INVALID = -38, + XR_ERROR_POSE_INVALID = -39, + XR_ERROR_INDEX_OUT_OF_RANGE = -40, + XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED = -41, + XR_ERROR_ENVIRONMENT_BLEND_MODE_UNSUPPORTED = -42, + XR_ERROR_NAME_DUPLICATED = -44, + XR_ERROR_NAME_INVALID = -45, + XR_ERROR_ACTIONSET_NOT_ATTACHED = -46, + XR_ERROR_ACTIONSETS_ALREADY_ATTACHED = -47, + XR_ERROR_LOCALIZED_NAME_DUPLICATED = -48, + XR_ERROR_LOCALIZED_NAME_INVALID = -49, + XR_ERROR_GRAPHICS_REQUIREMENTS_CALL_MISSING = -50, + XR_ERROR_RUNTIME_UNAVAILABLE = -51, + XR_ERROR_ANDROID_THREAD_SETTINGS_ID_INVALID_KHR = -1000003000, + XR_ERROR_ANDROID_THREAD_SETTINGS_FAILURE_KHR = -1000003001, + XR_ERROR_CREATE_SPATIAL_ANCHOR_FAILED_MSFT = -1000039001, + XR_ERROR_SECONDARY_VIEW_CONFIGURATION_TYPE_NOT_ENABLED_MSFT = -1000053000, + XR_ERROR_CONTROLLER_MODEL_KEY_INVALID_MSFT = -1000055000, + XR_ERROR_REPROJECTION_MODE_UNSUPPORTED_MSFT = -1000066000, + XR_ERROR_COMPUTE_NEW_SCENE_NOT_COMPLETED_MSFT = -1000097000, + XR_ERROR_SCENE_COMPONENT_ID_INVALID_MSFT = -1000097001, + XR_ERROR_SCENE_COMPONENT_TYPE_MISMATCH_MSFT = -1000097002, + XR_ERROR_SCENE_MESH_BUFFER_ID_INVALID_MSFT = -1000097003, + XR_ERROR_SCENE_COMPUTE_FEATURE_INCOMPATIBLE_MSFT = -1000097004, + XR_ERROR_SCENE_COMPUTE_CONSISTENCY_MISMATCH_MSFT = -1000097005, + XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB = -1000101000, + XR_ERROR_COLOR_SPACE_UNSUPPORTED_FB = -1000108000, + XR_ERROR_SPATIAL_ANCHOR_NAME_NOT_FOUND_MSFT = -1000142001, + XR_ERROR_SPATIAL_ANCHOR_NAME_INVALID_MSFT = -1000142002, + XR_RESULT_MAX_ENUM = 0x7FFFFFFF + } + + public struct XrSystemGraphicsProperties + { + public uint maxSwapchainImageHeight; + public uint maxSwapchainImageWidth; + public uint maxLayerCount; + } + + public struct XrSystemTrackingProperties + { + public uint orientationTracking; + public uint positionTracking; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSystemProperties + { + public XrStructureType type; + public IntPtr next; + public ulong systemId; + public uint vendorId; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] + public char[] systemName;//char systemName[XR_MAX_SYSTEM_NAME_SIZE]; + public XrSystemGraphicsProperties graphicsProperties; + public XrSystemTrackingProperties trackingProperties; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSystemFacialTrackingPropertiesHTC + { + public XrStructureType type; + public IntPtr next; + public uint supportEyeFacialTracking; + public uint supportLipFacialTracking; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrFacialExpressionsHTC + { + public XrStructureType type; + public IntPtr next; + public uint isActive; + public Int64 sampleTime; + public int expressionCount; + public IntPtr blendShapeWeightings; + public XrFacialExpressionsHTC(XrStructureType type_, IntPtr next_, uint isActive_, Int64 sampleTime_, int expressionCount_, IntPtr blendShapeWeightings_) + { + type = type_; + next = next_; + isActive = isActive_; + sampleTime = sampleTime_; + expressionCount = expressionCount_; + blendShapeWeightings = blendShapeWeightings_; + } + } + public struct XrFacialTrackerCreateInfoHTC + { + XrStructureType type; + public IntPtr next; + XrFacialTrackingTypeHTC expressionType; + public XrFacialTrackerCreateInfoHTC(XrStructureType type_, IntPtr next_, XrFacialTrackingTypeHTC expressionType_) + { + type = type_; + next = next_; + expressionType = expressionType_; + } + } + + public enum XrFacialTrackingTypeHTC + { + XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC = 1, + XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC = 2, + } + + public enum XrEyeShapeHTC + { + XR_EYE_SHAPE_NONE_HTC = -1, + XR_EYE_EXPRESSION_LEFT_BLINK_HTC = 0, + XR_EYE_EXPRESSION_LEFT_WIDE_HTC = 1, + XR_EYE_EXPRESSION_RIGHT_BLINK_HTC = 2, + XR_EYE_EXPRESSION_RIGHT_WIDE_HTC = 3, + XR_EYE_EXPRESSION_LEFT_SQUEEZE_HTC = 4, + XR_EYE_EXPRESSION_RIGHT_SQUEEZE_HTC = 5, + XR_EYE_EXPRESSION_LEFT_DOWN_HTC = 6, + XR_EYE_EXPRESSION_RIGHT_DOWN_HTC = 7, + XR_EYE_EXPRESSION_LEFT_OUT_HTC = 8, + XR_EYE_EXPRESSION_RIGHT_IN_HTC = 9, + XR_EYE_EXPRESSION_LEFT_IN_HTC = 10, + XR_EYE_EXPRESSION_RIGHT_OUT_HTC = 11, + XR_EYE_EXPRESSION_LEFT_UP_HTC = 12, + XR_EYE_EXPRESSION_RIGHT_UP_HTC = 13, + XR_EYE_EXPRESSION_MAX_ENUM_HTC = 14, + } + + public enum XrLipShapeHTC + { + XR_LIP_SHAPE_NONE_HTC = -1, + XR_LIP_SHAPE_JAW_RIGHT_HTC = 0, + XR_LIP_SHAPE_JAW_LEFT_HTC = 1, + XR_LIP_SHAPE_JAW_FORWARD_HTC = 2, + XR_LIP_SHAPE_JAW_OPEN_HTC = 3, + XR_LIP_SHAPE_MOUTH_APE_SHAPE_HTC = 4, + XR_LIP_SHAPE_MOUTH_UPPER_RIGHT_HTC = 5, + XR_LIP_SHAPE_MOUTH_UPPER_LEFT_HTC = 6, + XR_LIP_SHAPE_MOUTH_LOWER_RIGHT_HTC = 7, + XR_LIP_SHAPE_MOUTH_LOWER_LEFT_HTC = 8, + XR_LIP_SHAPE_MOUTH_UPPER_OVERTURN_HTC = 9, + XR_LIP_SHAPE_MOUTH_LOWER_OVERTURN_HTC = 10, + XR_LIP_SHAPE_MOUTH_POUT_HTC = 11, + XR_LIP_SHAPE_MOUTH_SMILE_RIGHT_HTC = 12, + XR_LIP_SHAPE_MOUTH_SMILE_LEFT_HTC = 13, + XR_LIP_SHAPE_MOUTH_SAD_RIGHT_HTC = 14, + XR_LIP_SHAPE_MOUTH_SAD_LEFT_HTC = 15, + XR_LIP_SHAPE_CHEEK_PUFF_RIGHT_HTC = 16, + XR_LIP_SHAPE_CHEEK_PUFF_LEFT_HTC = 17, + XR_LIP_SHAPE_CHEEK_SUCK_HTC = 18, + XR_LIP_SHAPE_MOUTH_UPPER_UPRIGHT_HTC = 19, + XR_LIP_SHAPE_MOUTH_UPPER_UPLEFT_HTC = 20, + XR_LIP_SHAPE_MOUTH_LOWER_DOWNRIGHT_HTC = 21, + XR_LIP_SHAPE_MOUTH_LOWER_DOWNLEFT_HTC = 22, + XR_LIP_SHAPE_MOUTH_UPPER_INSIDE_HTC = 23, + XR_LIP_SHAPE_MOUTH_LOWER_INSIDE_HTC = 24, + XR_LIP_SHAPE_MOUTH_LOWER_OVERLAY_HTC = 25, + XR_LIP_SHAPE_TONGUE_LONGSTEP1_HTC = 26, + XR_LIP_SHAPE_TONGUE_LEFT_HTC = 27, + XR_LIP_SHAPE_TONGUE_RIGHT_HTC = 28, + XR_LIP_SHAPE_TONGUE_UP_HTC = 29, + XR_LIP_SHAPE_TONGUE_DOWN_HTC = 30, + XR_LIP_SHAPE_TONGUE_ROLL_HTC = 31, + XR_LIP_SHAPE_TONGUE_LONGSTEP2_HTC = 32, + XR_LIP_SHAPE_TONGUE_UPRIGHT_MORPH_HTC = 33, + XR_LIP_SHAPE_TONGUE_UPLEFT_MORPH_HTC = 34, + XR_LIP_SHAPE_TONGUE_DOWNRIGHT_MORPH_HTC = 35, + XR_LIP_SHAPE_TONGUE_DOWNLEFT_MORPH_HTC = 36, + XR_LIP_SHAPE_MAX_ENUM_HTC = 37 + } + + public struct XrFrameWaitInfo + { + public XrStructureType type; + public IntPtr next; + public XrFrameWaitInfo(IntPtr next_, XrStructureType type_) + { + next = next_; + type = type_; + } + } + + public struct XrFrameState + { + public XrStructureType type; + public IntPtr next; + public Int64 predictedDisplayTime; + public Int64 predictedDisplayPeriod; + public bool shouldRender; + } + + public struct XrVector3f + { + public float x; + public float y; + public float z; + public XrVector3f(float x_, float y_, float z_) + { + x = x_; + y = y_; + z = z_; + } + } + + public struct XrQuaternionf + { + public float x; + public float y; + public float z; + public float w; + public XrQuaternionf(float x_, float y_, float z_, float w_) + { + x = x_; + y = y_; + z = z_; + w = w_; + } + } + + public struct XrPosef + { + public XrQuaternionf orientation; + public XrVector3f position; + } + + #region XRSPace + [Flags] + public enum XrSpaceLocationFlags : UInt64 + { + XR_SPACE_LOCATION_ORIENTATION_VALID_BIT = 0x00000001, + XR_SPACE_LOCATION_POSITION_VALID_BIT = 0x00000002, + XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT = 0x00000004, + XR_SPACE_LOCATION_POSITION_TRACKED_BIT = 0x00000008, + } + + public enum XrReferenceSpaceType + { + XR_REFERENCE_SPACE_TYPE_VIEW = 1, + XR_REFERENCE_SPACE_TYPE_LOCAL = 2, + XR_REFERENCE_SPACE_TYPE_STAGE = 3, + XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT = 1000038000, + XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO = 1000121000, + XR_REFERENCE_SPACE_TYPE_MAX_ENUM = 0x7FFFFFFF + } + + public struct XrReferenceSpaceCreateInfo + { + public XrStructureType type; + public IntPtr next; + public XrReferenceSpaceType referencespacetype; + public XrPosef poseInReferenceSpace; + } + #endregion + + namespace HandTracking + { + public enum XrResult + { + XR_SUCCESS = 0, + XR_TIMEOUT_EXPIRED = 1, + XR_SESSION_LOSS_PENDING = 3, + XR_EVENT_UNAVAILABLE = 4, + XR_SPACE_BOUNDS_UNAVAILABLE = 7, + XR_SESSION_NOT_FOCUSED = 8, + XR_FRAME_DISCARDED = 9, + XR_ERROR_VALIDATION_FAILURE = -1, + XR_ERROR_RUNTIME_FAILURE = -2, + XR_ERROR_OUT_OF_MEMORY = -3, + XR_ERROR_API_VERSION_UNSUPPORTED = -4, + XR_ERROR_INITIALIZATION_FAILED = -6, + XR_ERROR_FUNCTION_UNSUPPORTED = -7, + XR_ERROR_FEATURE_UNSUPPORTED = -8, + XR_ERROR_EXTENSION_NOT_PRESENT = -9, + XR_ERROR_LIMIT_REACHED = -10, + XR_ERROR_SIZE_INSUFFICIENT = -11, + XR_ERROR_HANDLE_INVALID = -12, + XR_ERROR_INSTANCE_LOST = -13, + XR_ERROR_SESSION_RUNNING = -14, + XR_ERROR_SESSION_NOT_RUNNING = -16, + XR_ERROR_SESSION_LOST = -17, + XR_ERROR_SYSTEM_INVALID = -18, + XR_ERROR_PATH_INVALID = -19, + XR_ERROR_PATH_COUNT_EXCEEDED = -20, + XR_ERROR_PATH_FORMAT_INVALID = -21, + XR_ERROR_PATH_UNSUPPORTED = -22, + XR_ERROR_LAYER_INVALID = -23, + XR_ERROR_LAYER_LIMIT_EXCEEDED = -24, + XR_ERROR_SWAPCHAIN_RECT_INVALID = -25, + XR_ERROR_SWAPCHAIN_FORMAT_UNSUPPORTED = -26, + XR_ERROR_ACTION_TYPE_MISMATCH = -27, + XR_ERROR_SESSION_NOT_READY = -28, + XR_ERROR_SESSION_NOT_STOPPING = -29, + XR_ERROR_TIME_INVALID = -30, + XR_ERROR_REFERENCE_SPACE_UNSUPPORTED = -31, + XR_ERROR_FILE_ACCESS_ERROR = -32, + XR_ERROR_FILE_CONTENTS_INVALID = -33, + XR_ERROR_FORM_FACTOR_UNSUPPORTED = -34, + XR_ERROR_FORM_FACTOR_UNAVAILABLE = -35, + XR_ERROR_API_LAYER_NOT_PRESENT = -36, + XR_ERROR_CALL_ORDER_INVALID = -37, + XR_ERROR_GRAPHICS_DEVICE_INVALID = -38, + XR_ERROR_POSE_INVALID = -39, + XR_ERROR_INDEX_OUT_OF_RANGE = -40, + XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED = -41, + XR_ERROR_ENVIRONMENT_BLEND_MODE_UNSUPPORTED = -42, + XR_ERROR_NAME_DUPLICATED = -44, + XR_ERROR_NAME_INVALID = -45, + XR_ERROR_ACTIONSET_NOT_ATTACHED = -46, + XR_ERROR_ACTIONSETS_ALREADY_ATTACHED = -47, + XR_ERROR_LOCALIZED_NAME_DUPLICATED = -48, + XR_ERROR_LOCALIZED_NAME_INVALID = -49, + XR_ERROR_GRAPHICS_REQUIREMENTS_CALL_MISSING = -50, + XR_ERROR_RUNTIME_UNAVAILABLE = -51, + XR_ERROR_ANDROID_THREAD_SETTINGS_ID_INVALID_KHR = -1000003000, + XR_ERROR_ANDROID_THREAD_SETTINGS_FAILURE_KHR = -1000003001, + XR_ERROR_CREATE_SPATIAL_ANCHOR_FAILED_MSFT = -1000039001, + XR_ERROR_SECONDARY_VIEW_CONFIGURATION_TYPE_NOT_ENABLED_MSFT = -1000053000, + XR_ERROR_CONTROLLER_MODEL_KEY_INVALID_MSFT = -1000055000, + XR_ERROR_REPROJECTION_MODE_UNSUPPORTED_MSFT = -1000066000, + XR_ERROR_COMPUTE_NEW_SCENE_NOT_COMPLETED_MSFT = -1000097000, + XR_ERROR_SCENE_COMPONENT_ID_INVALID_MSFT = -1000097001, + XR_ERROR_SCENE_COMPONENT_TYPE_MISMATCH_MSFT = -1000097002, + XR_ERROR_SCENE_MESH_BUFFER_ID_INVALID_MSFT = -1000097003, + XR_ERROR_SCENE_COMPUTE_FEATURE_INCOMPATIBLE_MSFT = -1000097004, + XR_ERROR_SCENE_COMPUTE_CONSISTENCY_MISMATCH_MSFT = -1000097005, + XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB = -1000101000, + XR_ERROR_COLOR_SPACE_UNSUPPORTED_FB = -1000108000, + XR_ERROR_SPATIAL_ANCHOR_NAME_NOT_FOUND_MSFT = -1000142001, + XR_ERROR_SPATIAL_ANCHOR_NAME_INVALID_MSFT = -1000142002, + XR_RESULT_MAX_ENUM = 0x7FFFFFFF + } + public struct XrVector3f + { + public float x; + public float y; + public float z; + public XrVector3f(float x_, float y_, float z_) + { + x = x_; + y = y_; + z = z_; + } + } + + public struct XrQuaternionf + { + public float x; + public float y; + public float z; + public float w; + public XrQuaternionf(float x_, float y_, float z_, float w_) + { + x = x_; + y = y_; + z = z_; + w = w_; + } + } + + public struct XrPosef + { + public XrQuaternionf orientation; + public XrVector3f position; + } + public enum XrHandJointEXT + { + XR_HAND_JOINT_PALM_EXT = 0, + XR_HAND_JOINT_WRIST_EXT = 1, + XR_HAND_JOINT_THUMB_METACARPAL_EXT = 2, + XR_HAND_JOINT_THUMB_PROXIMAL_EXT = 3, + XR_HAND_JOINT_THUMB_DISTAL_EXT = 4, + XR_HAND_JOINT_THUMB_TIP_EXT = 5, + XR_HAND_JOINT_INDEX_METACARPAL_EXT = 6, + XR_HAND_JOINT_INDEX_PROXIMAL_EXT = 7, + XR_HAND_JOINT_INDEX_INTERMEDIATE_EXT = 8, + XR_HAND_JOINT_INDEX_DISTAL_EXT = 9, + XR_HAND_JOINT_INDEX_TIP_EXT = 10, + XR_HAND_JOINT_MIDDLE_METACARPAL_EXT = 11, + XR_HAND_JOINT_MIDDLE_PROXIMAL_EXT = 12, + XR_HAND_JOINT_MIDDLE_INTERMEDIATE_EXT = 13, + XR_HAND_JOINT_MIDDLE_DISTAL_EXT = 14, + XR_HAND_JOINT_MIDDLE_TIP_EXT = 15, + XR_HAND_JOINT_RING_METACARPAL_EXT = 16, + XR_HAND_JOINT_RING_PROXIMAL_EXT = 17, + XR_HAND_JOINT_RING_INTERMEDIATE_EXT = 18, + XR_HAND_JOINT_RING_DISTAL_EXT = 19, + XR_HAND_JOINT_RING_TIP_EXT = 20, + XR_HAND_JOINT_LITTLE_METACARPAL_EXT = 21, + XR_HAND_JOINT_LITTLE_PROXIMAL_EXT = 22, + XR_HAND_JOINT_LITTLE_INTERMEDIATE_EXT = 23, + XR_HAND_JOINT_LITTLE_DISTAL_EXT = 24, + XR_HAND_JOINT_LITTLE_TIP_EXT = 25, + XR_HAND_JOINT_MAX_ENUM_EXT = 26 + } + public enum XrHandEXT + { + XR_HAND_LEFT_EXT = 1, + XR_HAND_RIGHT_EXT = 2, + XR_HAND_MAX_ENUM_EXT = 0x7FFFFFFF + } + + public enum XrHandJointSetEXT + { + XR_HAND_JOINT_SET_DEFAULT_EXT = 0, + XR_HAND_JOINT_SET_HAND_WITH_FOREARM_ULTRALEAP = 1000149000, + XR_HAND_JOINT_SET_MAX_ENUM_EXT = 0x7FFFFFFF + } + public struct XrSystemHandTrackingPropertiesEXT + { + public XrStructureType type; + public IntPtr next; + public uint supportsHandTracking; + } + + public struct XrHandJointsLocateInfoEXT + { + public XrStructureType type; + public IntPtr next; + public ulong baseSpace; //XrSpace + public Int64 time; + + public XrHandJointsLocateInfoEXT(XrStructureType type_, ref IntPtr next_, ulong baseSpace_, Int64 time_) + { + type = type_; + next = next_; + baseSpace = baseSpace_; + time = time_; + } + } + + public struct XrHandJointLocationsEXT + { + public XrStructureType type; + public IntPtr next; + public uint isActive; + public int jointCount; + public IntPtr jointLocations; // XrHandJointLocationEXT* + + public XrHandJointLocationsEXT(XrStructureType type_, IntPtr next_, uint isActive_, int jointCount_, IntPtr jointLocations_) + { + type = type_; + next = next_; + isActive = isActive_; + jointCount = jointCount_; + jointLocations = jointLocations_; + } + } + + public struct XrHandJointsMotionRangeInfoEXT // chain under XrHandJointsLocateInfoEXT + { + public XrStructureType type; + public IntPtr next; + public XrHandJointsMotionRangeEXT handJointsMotionRange; + } + + public struct XrHandJointLocationEXT + { + public UInt64 locationFlags; // XrSpaceLocationFlags + public XrPosef pose; + public float radius; + } + + public struct XrHandTrackerCreateInfoEXT + { + public XrStructureType type; + public IntPtr next; + public XrHandEXT hand; + public XrHandJointSetEXT handJointSet; + + public XrHandTrackerCreateInfoEXT(XrStructureType type_, IntPtr next_, XrHandEXT hand_, XrHandJointSetEXT handJointSet_) + { + type = type_; + next = next_; + hand = hand_; + handJointSet = handJointSet_; + } + } + + public struct XrHandJointVelocitiesEXT // chain under XrHandJointLocationsEXT + { + public XrStructureType type; + public IntPtr next; + public UInt32 jointCount; + public IntPtr jointVelocities; // XrHandJointVelocitiesEXT* + } + + public struct XrHandJointVelocityEXT + { + public XrSpaceVelocityFlags velocityFlags; + public XrVector3f linearVelocity; + public XrVector3f angularVelocity; + } + + [Flags] + public enum XrSpaceVelocityFlags : UInt64 + { + XR_SPACE_VELOCITY_LINEAR_VALID_BIT = 0x00000001, + XR_SPACE_VELOCITY_ANGULAR_VALID_BIT = 0x00000002, + } + #region XRSPace + [Flags] + public enum XrSpaceLocationFlags : UInt64 + { + XR_SPACE_LOCATION_ORIENTATION_VALID_BIT = 0x00000001, + XR_SPACE_LOCATION_POSITION_VALID_BIT = 0x00000002, + XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT = 0x00000004, + XR_SPACE_LOCATION_POSITION_TRACKED_BIT = 0x00000008, + } + + public enum XrReferenceSpaceType + { + XR_REFERENCE_SPACE_TYPE_VIEW = 1, + XR_REFERENCE_SPACE_TYPE_LOCAL = 2, + XR_REFERENCE_SPACE_TYPE_STAGE = 3, + XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT = 1000038000, + XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO = 1000121000, + XR_REFERENCE_SPACE_TYPE_MAX_ENUM = 0x7FFFFFFF + } + + public struct XrReferenceSpaceCreateInfo + { + public XrStructureType type; + public IntPtr next; + public XrReferenceSpaceType referencespacetype; + public XrPosef poseInReferenceSpace; + } + #endregion + + public enum XrHandJointsMotionRangeEXT + { + XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT = 1, + XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT = 2, + XR_HAND_JOINTS_MOTION_RANGE_MAX_ENUM_EXT = 0x7FFFFFFF + } + } + + + + + + public struct XrFovf + { + public float angleLeft; + public float angleRight; + public float angleUp; + public float angleDown; + } + + public struct XrExtent2Df + { + public float width; + public float height; + } + + + namespace SceneUnderstanding + { + public struct XrSystemTrackingProperties + { + public uint orientationTracking; + public uint positionTracking; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSystemProperties + { + public XrStructureType type; + public IntPtr next; + public ulong systemId; + public uint vendorId; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] + public char[] systemName;//char systemName[XR_MAX_SYSTEM_NAME_SIZE]; + public XrSystemGraphicsProperties graphicsProperties; + public XrSystemTrackingProperties trackingProperties; + } + public enum XrStructureType + { + XR_TYPE_UNKNOWN = 0, + XR_TYPE_API_LAYER_PROPERTIES = 1, + XR_TYPE_EXTENSION_PROPERTIES = 2, + XR_TYPE_INSTANCE_CREATE_INFO = 3, + XR_TYPE_SYSTEM_GET_INFO = 4, + XR_TYPE_SYSTEM_PROPERTIES = 5, + XR_TYPE_VIEW_LOCATE_INFO = 6, + XR_TYPE_VIEW = 7, + XR_TYPE_SESSION_CREATE_INFO = 8, + XR_TYPE_SWAPCHAIN_CREATE_INFO = 9, + XR_TYPE_SESSION_BEGIN_INFO = 10, + XR_TYPE_VIEW_STATE = 11, + XR_TYPE_FRAME_END_INFO = 12, + XR_TYPE_HAPTIC_VIBRATION = 13, + XR_TYPE_EVENT_DATA_BUFFER = 16, + XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING = 17, + XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED = 18, + XR_TYPE_ACTION_STATE_BOOLEAN = 23, + XR_TYPE_ACTION_STATE_FLOAT = 24, + XR_TYPE_ACTION_STATE_VECTOR2F = 25, + XR_TYPE_ACTION_STATE_POSE = 27, + XR_TYPE_ACTION_SET_CREATE_INFO = 28, + XR_TYPE_ACTION_CREATE_INFO = 29, + XR_TYPE_INSTANCE_PROPERTIES = 32, + XR_TYPE_FRAME_WAIT_INFO = 33, + XR_TYPE_COMPOSITION_LAYER_PROJECTION = 35, + XR_TYPE_COMPOSITION_LAYER_QUAD = 36, + XR_TYPE_REFERENCE_SPACE_CREATE_INFO = 37, + XR_TYPE_ACTION_SPACE_CREATE_INFO = 38, + XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING = 40, + XR_TYPE_VIEW_CONFIGURATION_VIEW = 41, + XR_TYPE_SPACE_LOCATION = 42, + XR_TYPE_SPACE_VELOCITY = 43, + XR_TYPE_FRAME_STATE = 44, + XR_TYPE_VIEW_CONFIGURATION_PROPERTIES = 45, + XR_TYPE_FRAME_BEGIN_INFO = 46, + XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW = 48, + XR_TYPE_EVENT_DATA_EVENTS_LOST = 49, + XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING = 51, + XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED = 52, + XR_TYPE_INTERACTION_PROFILE_STATE = 53, + XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO = 55, + XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO = 56, + XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO = 57, + XR_TYPE_ACTION_STATE_GET_INFO = 58, + XR_TYPE_HAPTIC_ACTION_INFO = 59, + XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO = 60, + XR_TYPE_ACTIONS_SYNC_INFO = 61, + XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO = 62, + XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO = 63, + XR_TYPE_COMPOSITION_LAYER_CUBE_KHR = 1000006000, + XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR = 1000008000, + XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR = 1000010000, + XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR = 1000014000, + XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT = 1000015000, + XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR = 1000017000, + XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR = 1000018000, + XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000019000, + XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000019001, + XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000019002, + XR_TYPE_DEBUG_UTILS_LABEL_EXT = 1000019003, + XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR = 1000023000, + XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR = 1000023001, + XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR = 1000023002, + XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR = 1000023003, + XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR = 1000023004, + XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR = 1000023005, + XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR = 1000024001, + XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR = 1000024002, + XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR = 1000024003, + XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR = 1000025000, + XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR = 1000025001, + XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR = 1000025002, + XR_TYPE_GRAPHICS_BINDING_D3D11_KHR = 1000027000, + XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR = 1000027001, + XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR = 1000027002, + XR_TYPE_GRAPHICS_BINDING_D3D12_KHR = 1000028000, + XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR = 1000028001, + XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR = 1000028002, + XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT = 1000030000, + XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT = 1000030001, + XR_TYPE_VISIBILITY_MASK_KHR = 1000031000, + XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR = 1000031001, + XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX = 1000033000, + XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX = 1000033003, + XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR = 1000034000, + XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT = 1000039000, + XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT = 1000039001, + XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT = 1000046000, + XR_TYPE_GRAPHICS_BINDING_EGL_MNDX = 1000048004, + XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT = 1000049000, + XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT = 1000051000, + XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT = 1000051001, + XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT = 1000051002, + XR_TYPE_HAND_JOINT_LOCATIONS_EXT = 1000051003, + XR_TYPE_HAND_JOINT_VELOCITIES_EXT = 1000051004, + XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT = 1000052000, + XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT = 1000052001, + XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT = 1000052002, + XR_TYPE_HAND_MESH_MSFT = 1000052003, + XR_TYPE_HAND_POSE_TYPE_INFO_MSFT = 1000052004, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT = 1000053000, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT = 1000053001, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT = 1000053002, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT = 1000053003, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT = 1000053004, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT = 1000053005, + XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT = 1000055000, + XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT = 1000055001, + XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT = 1000055002, + XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT = 1000055003, + XR_TYPE_CONTROLLER_MODEL_STATE_MSFT = 1000055004, + XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC = 1000059000, + XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT = 1000063000, + XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB = 1000070000, + XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB = 1000071000, + XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB = 1000071001, + XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE = 1000079000, + XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT = 1000080000, + XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR = 1000089000, + XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR = 1000090000, + XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR = 1000090001, + XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR = 1000090003, + XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR = 1000091000, + XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT = 1000097000, + XR_TYPE_SCENE_CREATE_INFO_MSFT = 1000097001, + XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT = 1000097002, + XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT = 1000097003, + XR_TYPE_SCENE_COMPONENTS_MSFT = 1000097004, + XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT = 1000097005, + XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT = 1000097006, + XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT = 1000097007, + XR_TYPE_SCENE_OBJECTS_MSFT = 1000097008, + XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT = 1000097009, + XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT = 1000097010, + XR_TYPE_SCENE_PLANES_MSFT = 1000097011, + XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT = 1000097012, + XR_TYPE_SCENE_MESHES_MSFT = 1000097013, + XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT = 1000097014, + XR_TYPE_SCENE_MESH_BUFFERS_MSFT = 1000097015, + XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT = 1000097016, + XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT = 1000097017, + XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT = 1000097018, + XR_TYPE_SERIALIZED_SCENE_FRAGMENT_DATA_GET_INFO_MSFT = 1000098000, + XR_TYPE_SCENE_DESERIALIZE_INFO_MSFT = 1000098001, + XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB = 1000101000, + XR_TYPE_SYSTEM_PASS_THROUGH_PROPERTIES_HTC = 1000103000, + XR_TYPE_PASS_THROUGH_CREATE_INFO_HTC = 1000103001, + XR_TYPE_PASS_THROUGH_FRAME_HTC = 1000103002, + XR_TYPE_PASS_THROUGH_ACQUIRE_INFO_HTC = 1000103003, + XR_TYPE_EVENT_DATA_RUNTIME_EVENT_HTC = 1000103004, + XR_TYPE_SYSTEM_FACIAL_TRACKING_PROPERTIES_HTC = 1000104000, + XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC = 1000104001, + XR_TYPE_FACIAL_EXPRESSIONS_HTC = 1000104002, + XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB = 1000108000, + XR_TYPE_BINDING_MODIFICATIONS_KHR = 1000120000, + XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO = 1000121000, + XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO = 1000121001, + XR_TYPE_SYSTEM_FOVEATED_RENDERING_PROPERTIES_VARJO = 1000121002, + XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_VARJO = 1000122000, + XR_TYPE_GRAPHICS_BINDING_VULKAN2_KHR = XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR, + XR_TYPE_SWAPCHAIN_IMAGE_VULKAN2_KHR = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR, + XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN2_KHR = XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR, + XR_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF + } + public enum XrResult + { + XR_SUCCESS = 0, + XR_TIMEOUT_EXPIRED = 1, + XR_SESSION_LOSS_PENDING = 3, + XR_EVENT_UNAVAILABLE = 4, + XR_SPACE_BOUNDS_UNAVAILABLE = 7, + XR_SESSION_NOT_FOCUSED = 8, + XR_FRAME_DISCARDED = 9, + XR_ERROR_VALIDATION_FAILURE = -1, + XR_ERROR_RUNTIME_FAILURE = -2, + XR_ERROR_OUT_OF_MEMORY = -3, + XR_ERROR_API_VERSION_UNSUPPORTED = -4, + XR_ERROR_INITIALIZATION_FAILED = -6, + XR_ERROR_FUNCTION_UNSUPPORTED = -7, + XR_ERROR_FEATURE_UNSUPPORTED = -8, + XR_ERROR_EXTENSION_NOT_PRESENT = -9, + XR_ERROR_LIMIT_REACHED = -10, + XR_ERROR_SIZE_INSUFFICIENT = -11, + XR_ERROR_HANDLE_INVALID = -12, + XR_ERROR_INSTANCE_LOST = -13, + XR_ERROR_SESSION_RUNNING = -14, + XR_ERROR_SESSION_NOT_RUNNING = -16, + XR_ERROR_SESSION_LOST = -17, + XR_ERROR_SYSTEM_INVALID = -18, + XR_ERROR_PATH_INVALID = -19, + XR_ERROR_PATH_COUNT_EXCEEDED = -20, + XR_ERROR_PATH_FORMAT_INVALID = -21, + XR_ERROR_PATH_UNSUPPORTED = -22, + XR_ERROR_LAYER_INVALID = -23, + XR_ERROR_LAYER_LIMIT_EXCEEDED = -24, + XR_ERROR_SWAPCHAIN_RECT_INVALID = -25, + XR_ERROR_SWAPCHAIN_FORMAT_UNSUPPORTED = -26, + XR_ERROR_ACTION_TYPE_MISMATCH = -27, + XR_ERROR_SESSION_NOT_READY = -28, + XR_ERROR_SESSION_NOT_STOPPING = -29, + XR_ERROR_TIME_INVALID = -30, + XR_ERROR_REFERENCE_SPACE_UNSUPPORTED = -31, + XR_ERROR_FILE_ACCESS_ERROR = -32, + XR_ERROR_FILE_CONTENTS_INVALID = -33, + XR_ERROR_FORM_FACTOR_UNSUPPORTED = -34, + XR_ERROR_FORM_FACTOR_UNAVAILABLE = -35, + XR_ERROR_API_LAYER_NOT_PRESENT = -36, + XR_ERROR_CALL_ORDER_INVALID = -37, + XR_ERROR_GRAPHICS_DEVICE_INVALID = -38, + XR_ERROR_POSE_INVALID = -39, + XR_ERROR_INDEX_OUT_OF_RANGE = -40, + XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED = -41, + XR_ERROR_ENVIRONMENT_BLEND_MODE_UNSUPPORTED = -42, + XR_ERROR_NAME_DUPLICATED = -44, + XR_ERROR_NAME_INVALID = -45, + XR_ERROR_ACTIONSET_NOT_ATTACHED = -46, + XR_ERROR_ACTIONSETS_ALREADY_ATTACHED = -47, + XR_ERROR_LOCALIZED_NAME_DUPLICATED = -48, + XR_ERROR_LOCALIZED_NAME_INVALID = -49, + XR_ERROR_GRAPHICS_REQUIREMENTS_CALL_MISSING = -50, + XR_ERROR_RUNTIME_UNAVAILABLE = -51, + XR_ERROR_ANDROID_THREAD_SETTINGS_ID_INVALID_KHR = -1000003000, + XR_ERROR_ANDROID_THREAD_SETTINGS_FAILURE_KHR = -1000003001, + XR_ERROR_CREATE_SPATIAL_ANCHOR_FAILED_MSFT = -1000039001, + XR_ERROR_SECONDARY_VIEW_CONFIGURATION_TYPE_NOT_ENABLED_MSFT = -1000053000, + XR_ERROR_CONTROLLER_MODEL_KEY_INVALID_MSFT = -1000055000, + XR_ERROR_REPROJECTION_MODE_UNSUPPORTED_MSFT = -1000066000, + XR_ERROR_COMPUTE_NEW_SCENE_NOT_COMPLETED_MSFT = -1000097000, + XR_ERROR_SCENE_COMPONENT_ID_INVALID_MSFT = -1000097001, + XR_ERROR_SCENE_COMPONENT_TYPE_MISMATCH_MSFT = -1000097002, + XR_ERROR_SCENE_MESH_BUFFER_ID_INVALID_MSFT = -1000097003, + XR_ERROR_SCENE_COMPUTE_FEATURE_INCOMPATIBLE_MSFT = -1000097004, + XR_ERROR_SCENE_COMPUTE_CONSISTENCY_MISMATCH_MSFT = -1000097005, + XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB = -1000101000, + XR_ERROR_COLOR_SPACE_UNSUPPORTED_FB = -1000108000, + XR_ERROR_SPATIAL_ANCHOR_NAME_NOT_FOUND_MSFT = -1000142001, + XR_ERROR_SPATIAL_ANCHOR_NAME_INVALID_MSFT = -1000142002, + XR_RESULT_MAX_ENUM = 0x7FFFFFFF + } + public enum XrSceneComputeConsistencyMSFT + { + SnapshotComplete = 1, + SnapshotIncompleteFast = 2, + OcclusionOptimized = 3, + } + + public enum XrSceneBoundType + { + Sphere = 1, + OrientedBox = 2, + Frustum = 3, + } + + #region XR_MSFT_scene_understanding + + public enum XrSceneComputeFeatureMSFT + { + XR_SCENE_COMPUTE_FEATURE_PLANE_MSFT = 1, + XR_SCENE_COMPUTE_FEATURE_PLANE_MESH_MSFT = 2, + XR_SCENE_COMPUTE_FEATURE_VISUAL_MESH_MSFT = 3, + XR_SCENE_COMPUTE_FEATURE_COLLIDER_MESH_MSFT = 4, + XR_SCENE_COMPUTE_FEATURE_SERIALIZE_SCENE_MSFT = 1000098000, + XR_SCENE_COMPUTE_FEATURE_OCCLUSION_HINT_MSFT = 1000099000, + XR_SCENE_COMPUTE_FEATURE_MAX_ENUM_MSFT = 0x7FFFFFFF + } + + public enum XrMeshComputeLodMSFT + { + Coarse = 1, + Medium = 2, + Fine = 3, + Unlimited = 4, + } + + public enum XrSceneComponentTypeMSFT + { + XR_SCENE_COMPONENT_TYPE_INVALID_MSFT = -1, + XR_SCENE_COMPONENT_TYPE_OBJECT_MSFT = 1, + XR_SCENE_COMPONENT_TYPE_PLANE_MSFT = 2, + XR_SCENE_COMPONENT_TYPE_VISUAL_MESH_MSFT = 3, + XR_SCENE_COMPONENT_TYPE_COLLIDER_MESH_MSFT = 4, + XR_SCENE_COMPONENT_TYPE_SERIALIZED_SCENE_FRAGMENT_MSFT = 1000098000, + XR_SCENE_COMPONENT_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF + } + + public enum XrSceneObjectTypeMSFT + { + XR_SCENE_OBJECT_TYPE_UNCATEGORIZED_MSFT = -1, + XR_SCENE_OBJECT_TYPE_BACKGROUND_MSFT = 1, + XR_SCENE_OBJECT_TYPE_WALL_MSFT = 2, + XR_SCENE_OBJECT_TYPE_FLOOR_MSFT = 3, + XR_SCENE_OBJECT_TYPE_CEILING_MSFT = 4, + XR_SCENE_OBJECT_TYPE_PLATFORM_MSFT = 5, + XR_SCENE_OBJECT_TYPE_INFERRED_MSFT = 6, + XR_SCENE_OBJECT_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF + } + + public enum XrScenePlaneAlignmentTypeMSFT + { + XR_SCENE_PLANE_ALIGNMENT_TYPE_NON_ORTHOGONAL_MSFT = 0, + XR_SCENE_PLANE_ALIGNMENT_TYPE_HORIZONTAL_MSFT = 1, + XR_SCENE_PLANE_ALIGNMENT_TYPE_VERTICAL_MSFT = 2, + XR_SCENE_PLANE_ALIGNMENT_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF + } + + public enum XrSceneComputeStateMSFT + { + XR_SCENE_COMPUTE_STATE_NONE_MSFT = 0, + XR_SCENE_COMPUTE_STATE_UPDATING_MSFT = 1, + XR_SCENE_COMPUTE_STATE_COMPLETED_MSFT = 2, + XR_SCENE_COMPUTE_STATE_COMPLETED_WITH_ERROR_MSFT = 3, + XR_SCENE_COMPUTE_STATE_MAX_ENUM_MSFT = 0x7FFFFFFF + } + + public struct XrUuidMSFT + { + public byte byte0; + public byte byte1; + public byte byte2; + public byte byte3; + public byte byte4; + public byte byte5; + public byte byte6; + public byte byte7; + public byte byte8; + public byte byte9; + public byte byte10; + public byte byte11; + public byte byte12; + public byte byte13; + public byte byte14; + public byte byte15; + public byte byte16; + + } + + public struct XrSceneObserverCreateInfoMSFT + { + public XrStructureType type; + public IntPtr next; + } + + public struct XrSceneCreateInfoMSFT + { + public XrStructureType type; + public IntPtr next; + } + + public struct XrSceneSphereBoundMSFT + { + public XrVector3f center; + public float radius; + } + + public struct XrSceneOrientedBoxBoundMSFT + { + public XrPosef pose; + public XrVector3f extents; + } + + public struct XrSceneFrustumBoundMSFT + { + public XrPosef pose; + public XrFovf fov; + public float farDistance; + } + + public struct XrSceneBoundsMSFT + { + public ulong space; + public long time; + public uint sphereCount; + + // XrSceneSphereBoundMSFT + public IntPtr spheres; + public uint boxCount; + + // XrSceneOrientedBoxBoundMSFT + public IntPtr boxes; + public uint frustumCount; + + // XrSceneFrustumBoundMSFT + public IntPtr frustums; + } + + public struct XrNewSceneComputeInfoMSFT + { + public XrStructureType type; + public IntPtr next; + public uint requestedFeatureCount; + + // XrSceneComputeFeatureMSFT array + public IntPtr requestedFeatures; + public uint disableInferredSceneObjects; + public XrSceneBoundsMSFT bounds; + } + + // XrVisualMeshComputeLodInfoMSFT extends XrNewSceneComputeInfoMSFT + public struct XrVisualMeshComputeLodInfoMSFT + { + public XrStructureType type; + public IntPtr next; + public XrMeshComputeLodMSFT lod; + } + + public struct XrSceneComponentMSFT + { + public XrSceneComponentTypeMSFT componentType; + public XrUuidMSFT componentId; + public XrUuidMSFT parentObjectId; + public long updateTime; + } + + public struct XrSceneComponentsMSFT + { + public XrStructureType type; + public IntPtr next; + public uint componentCapacityInput; + public uint componentCountOutput; + + // XrSceneComponentMSFT array + public IntPtr components; + } + + public struct XrSceneComponentsGetInfoMSFT + { + public XrStructureType type; + public IntPtr next; + public XrSceneComponentTypeMSFT componentType; + } + + public struct XrSceneComponentLocationMSFT + { + public ulong flags; + public XrPosef pose; + } + + public struct XrSceneComponentLocationsMSFT + { + public XrStructureType type; + public IntPtr next; + public uint locationCount; + + // XrSceneComponentLocationMSFT array + public IntPtr locations; + } + + public struct XrSceneComponentsLocateInfoMSFT + { + public XrStructureType type; + public IntPtr next; + + // XrSpace + public ulong baseSpace; + + // XrTime + public long time; + public uint idCount; + + // XrUuidMSFT array + public IntPtr ids; + } + + public struct XrSceneObjectMSFT + { + public XrSceneObjectTypeMSFT objectType; + } + + // XrSceneObjectsMSFT extends XrSceneComponentsMSFT + public struct XrSceneObjectsMSFT + { + public XrStructureType type; + public IntPtr next; + public uint sceneObjectCount; + + // XrSceneObjectMSFT array + public IntPtr sceneObjects; + } + + // XrSceneComponentParentFilterInfoMSFT extends XrSceneComponentsGetInfoMSFT + public struct XrSceneComponentParentFilterInfoMSFT + { + public XrStructureType type; + public IntPtr next; + public XrUuidMSFT parentObjectId; + } + + // XrSceneObjectTypesFilterInfoMSFT extends XrSceneComponentsGetInfoMSFT + public struct XrSceneObjectTypesFilterInfoMSFT + { + public XrStructureType type; + public IntPtr next; + public uint objectTypeCount; + + // XrSceneObjectTypeMSFT array + public IntPtr objectTypes; + } + + public struct XrScenePlaneMSFT + { + public XrScenePlaneAlignmentTypeMSFT alignment; + public XrExtent2Df size; + public ulong meshBufferId; + + // XrBool32 + public uint supportsIndicesUint16; + } + + // XrScenePlanesMSFT extends XrSceneComponentsMSFT + public struct XrScenePlanesMSFT + { + public XrStructureType type; + public IntPtr next; + public uint scenePlaneCount; + + // XrScenePlaneMSFT array + public IntPtr scenePlanes; + } + + // XrScenePlaneAlignmentFilterInfoMSFT extends XrSceneComponentsGetInfoMSFT + public struct XrScenePlaneAlignmentFilterInfoMSFT + { + public XrStructureType type; + public IntPtr next; + public uint alignmentCount; + + // XrScenePlaneAlignmentTypeMSFT array + public IntPtr alignments; + } + + public struct XrSceneMeshMSFT + { + public ulong meshBufferId; + + // XrBool32 + public uint supportsIndicesUint16; + } + + // XrSceneMeshesMSFT extends XrSceneComponentsMSFT + public struct XrSceneMeshesMSFT + { + public XrStructureType type; + public IntPtr next; + public uint sceneMeshCount; + + // XrSceneMeshMSFT array + public IntPtr sceneMeshes; + } + + public struct XrSceneMeshBuffersGetInfoMSFT + { + public XrStructureType type; + public IntPtr next; + public ulong meshBufferId; + } + + public struct XrSceneMeshBuffersMSFT + { + public XrStructureType type; + public IntPtr next; + } + + public struct XrSceneMeshVertexBufferMSFT + { + public XrStructureType type; + public IntPtr next; + public uint vertexCapacityInput; + public uint vertexCountOutput; + + // XrVector3f array + public IntPtr vertices; + } + + public struct XrSceneMeshIndicesUint32MSFT + { + public XrStructureType type; + public IntPtr next; + public uint indexCapacityInput; + public uint indexCountOutput; + + // uint32_t array + public IntPtr indices; + } + + public struct XrSceneMeshIndicesUint16MSFT + { + public XrStructureType type; + public IntPtr next; + public uint indexCapacityInput; + public uint indexCountOutput; + + // uint16_t array + public IntPtr indices; + } + + public struct XrSystemPassThroughCameraInfoHTC + { + public float focalLengthX; + public float focalLengthY; + public float opticalCenterX; + public float opticalCenterY; + public uint imageWidth; + public uint imageHeight; + public uint imageChannelCount; + } + public struct XrSystemPassThroughPropertiesHTC + { + public XrStructureType type; + public IntPtr next; + public uint supportsPassThrough; + XrSystemPassThroughCameraInfoHTC leftCameraInfo; + XrSystemPassThroughCameraInfoHTC rightCameraInfo; + public int deviceType; + public long format; + } +#endregion + } + +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/Include/OpenXR.cs.meta b/com.htc.upm.vive.openxr/Include/OpenXR.cs.meta new file mode 100644 index 0000000..3c8620e --- /dev/null +++ b/com.htc.upm.vive.openxr/Include/OpenXR.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a99cc2a2471f1e7499276e561bbb8d1e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRCosmosController.meta b/com.htc.upm.vive.openxr/OpenXRCosmosController.meta new file mode 100644 index 0000000..507948d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRCosmosController.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8d3cf59612880f3488745edeb4a77259 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime.meta b/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime.meta new file mode 100644 index 0000000..7b397be --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 661e7acd9eb00954994e90a733ef85c3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input.meta b/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input.meta new file mode 100644 index 0000000..5ee7a07 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 42871fe047fc3f6428246272b42a0630 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input/Features.meta b/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input/Features.meta new file mode 100644 index 0000000..c577e07 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input/Features.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7cc26b297a5859041aa2a4c1b6ea8d45 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input/Features/HtcViveCosmosInputFeature.cs b/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input/Features/HtcViveCosmosInputFeature.cs new file mode 100644 index 0000000..1430691 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input/Features/HtcViveCosmosInputFeature.cs @@ -0,0 +1,620 @@ +using System.Collections.Generic; +using UnityEngine.Scripting; +using UnityEngine.XR.OpenXR.Input; +using UnityEngine.InputSystem.Layouts; +using UnityEngine.InputSystem.Controls; +using UnityEngine.InputSystem.XR; + +#if UNITY_EDITOR +using UnityEditor; +#endif + +using PoseControl = UnityEngine.XR.OpenXR.Input.PoseControl; + + +namespace UnityEngine.XR.OpenXR.Features +{ + /// + /// This enables the use of HTC Vive Controllers interaction profiles in OpenXR. + /// +#if UNITY_EDITOR + [UnityEditor.XR.OpenXR.Features.OpenXRFeature(UiName = "HTC Vive Cosmos Controller Support", + BuildTargetGroups = new[] { BuildTargetGroup.Standalone, BuildTargetGroup.WSA }, + Company = "HTC", + Desc = "Allows for mapping input to the HTC Vive Cosmos Controller interaction profile.", + DocumentationLink = "https://developer.vive.com/resources/openxr/openxr-pcvr/tutorials/unity/cosmos-controller-openxr-feature-unity/", + OpenxrExtensionStrings = "XR_HTC_vive_cosmos_controller_interaction XR_EXT_palm_pose", + Version = "0.0.2", + Category = UnityEditor.XR.OpenXR.Features.FeatureCategory.Interaction, + FeatureId = featureId)] +#endif + public class HtcViveCosmosInputFeature : OpenXRInteractionFeature + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.htc.openxr.feature.input.htcvivecosmos"; + + /// + /// An Input System device based off the HTC Vive Controller. + /// + /// + [Preserve, InputControlLayout(displayName = "HTC Vive Cosmos Controller (OpenXR)", commonUsages = new[] { "LeftHand", "RightHand" })] + public class ViveCosmosController : XRControllerWithRumble + { + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripAxis" })] + public AxisControl grip { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripButton" })] + public ButtonControl gripPressed { get; private set; } + + /// + /// A representing the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "B", "Y" })] + public ButtonControl secondaryButton { get; private set; } + + /// + /// A representing the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "A", "X" })] + public ButtonControl primaryButton { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "ShoulderButton" })] + public ButtonControl shoulderPressed { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "Primary", "menubutton" })] + public ButtonControl menu { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "triggeraxis" })] + public AxisControl trigger { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "triggerbutton" })] + public ButtonControl triggerPressed { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "Primary2DAxis", "joystickaxes" })] + public Vector2Control joystick { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "joystickorpadpressed", "joystickpressed" })] + public ButtonControl joystickClicked { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "joystickorpadtouched", "joysticktouched" })] + public ButtonControl joystickTouched { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, alias = "device")] + public PoseControl devicePose { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(offset = 0)] + public PoseControl pointer { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this represents the overall tracking state of the device. this value is equivalent to mapping devicePose/isTracked + /// + [Preserve, InputControl(offset = 28)] + new public ButtonControl isTracked { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this represents the bit flag set indicating what data is valid. this value is equivalent to mapping devicePose/trackingState + /// + [Preserve, InputControl(offset = 32)] + new public IntegerControl trackingState { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this is the device position, or grip position. this value is equivalent to mapping devicePose/position + /// + [Preserve, InputControl(offset = 36, aliases = new[] { "gripPosition" })] + new public Vector3Control devicePosition { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this is the device orientation, or grip orientation. this value is equivalent to mapping devicePose/rotation + /// + [Preserve, InputControl(offset = 48, aliases = new[] { "gripOrientation", "gripRotation" })] + new public QuaternionControl deviceRotation { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this is the pointer position. this value is equivalent to mapping pointerPose/position + /// + [Preserve, InputControl(offset = 96)] + public Vector3Control pointerPosition { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this is the pointer rotation. this value is equivalent to mapping pointerPose/rotation + /// + [Preserve, InputControl(offset = 108, aliases = new[] { "pointerOrientation" })] + public QuaternionControl pointerRotation { get; private set; } + /// + /// A that represents the binding. + /// + [Preserve, InputControl(usage = "Haptic")] + public HapticControl haptic { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl()] + public PoseControl palm { get; private set; } + + + /// + protected override void FinishSetup() + { + base.FinishSetup(); + grip = GetChildControl("grip"); + gripPressed = GetChildControl("gripPressed"); + primaryButton = GetChildControl("primaryButton"); + secondaryButton = GetChildControl("secondaryButton"); + shoulderPressed = GetChildControl("shoulderPressed"); + menu = GetChildControl("menu"); + trigger = GetChildControl("trigger"); + triggerPressed = GetChildControl("triggerPressed"); + joystick = GetChildControl("joystick"); + joystickClicked = GetChildControl("joystickClicked"); + joystickTouched = GetChildControl("joystickTouched"); + + devicePose = GetChildControl("devicePose"); + pointer = GetChildControl("pointer"); + + isTracked = GetChildControl("isTracked"); + trackingState = GetChildControl("trackingState"); + devicePosition = GetChildControl("devicePosition"); + deviceRotation = GetChildControl("deviceRotation"); + pointerPosition = GetChildControl("pointerPosition"); + pointerRotation = GetChildControl("pointerRotation"); + haptic = GetChildControl("haptic"); + palm = GetChildControl("palm"); + } + } + /// The interaction profile string used to reference the HTC Vive Controller. + public const string profile = "/interaction_profiles/htc/vive_cosmos_controller"; + + /// + /// Constant for a interaction binding '.../input/trigger/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string select = "/input/trigger/click"; + + /// + /// Constant for a interaction binding '.../input/a/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string a = "/input/a/click"; + + /// + /// Constant for a interaction binding '.../input/b/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string b = "/input/b/click"; + + /// + /// Constant for a interaction binding '.../input/x/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string x = "/input/x/click"; + + /// + /// Constant for a interaction binding '.../input/y/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string y = "/input/y/click"; + + + /// + /// Constant for a interaction binding '.../input/y/shoulder' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string shoulder = "/input/shoulder/click"; + + /// + /// Constant for a interaction binding '.../input/squeeze/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string squeeze = "/input/squeeze/click"; + /// + /// Constant for a interaction binding '.../input/menu/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string menu = "/input/menu/click"; + /// + /// Constant for a interaction binding '.../input/trigger/value' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string trigger = "/input/trigger/value"; + /// + /// Constant for a interaction binding '.../input/trigger/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string triggerClick = "/input/trigger/click"; + /// + /// Constant for a interaction binding '.../input/trackpad' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string thumbstick = "/input/thumbstick"; + /// + /// Constant for a interaction binding '.../input/trackpad/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string thumbstickClick = "/input/thumbstick/click"; + /// + /// Constant for a interaction binding '.../input/trackpad/touch' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string thumbstickTouch = "/input/thumbstick/touch"; + /// + /// Constant for a interaction binding '.../input/grip/pose' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string grip = "/input/grip/pose"; + /// + /// Constant for a interaction binding '.../input/aim/pose' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string aim = "/input/aim/pose"; + /// + /// Constant for a interaction binding '.../output/haptic' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string haptic = "/output/haptic"; + + /// + /// Constant for a interaction binding '.../input/palm_ext/pose' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string palm = "/input/palm_ext/pose"; + + + private const string kDeviceLocalizedName = "HTC Vive Cosmos Controller OpenXR"; + + /// + /// Registers the layout with the Input System. Matches the that is registered with . + /// + protected override void RegisterDeviceLayout() + { + InputSystem.InputSystem.RegisterLayout(typeof(ViveCosmosController), + matches: new InputDeviceMatcher() + .WithInterface(XRUtilities.InterfaceMatchAnyVersion) + .WithProduct(kDeviceLocalizedName)); + } + + + /// + /// Removes the layout from the Input System. Matches the that is registered with . + /// + protected override void UnregisterDeviceLayout() + { + InputSystem.InputSystem.RemoveLayout(typeof(ViveCosmosController).Name); + } + + /// + /// Registers an with OpenXR that matches the HTC Vive Controller. Also calls when the Input System package is available. + /// + protected override void RegisterActionMapsWithRuntime() + { + ActionMapConfig actionMap = new ActionMapConfig() + { + name = "vivecosmoscontroller", + localizedName = kDeviceLocalizedName, + desiredInteractionProfile = profile, + manufacturer = "HTC", + serialNumber = "", + deviceInfos = new List() + { + new DeviceConfig() + { + characteristics = (InputDeviceCharacteristics)(InputDeviceCharacteristics.HeldInHand | InputDeviceCharacteristics.TrackedDevice | InputDeviceCharacteristics.Controller | InputDeviceCharacteristics.Left), + userPath = UserPaths.leftHand + }, + new DeviceConfig() + { + characteristics = (InputDeviceCharacteristics)(InputDeviceCharacteristics.HeldInHand | InputDeviceCharacteristics.TrackedDevice | InputDeviceCharacteristics.Controller | InputDeviceCharacteristics.Right), + userPath = UserPaths.rightHand + } + }, + actions = new List() + { + new ActionConfig() + { + name = "primarybutton", + localizedName = "Primary Button", + type = ActionType.Binary, + usages = new List() + { + "PrimaryButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = x, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = a, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + new ActionConfig() + { + name = "secondarybutton", + localizedName = "Secondary Button", + type = ActionType.Binary, + usages = new List() + { + "SecondaryButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = y, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = b, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + new ActionConfig() + { + name = "grip", + localizedName = "Grip", + type = ActionType.Axis1D, + usages = new List() + { + "Grip" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeeze, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "grippressed", + localizedName = "Grip Pressed", + type = ActionType.Binary, + usages = new List() + { + "GripPressed", + "GripButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeeze, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "menu", + localizedName = "Menu", + type = ActionType.Binary, + usages = new List() + { + "MenuButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = menu, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + } + } + }, + new ActionConfig() + { + name = "shoulderpressed", + localizedName = "Shoulder Pressed", + type = ActionType.Binary, + usages = new List() + { + "ShoulderButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = shoulder, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "trigger", + localizedName = "Trigger", + type = ActionType.Axis1D, + usages = new List() + { + "Trigger" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = trigger, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "triggerpressed", + localizedName = "Trigger Pressed", + type = ActionType.Binary, + usages = new List() + { + "TriggerPressed", + "TriggerButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = triggerClick, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "thumbstick", + localizedName = "Thumbstick", + type = ActionType.Axis2D, + usages = new List() + { + "Primary2DAxis" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstick, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "thumbsticktouched", + localizedName = "Thumbstick Touched", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstickTouch, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "thumbstickclicked", + localizedName = "Thumbstick Clicked", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisClick" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstickClick, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "devicepose", + localizedName = "Device Pose", + type = ActionType.Pose, + usages = new List() + { + "Device" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = grip, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "pointer", + localizedName = "Pointer Pose", + type = ActionType.Pose, + usages = new List() + { + "Pointer" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = aim, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "haptic", + localizedName = "Haptic Output", + type = ActionType.Vibrate, + usages = new List(){ "Haptic" }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = haptic, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "palm", + localizedName = "Palm Pose", + type = ActionType.Pose, + usages = new List() + { + "Palm" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = palm, + interactionProfileName = profile, + } + } + } + } + }; + + AddActionMap(actionMap); + } + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input/Features/HtcViveCosmosInputFeature.cs.meta b/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input/Features/HtcViveCosmosInputFeature.cs.meta new file mode 100644 index 0000000..736834f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRCosmosController/Runtime/input/Features/HtcViveCosmosInputFeature.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d008d94966c2e9e4c868ca2c0d777357 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking.meta new file mode 100644 index 0000000..370dfe5 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 11437acb07f69f0488ff34fc80714d41 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Editor.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Editor.meta new file mode 100644 index 0000000..369dd0f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d308a0a31ed751c4e8732edd46dab7a0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Editor/FacialTrackingFeatureInstaller.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Editor/FacialTrackingFeatureInstaller.cs new file mode 100644 index 0000000..d551b2a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Editor/FacialTrackingFeatureInstaller.cs @@ -0,0 +1,43 @@ +using UnityEditor; +using UnityEditor.XR.OpenXR.Features; +using UnityEngine; +using UnityEngine.XR.OpenXR; +using System.Linq; +using System.IO; +using VIVE.FacialTracking; +namespace UnityEditor.XR.OpenXR.Samples.FacialTracking +{ + [InitializeOnLoad] + public class FacialTrackingFeatureInstaller : Editor + { +#if !UNITY_SAMPLE_DEV + private const string k_ScriptPath = "FacialTracking Example/Editor/FacialTrackingFeatureInstaller.cs"; + static FacialTrackingFeatureInstaller() + { + FeatureHelpers.RefreshFeatures(BuildTargetGroup.Standalone); + var feature = OpenXRSettings.Instance.GetFeature(); + if (feature != null) + { + if (feature.enabled != true) + { + feature.enabled = true; + } + } + Debug.Log(AssetDatabase.FindAssets(Path.GetFileNameWithoutExtension(k_ScriptPath)).Select(AssetDatabase.GUIDToAssetPath)); + var source = AssetDatabase.FindAssets(Path.GetFileNameWithoutExtension(k_ScriptPath)) + .Select(AssetDatabase.GUIDToAssetPath) + .FirstOrDefault(r => r.Contains(k_ScriptPath)); + + if (string.IsNullOrEmpty(source)) + { + Debug.LogError("File Not Exist"); + return; + } + + source = Path.GetDirectoryName(source); + Debug.Log(source); + AssetDatabase.DeleteAsset(Path.Combine(Path.GetDirectoryName(source), "Editor")); + } +#endif + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Editor/FacialTrackingFeatureInstaller.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Editor/FacialTrackingFeatureInstaller.cs.meta new file mode 100644 index 0000000..9842389 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Editor/FacialTrackingFeatureInstaller.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a81422121780bf041a3c72f79f71bd2c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light.meta new file mode 100644 index 0000000..6df83cd --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3db97ef06df531243bb52fd4a70723ea +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_HDRI_mat.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_HDRI_mat.mat new file mode 100644 index 0000000..ace83cd --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_HDRI_mat.mat @@ -0,0 +1,84 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BG_HDRI_mat + m_Shader: {fileID: 108, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _MAPPING_LATITUDE_LONGITUDE_LAYOUT _MIRRORONBACK_ON + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 4f5cea95371d40449ae3843c39c2ad0d, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _Exposure: 1 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _ImageType: 0 + - _Layout: 0 + - _Mapping: 1 + - _Metallic: 0 + - _MirrorOnBack: 1 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _Rotation: 15 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _Tint: {r: 1, g: 1, b: 1, a: 0.5} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_HDRI_mat.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_HDRI_mat.mat.meta new file mode 100644 index 0000000..a4ff121 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_HDRI_mat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 07feae72eb0d201478ff416324676cf3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_Sphere.fbx b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_Sphere.fbx new file mode 100644 index 0000000..2c8dbc5 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_Sphere.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6f1d6f29e0bd0c1df7f8f0086052987dd7b6c5bbb3f46a005318fbf6180731d +size 83226 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_Sphere.fbx.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_Sphere.fbx.meta new file mode 100644 index 0000000..30e1f9d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_Sphere.fbx.meta @@ -0,0 +1,97 @@ +fileFormatVersion: 2 +guid: 199c3bd67beb8c6469f1453fe2a36ff8 +ModelImporter: + serializedVersion: 23 + fileIDToRecycleName: + 100000: //RootNode + 400000: //RootNode + 2100000: lambert1 + 2300000: //RootNode + 3300000: //RootNode + 4300000: BG_Sphere + externalObjects: {} + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 1 + generateSecondaryUV: 1 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + previousCalculatedGlobalScale: 1 + hasPreviousCalculatedGlobalScale: 0 + tangentSpace: + normalSmoothAngle: 180 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_mat.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_mat.mat new file mode 100644 index 0000000..47db27b --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_mat.mat @@ -0,0 +1,123 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: BG_mat + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: + - DistortionVectors + - MOTIONVECTORS + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DistortionVectorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissiveColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _UnlitColorMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaCutoff: 0.5 + - _AlphaCutoffEnable: 0 + - _BlendMode: 0 + - _BumpScale: 1 + - _CullMode: 2 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DistortionBlendMode: 0 + - _DistortionBlurBlendMode: 0 + - _DistortionBlurDstBlend: 1 + - _DistortionBlurRemapMax: 1 + - _DistortionBlurRemapMin: 0 + - _DistortionBlurScale: 1 + - _DistortionBlurSrcBlend: 1 + - _DistortionDepthTest: 1 + - _DistortionDstBlend: 1 + - _DistortionEnable: 0 + - _DistortionOnly: 0 + - _DistortionScale: 1 + - _DistortionSrcBlend: 1 + - _DistortionVectorBias: -1 + - _DistortionVectorScale: 2 + - _DoubleSidedEnable: 0 + - _DstBlend: 0 + - _EnableFogOnTransparent: 0 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _HdrpVersion: 2 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _PreRefractionPass: 0 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _StencilRef: 2 + - _StencilRefMV: 128 + - _StencilWriteMask: 7 + - _StencilWriteMaskMV: 128 + - _SurfaceType: 0 + - _TransparentSortPriority: 0 + - _UVSec: 0 + - _ZTestModeDistortion: 4 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.0627451, g: 0.0627451, b: 0.0627451, a: 1} + - _EmissionColor: {r: 1, g: 1, b: 1, a: 1} + - _EmissiveColor: {r: 0, g: 0, b: 0, a: 1} + - _UnlitColor: {r: 1, g: 1, b: 1, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_mat.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_mat.mat.meta new file mode 100644 index 0000000..04d74f4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/BG_mat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8a5a89b610f3b1849965dba78a1458f1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/SphereUV_Tex.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/SphereUV_Tex.png new file mode 100644 index 0000000..61a232c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/SphereUV_Tex.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acd6e661924dc896acf61b0617dbce999d5fc89549dcd2cd5d39b337ec53679f +size 5214 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/SphereUV_Tex.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/SphereUV_Tex.png.meta new file mode 100644 index 0000000..4c6d296 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/SphereUV_Tex.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: bcdf0ee249a91f64bb8b5c7b38521708 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 0 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 2 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/studio_small_04_4k.hdr b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/studio_small_04_4k.hdr new file mode 100644 index 0000000..c5d2454 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/studio_small_04_4k.hdr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84a41cc648affca9d36c766486b7b12522b1fc90ebde2716b22f476478e75611 +size 26084423 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/studio_small_04_4k.hdr.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/studio_small_04_4k.hdr.meta new file mode 100644 index 0000000..ed680dc --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Environment_Light/studio_small_04_4k.hdr.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 4f5cea95371d40449ae3843c39c2ad0d +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials.meta new file mode 100644 index 0000000..b41930f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 56a49c013c6e3bf418a2832ae71d93b5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/DartBoardMaterial.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/DartBoardMaterial.mat new file mode 100644 index 0000000..3112d1e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/DartBoardMaterial.mat @@ -0,0 +1,47 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: DartBoardMaterial + m_Shader: {fileID: 4800000, guid: 3a9024653b4a9fa499d136839799ad85, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - : + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - : 0 + - _BendCount: 1 + - _BendIndex: -2 + - _FrameWidth: 1 + - _PieCount: 1 + - _PieIndex: 1 + - _Scale: 1 + m_Colors: + - : {r: 0, g: 1.5737913e-34, b: 0, a: 1.573784e-34} + - _Color0: {r: 0.4862745, g: 0.44313726, b: 0.32941177, a: 1} + - _Color1: {r: 0.078431375, g: 0.07058824, b: 0.08235294, a: 1} + - _Color2: {r: 0.39215687, g: 0.09019608, b: 0.09019608, a: 1} + - _Color3: {r: 1, g: 0, b: 0, a: 1} + - _Color4: {r: 0.09411765, g: 0.27058825, b: 0.09803922, a: 1} + - _ColorHit: {r: 0.80784315, g: 0.7882353, b: 0, a: 1} + - _MeshCenter: {r: 0, g: 0, b: 0, a: 0} + - _MeshForward: {r: 0, g: 0, b: 0, a: 0} + - _MeshRight: {r: 0, g: 0, b: 0, a: 0} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/DartBoardMaterial.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/DartBoardMaterial.mat.meta new file mode 100644 index 0000000..69df02c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/DartBoardMaterial.mat.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 733fa7de874ca6f4abd64315e0336799 +timeCreated: 1547524415 +licenseType: Pro +NativeFormatImporter: + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorMaterial.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorMaterial.mat new file mode 100644 index 0000000..28e30e5 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorMaterial.mat @@ -0,0 +1,127 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: MirrorMaterial + m_Shader: {fileID: 10752, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 8400000, guid: 600a6f0266444c145945aa3e7f2a29a6, type: 2} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 1 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorMaterial.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorMaterial.mat.meta new file mode 100644 index 0000000..48fe186 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorMaterial.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 20c0a6a4ee4540848b1ad902026d6110 +timeCreated: 1539743270 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorRenderTexture.renderTexture b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorRenderTexture.renderTexture new file mode 100644 index 0000000..a2a7e55 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorRenderTexture.renderTexture @@ -0,0 +1,24 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!84 &8400000 +RenderTexture: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: MirrorRenderTexture + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_Width: 1024 + m_Height: 1024 + m_AntiAliasing: 1 + m_DepthFormat: 2 + m_ColorFormat: 0 + m_MipMap: 0 + m_GenerateMips: 1 + m_SRGB: 0 + m_TextureSettings: + m_FilterMode: 2 + m_Aniso: 0 + m_MipBias: 0 + m_WrapMode: 1 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorRenderTexture.renderTexture.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorRenderTexture.renderTexture.meta new file mode 100644 index 0000000..a895dd3 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/MirrorRenderTexture.renderTexture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 600a6f0266444c145945aa3e7f2a29a6 +timeCreated: 1539743288 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/NoticeBoardMaterial.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/NoticeBoardMaterial.mat new file mode 100644 index 0000000..75d0d1d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/NoticeBoardMaterial.mat @@ -0,0 +1,127 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: NoticeBoardMaterial + m_Shader: {fileID: 10755, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHAPREMULTIPLY_ON _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 10 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 3 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 0 + m_Colors: + - first: + name: _Color + second: {r: 0.28627452, g: 0.28627452, b: 0.28627452, a: 0.5882353} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/NoticeBoardMaterial.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/NoticeBoardMaterial.mat.meta new file mode 100644 index 0000000..f1844c8 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Materials/NoticeBoardMaterial.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 585cd6b809553e7478f5a57cc86be19f +timeCreated: 1547781500 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models.meta new file mode 100644 index 0000000..9de31e4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ee339e53c339d77448020fc71d474dfd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1.meta new file mode 100644 index 0000000..ecce585 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a973f4662aff486448146cf2b9bd4755 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh.meta new file mode 100644 index 0000000..f1449ea --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5f0401084408f3e4aaf32b5827e19ab6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_albedo.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_albedo.png new file mode 100644 index 0000000..c56abb1 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_albedo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00431fe5f8c9ce31c7c4990dbae390c49ce442acb8112ab0d440167acb31aa30 +size 17230241 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_albedo.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_albedo.png.meta new file mode 100644 index 0000000..5b49802 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_albedo.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: 652f3a0713d910a48a2a62fcaefd72ac +timeCreated: 1536217085 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_ao.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_ao.png new file mode 100644 index 0000000..ff4438a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bc44a74158dc6a7b0e6022ed9538a513d9457e73086f9e0f4fb85d24c97d210 +size 4034375 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_ao.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_ao.png.meta new file mode 100644 index 0000000..1e5be04 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_ao.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: e65b11d96b6e96b46a8b4bf2aa19344f +timeCreated: 1536217082 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_metallic.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_metallic.png new file mode 100644 index 0000000..12448e6 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bac076f20d5697793b149b1e4b406677f514377631df2edfe9392f8575830597 +size 8432055 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_metallic.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_metallic.png.meta new file mode 100644 index 0000000..46bfed8 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_metallic.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: 2ef75489dda574346a294ffc114c92d5 +timeCreated: 1536217079 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_normal.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_normal.png new file mode 100644 index 0000000..a928f76 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d4daa8adbffc2a6bb5ffee5c2dce269203fb66f724bcfd1546f892dbe67f5d7 +size 22664076 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_normal.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_normal.png.meta new file mode 100644 index 0000000..d403849 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Head_b_normal.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: e6353fa07def4bd41b8b64a3387053cc +timeCreated: 1536217112 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials.meta new file mode 100644 index 0000000..14383c4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5714c936d033bd94ab489b9ee93ef3df +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/eyelash_mat.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/eyelash_mat.mat new file mode 100644 index 0000000..e58cd84 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/eyelash_mat.mat @@ -0,0 +1,145 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: eyelash_mat + m_Shader: {fileID: 208, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHABLEND_ON _EMISSION _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 + stringTagMap: {} + m_SavedProperties: + serializedVersion: 2 + m_TexEnvs: + - first: + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: e6353fa07def4bd41b8b64a3387053cc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MainTex + second: + m_Texture: {fileID: 2800000, guid: 652f3a0713d910a48a2a62fcaefd72ac, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 2800000, guid: 2ef75489dda574346a294ffc114c92d5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 2800000, guid: e65b11d96b6e96b46a8b4bf2aa19344f, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _SpecGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - first: + name: _BumpScale + second: 1 + - first: + name: _Cutoff + second: 0.5 + - first: + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 10 + - first: + name: _GlossMapScale + second: 0.7 + - first: + name: _Glossiness + second: 0.5 + - first: + name: _GlossyReflections + second: 1 + - first: + name: _InvFade + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 2 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 5 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite + second: 0 + m_Colors: + - first: + name: _Color + second: {r: 1, g: 1, b: 1, a: 1} + - first: + name: _EmisColor + second: {r: 0.2, g: 0.2, b: 0.2, a: 0} + - first: + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _SpecColor + second: {r: 0.2, g: 0.2, b: 0.2, a: 1} + - first: + name: _TintColor + second: {r: 0.5, g: 0.5, b: 0.5, a: 0.5} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/eyelash_mat.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/eyelash_mat.mat.meta new file mode 100644 index 0000000..8ffea2e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/eyelash_mat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e1458d535c1a65842b6f50cbe83e26bd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/head_mat.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/head_mat.mat new file mode 100644 index 0000000..58962fa --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/head_mat.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: head_mat + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHATEST_ON _EMISSION _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2450 + stringTagMap: + RenderType: TransparentCutout + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: e6353fa07def4bd41b8b64a3387053cc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 652f3a0713d910a48a2a62fcaefd72ac, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 2ef75489dda574346a294ffc114c92d5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 2800000, guid: e65b11d96b6e96b46a8b4bf2aa19344f, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 0.7 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 1 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/head_mat.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/head_mat.mat.meta new file mode 100644 index 0000000..7e6c0ff --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version1/Avatar_Shieh/Materials/head_mat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc6322259756d094995c0f3acfd9825e +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2.meta new file mode 100644 index 0000000..989c75f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bba121844e9a1ec40b25e6a891b5c54d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh.meta new file mode 100644 index 0000000..21209be --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 281dba7d6bd94694db4295902d0cefd3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Avatar_Shieh_V2.fbx b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Avatar_Shieh_V2.fbx new file mode 100644 index 0000000..4f7590c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Avatar_Shieh_V2.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf370bdd31ed6a57664800683abb523105627dfdbd446a4cc117c6f10885d1df +size 15088819 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Avatar_Shieh_V2.fbx.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Avatar_Shieh_V2.fbx.meta new file mode 100644 index 0000000..02ae21f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Avatar_Shieh_V2.fbx.meta @@ -0,0 +1,104 @@ +fileFormatVersion: 2 +guid: cc2bd8780f283784899dcb72f2f7702f +ModelImporter: + serializedVersion: 22 + fileIDToRecycleName: + 100000: //RootNode + 100002: Eye_Left + 100004: Eye_Right + 100006: Head + 400000: //RootNode + 400002: Eye_Left + 400004: Eye_Right + 400006: Head + 2100000: head_mat1 + 2100002: eyelash_mat1 + 2300000: Eye_Left + 2300002: Eye_Right + 3300000: Eye_Left + 3300002: Eye_Right + 4300000: Head + 4300002: Eye_Left + 4300004: Eye_Right + 9500000: //RootNode + 13700000: Head + externalObjects: {} + materials: + importMaterials: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + optimizeMeshForGPU: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + importAnimation: 1 + copyAvatar: 0 + humanDescription: + serializedVersion: 2 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + rootMotionBoneName: + rootMotionBoneRotation: {x: 0, y: 0, z: 0, w: 1} + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 2 + humanoidOversampling: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_MetallicSmoothness.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_MetallicSmoothness.png new file mode 100644 index 0000000..3568c67 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_MetallicSmoothness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5a93cae97eaeeacc1925cc35c265921f7dc08548d7a5c4eb7606ce065adcc31 +size 876328 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_MetallicSmoothness.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_MetallicSmoothness.png.meta new file mode 100644 index 0000000..675358e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_MetallicSmoothness.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 508aaba794b76264994ff90752435697 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_Normal.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_Normal.png new file mode 100644 index 0000000..51009b8 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_Normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b641470ea6c09622b563e71f186208d515bf276daf45ff1d6fb711a13880d85 +size 4106511 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_Normal.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_Normal.png.meta new file mode 100644 index 0000000..0c86436 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/DetailSkin_Normal.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 7a4aa691425a0e84996a3a3f3d3ef326 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Hair_Male_Gray.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Hair_Male_Gray.png new file mode 100644 index 0000000..c8bde64 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Hair_Male_Gray.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c7d84fb4b06bd45eab62f8b40e85e02d06b31bfa5c817f0dc454a2445643e22 +size 2798861 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Hair_Male_Gray.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Hair_Male_Gray.png.meta new file mode 100644 index 0000000..1c2c5c2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Hair_Male_Gray.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: b44cd9333e4445f4fa9a18a8497cd05a +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_albedo.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_albedo.png new file mode 100644 index 0000000..c56abb1 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_albedo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00431fe5f8c9ce31c7c4990dbae390c49ce442acb8112ab0d440167acb31aa30 +size 17230241 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_albedo.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_albedo.png.meta new file mode 100644 index 0000000..5880d86 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_albedo.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 3b6ef9709a877774fbbfad38f5140940 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_ao.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_ao.png new file mode 100644 index 0000000..ff4438a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bc44a74158dc6a7b0e6022ed9538a513d9457e73086f9e0f4fb85d24c97d210 +size 4034375 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_ao.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_ao.png.meta new file mode 100644 index 0000000..f2a056b --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_ao.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d5998c2461d92474ba2b82e867f88a33 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_metallic.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_metallic.png new file mode 100644 index 0000000..12448e6 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bac076f20d5697793b149b1e4b406677f514377631df2edfe9392f8575830597 +size 8432055 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_metallic.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_metallic.png.meta new file mode 100644 index 0000000..04dade9 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_metallic.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: c87daa897a58c3540a5ca9dcc86faf16 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_normal.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_normal.png new file mode 100644 index 0000000..a928f76 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8d4daa8adbffc2a6bb5ffee5c2dce269203fb66f724bcfd1546f892dbe67f5d7 +size 22664076 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_normal.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_normal.png.meta new file mode 100644 index 0000000..25cb71c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Head_b_normal.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e535f3dc8af657843b83a1ba4a670c6d +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials.meta new file mode 100644 index 0000000..c532e47 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b713246b98e0edd48b3ac2dc544d5645 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/MA_Cloth.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/MA_Cloth.mat new file mode 100644 index 0000000..81ee5eb --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/MA_Cloth.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MA_Cloth + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 6fd4af174dd587f40920780e034070f9, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: e5b8e430b30cd6b4ca137dfcb5a22e0a, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 962059efc787e2e4da4776789ecc43a7, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.38679248, g: 0.38679248, b: 0.38679248, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/MA_Cloth.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/MA_Cloth.mat.meta new file mode 100644 index 0000000..7bb1aab --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/MA_Cloth.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 14090ed7f531d01409b2c2d85dc8d179 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Eyelash.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Eyelash.mat new file mode 100644 index 0000000..512608e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Eyelash.mat @@ -0,0 +1,104 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Shieh_Eyelash + m_Shader: {fileID: 210, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHABLEND_ON _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 0 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: + - ALWAYS + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 5f6a88171526ba44b8edd0316d32be0e, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: ad403e56572b6a54186e29d055ca35a3, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 9c2bcc6b9ea5025408d01f4065252dbc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 2800000, guid: e65b11d96b6e96b46a8b4bf2aa19344f, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _Cull: 0 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DistortionBlend: 0.5 + - _DistortionEnabled: 0 + - _DistortionStrength: 1 + - _DistortionStrengthScaled: 0 + - _DstBlend: 10 + - _EmissionEnabled: 0 + - _FlipbookMode: 0 + - _GlossMapScale: 0.7 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _InvFade: 1 + - _LightingEnabled: 1 + - _Metallic: 0 + - _Mode: 2 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 5 + - _UVSec: 0 + - _ZWrite: 0 + m_Colors: + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 0, g: 0, b: 0, a: 1} + - _EmisColor: {r: 0.2, g: 0.2, b: 0.2, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} + - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + - _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Eyelash.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Eyelash.mat.meta new file mode 100644 index 0000000..f5ddfa2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Eyelash.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 69ffae49b21b66941bf5a3bd759506e0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Cut.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Cut.mat new file mode 100644 index 0000000..695d33d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Cut.mat @@ -0,0 +1,172 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Shieh_Hair_Cut + m_Shader: {fileID: 47, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: UNITY_UI_ALPHACLIP _ALPHATEST_ON _EMISSION _NORMALMAP + m_LightmapFlags: 0 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2450 + stringTagMap: + RenderType: TransparentCutout + disabledShaderPasses: + - ALWAYS + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _Albedo: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _AlphaTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 2800000, guid: cabd98cd3b67a394aa643d4af9e213b5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailBump: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailSkin_Metalic: + m_Texture: {fileID: 2800000, guid: 508aaba794b76264994ff90752435697, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailSkin_Normal: + m_Texture: {fileID: 2800000, guid: 7a4aa691425a0e84996a3a3f3d3ef326, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainBump: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: b44cd9333e4445f4fa9a18a8497cd05a, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Mask: + m_Texture: {fileID: 2800000, guid: 7bf471a629e3ed640b3ace8997379f80, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Metalic: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Normal: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _texcoord: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AO_power: 1 + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _ColorMask: 15 + - _Cull: 0 + - _Cutoff: 0.522 + - _DetailNormalMapScale: 1 + - _DetailSkin_MetalicAlpha: 0 + - _DetailSkin_Rotate: 0 + - _DetailSkin_alpha: 1 + - _DistortionBlend: 0.5 + - _DistortionEnabled: 0 + - _DistortionStrength: 1 + - _DistortionStrengthScaled: 0 + - _DstBlend: 0 + - _EmissionEnabled: 0 + - _FlipbookMode: 0 + - _Focus: -100 + - _GlossMapScale: 0 + - _Glossiness: 0.75 + - _GlossyReflections: 1 + - _LightingEnabled: 1 + - _MetalicPower: 0 + - _Metallic: 0 + - _Mode: 1 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SSS_Depth: 1 + - _SSS_Power: 1 + - _Shininess: 0.2 + - _Smoothness: 1 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Stencil: 0 + - _StencilComp: 0 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _Strength: 0.946 + - _TransAmbient: 0.2 + - _TransDirect: 1 + - _TransNormalDistortion: 0.1 + - _TransScattering: 2 + - _TransShadow: 0.9 + - _Translucency: 1 + - _Translucency_Power: 0.6 + - _UVSec: 0 + - _UseUIAlphaClip: 1 + - _ZWrite: 1 + - __dirty: 0 + m_Colors: + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 0.24705882, g: 0.10980392, b: 0.14509805, a: 1} + - _DetailSkin_Tiling: {r: 1, g: 1, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} + - _Specular: {r: 0, g: 0, b: 0, a: 0} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Cut.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Cut.mat.meta new file mode 100644 index 0000000..a66443c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Cut.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed6c8ba68bcd2ad4fb7098df08385c8a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Fade.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Fade.mat new file mode 100644 index 0000000..9f8e16d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Fade.mat @@ -0,0 +1,96 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Shieh_Hair_Fade + m_Shader: {fileID: 210, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHABLEND_ON _NORMALMAP + m_LightmapFlags: 0 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: + - ALWAYS + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: cabd98cd3b67a394aa643d4af9e213b5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: b44cd9333e4445f4fa9a18a8497cd05a, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _Cull: 0 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DistortionBlend: 0 + - _DistortionEnabled: 0 + - _DistortionStrength: 0.2 + - _DistortionStrengthScaled: 0.020000001 + - _DstBlend: 10 + - _EmissionEnabled: 0 + - _FlipbookMode: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.25 + - _GlossyReflections: 1 + - _LightingEnabled: 1 + - _Metallic: 0 + - _Mode: 2 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 5 + - _UVSec: 0 + - _ZWrite: 0 + m_Colors: + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 0.24705882, g: 0.10980392, b: 0.14509805, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Fade.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Fade.mat.meta new file mode 100644 index 0000000..32a930a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Hair_Fade.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 376c8c0bf40fba140940115ceb7985fa +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Head.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Head.mat new file mode 100644 index 0000000..e6835be --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Head.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Shieh_Head + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHATEST_ON _EMISSION _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2450 + stringTagMap: + RenderType: TransparentCutout + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 5f6a88171526ba44b8edd0316d32be0e, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: ad403e56572b6a54186e29d055ca35a3, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 9c2bcc6b9ea5025408d01f4065252dbc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 2800000, guid: 79a57944faad1ef4db6a45d577955641, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 1 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Head.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Head.mat.meta new file mode 100644 index 0000000..fdbf6d3 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Head.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8353a028dd490d2469b49615a280587b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Shader_mat.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Shader_mat.mat new file mode 100644 index 0000000..da07b1a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Shader_mat.mat @@ -0,0 +1,197 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Shieh_Shader_mat + m_Shader: {fileID: 4800000, guid: e581164ca006851408ab64a0280abd71, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _Albedo: + m_Texture: {fileID: 2800000, guid: ad403e56572b6a54186e29d055ca35a3, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 2800000, guid: 5f6a88171526ba44b8edd0316d32be0e, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailSkin_Metalic: + m_Texture: {fileID: 2800000, guid: 508aaba794b76264994ff90752435697, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailSkin_Normal: + m_Texture: {fileID: 2800000, guid: 7a4aa691425a0e84996a3a3f3d3ef326, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: ad403e56572b6a54186e29d055ca35a3, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Mask: + m_Texture: {fileID: 2800000, guid: 4de633b93a5c4fd4ba6a9263663ff7e1, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Metalic: + m_Texture: {fileID: 2800000, guid: 9c2bcc6b9ea5025408d01f4065252dbc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicTex: + m_Texture: {fileID: 2800000, guid: 9c2bcc6b9ea5025408d01f4065252dbc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Normal: + m_Texture: {fileID: 2800000, guid: 5f6a88171526ba44b8edd0316d32be0e, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionTex: + m_Texture: {fileID: 2800000, guid: 79a57944faad1ef4db6a45d577955641, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SQZ_M: + m_Texture: {fileID: 2800000, guid: 0bde64e6f5a7c7645b626bacac977600, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Wide_M: + m_Texture: {fileID: 2800000, guid: 76493984454b03f47a3137acfc5ee3a6, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Wrinkle: + m_Texture: {fileID: 2800000, guid: bf18efd814a59c645a89649c222ce5ec, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _WrinkleMap_Default: + m_Texture: {fileID: 2800000, guid: e86ced7d9ef006641b3cf8855baf388b, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _WrinkleMap_Sad: + m_Texture: {fileID: 2800000, guid: e86ced7d9ef006641b3cf8855baf388b, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _WrinkleMap_Smile: + m_Texture: {fileID: 2800000, guid: b3054ff6e9f73b243b3cda952fa02424, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _WrinkleMask_Sad: + m_Texture: {fileID: 2800000, guid: b651b3205353cbe4eafef19f8cd4eee6, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _WrinkleMask_Smile: + m_Texture: {fileID: 2800000, guid: 9f79442cfa74a03479bcc9683e287520, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _WrinkleMask_Squeeze: + m_Texture: {fileID: 2800000, guid: 0bde64e6f5a7c7645b626bacac977600, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _WrinkleMask_Wide_Up: + m_Texture: {fileID: 2800000, guid: 76493984454b03f47a3137acfc5ee3a6, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Wrinkle_Sad: + m_Texture: {fileID: 2800000, guid: e86ced7d9ef006641b3cf8855baf388b, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Wrinkle_Smile: + m_Texture: {fileID: 2800000, guid: b3054ff6e9f73b243b3cda952fa02424, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _lip_Sad_M: + m_Texture: {fileID: 2800000, guid: b651b3205353cbe4eafef19f8cd4eee6, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _lip_Smile_M: + m_Texture: {fileID: 2800000, guid: 9f79442cfa74a03479bcc9683e287520, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _texcoord: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AO_power: 1 + - _Bump: 1 + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DetailSkin_MetalicAlpha: 0.3 + - _DetailSkin_Rotate: 8 + - _DetailSkin_alpha: 0.45 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 1 + - _GlossyReflections: 1 + - _MetalicPower: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SSS_Depth: 6.47 + - _SSS_Power: 1 + - _Smoothness: 0.7 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _TransAmbient: 0.994 + - _TransDirect: 1 + - _TransNormalDistortion: 0 + - _TransScattering: 1 + - _TransShadow: 1 + - _Translucency: 1 + - _Translucency_Power: 0.5 + - _UVSec: 0 + - _WrinkleMapIndex: 0 + - _WrinkleScale_Sad_Left: 0 + - _WrinkleScale_Sad_Right: 0 + - _WrinkleScale_Smile_Left: 1 + - _WrinkleScale_Smile_Right: 0 + - _WrinkleScale_Squeeze_Left: 0 + - _WrinkleScale_Squeeze_Right: 0 + - _WrinkleScale_Wide_Up_Left: 0 + - _WrinkleScale_Wide_Up_Right: 0 + - _ZWrite: 1 + - __dirty: 0 + - _wrinkle_AllScale: 50 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _DetailSkin_Tiling: {r: 30, g: 30, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Shader_mat.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Shader_mat.mat.meta new file mode 100644 index 0000000..a573f8b --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Shieh_Shader_mat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6704f299735c02843847e2ccf3d0c3dd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Hair_mat.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Hair_mat.mat new file mode 100644 index 0000000..d287e7e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Hair_mat.mat @@ -0,0 +1,81 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Wireframe_Hair_mat + m_Shader: {fileID: 4800000, guid: 2a6a855fbef71e745a2f55a929d8f30f, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.369 + - _GlossyReflections: 1 + - _Metallic: 0.352 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _WireSmoothness: 8 + - _WireThickness: 103 + - _ZWrite: 1 + m_Colors: + - _AlbedoColor: {r: 0.4811321, g: 0.4811321, b: 0.4811321, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _WireColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Hair_mat.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Hair_mat.mat.meta new file mode 100644 index 0000000..14a426c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Hair_mat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 520a4847db765cc418e040ae616a29a0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Male_mat.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Male_mat.mat new file mode 100644 index 0000000..87677b7 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Male_mat.mat @@ -0,0 +1,81 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Wireframe_Male_mat + m_Shader: {fileID: 4800000, guid: 2a6a855fbef71e745a2f55a929d8f30f, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: ad403e56572b6a54186e29d055ca35a3, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.341 + - _GlossyReflections: 1 + - _Metallic: 0.651 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _WireSmoothness: 8 + - _WireThickness: 103 + - _ZWrite: 1 + m_Colors: + - _AlbedoColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _WireColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Male_mat.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Male_mat.mat.meta new file mode 100644 index 0000000..32277aa --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/Wireframe_Male_mat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0bb210a00b727cc40990a0a319c0935f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/eyelash_mat.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/eyelash_mat.mat new file mode 100644 index 0000000..046ad73 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/eyelash_mat.mat @@ -0,0 +1,103 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: eyelash_mat + m_Shader: {fileID: 210, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHABLEND_ON _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 0 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: + - ALWAYS + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: e6353fa07def4bd41b8b64a3387053cc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 652f3a0713d910a48a2a62fcaefd72ac, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 2ef75489dda574346a294ffc114c92d5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 2800000, guid: e65b11d96b6e96b46a8b4bf2aa19344f, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _Cull: 0 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DistortionBlend: 0.5 + - _DistortionEnabled: 0 + - _DistortionStrength: 1 + - _DistortionStrengthScaled: 0 + - _DstBlend: 10 + - _EmissionEnabled: 0 + - _FlipbookMode: 0 + - _GlossMapScale: 0.7 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _InvFade: 1 + - _LightingEnabled: 1 + - _Metallic: 0 + - _Mode: 2 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 5 + - _UVSec: 0 + - _ZWrite: 0 + m_Colors: + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmisColor: {r: 0.2, g: 0.2, b: 0.2, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} + - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + - _TintColor: {r: 0.5, g: 0.5, b: 0.5, a: 0.5} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/eyelash_mat.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/eyelash_mat.mat.meta new file mode 100644 index 0000000..21f52cc --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/eyelash_mat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed4b25628f9822042ae28821748b430f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/head_mat.mat b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/head_mat.mat new file mode 100644 index 0000000..58962fa --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/head_mat.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_Name: head_mat + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHATEST_ON _EMISSION _METALLICGLOSSMAP _NORMALMAP + m_LightmapFlags: 1 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 2450 + stringTagMap: + RenderType: TransparentCutout + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 2800000, guid: e6353fa07def4bd41b8b64a3387053cc, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 652f3a0713d910a48a2a62fcaefd72ac, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 2ef75489dda574346a294ffc114c92d5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 2800000, guid: e65b11d96b6e96b46a8b4bf2aa19344f, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 0.7 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 1 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/head_mat.mat.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/head_mat.mat.meta new file mode 100644 index 0000000..b8281b8 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Materials/head_mat.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 64185bf5c669e274ca89bb76c87d1429 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_AO.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_AO.png new file mode 100644 index 0000000..42d1673 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d538f6214e6743f323f6a74970d93917e70e05996d58d4ef9812aac51d0654cf +size 2482161 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_AO.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_AO.png.meta new file mode 100644 index 0000000..1e242bf --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_AO.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 79a57944faad1ef4db6a45d577955641 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Albedo.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Albedo.png new file mode 100644 index 0000000..cd2591f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Albedo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5bea5909bc4113871bd74a77b2a164f5c665b110c16edae26aa994461374665 +size 17075041 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Albedo.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Albedo.png.meta new file mode 100644 index 0000000..1366546 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Albedo.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: ad403e56572b6a54186e29d055ca35a3 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Metallic.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Metallic.png new file mode 100644 index 0000000..d6f7a50 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa418b2821d306e3f302ea203ef67326483984223161b93fb2ec06c3448e88d7 +size 9479725 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Metallic.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Metallic.png.meta new file mode 100644 index 0000000..71ff5f4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/Shieh_Metallic.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 9c2bcc6b9ea5025408d01f4065252dbc +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_squeeze.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_squeeze.png new file mode 100644 index 0000000..bd71feb --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_squeeze.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7f1b55d20bbd10099b82df80164d3d9ba7be6ec0519c04bf8d5951638b7461a +size 59551 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_squeeze.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_squeeze.png.meta new file mode 100644 index 0000000..bde6821 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_squeeze.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 0bde64e6f5a7c7645b626bacac977600 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_wide_up.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_wide_up.png new file mode 100644 index 0000000..de69057 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_wide_up.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5247b8864ebd1e8947a02f81adb227be00d45c5774c419b48f6be859dfb74ee0 +size 72684 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_wide_up.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_wide_up.png.meta new file mode 100644 index 0000000..dbbffed --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_eye_wide_up.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 76493984454b03f47a3137acfc5ee3a6 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_sad.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_sad.png new file mode 100644 index 0000000..6009f70 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_sad.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c49e43b120801562c91134a41475f8a969f1c7562b0ea695f2c3fbcbc0c99466 +size 112742 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_sad.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_sad.png.meta new file mode 100644 index 0000000..fbcad81 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_sad.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: b651b3205353cbe4eafef19f8cd4eee6 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_smile.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_smile.png new file mode 100644 index 0000000..20a11b0 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_smile.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a744bd27e0c1b0f5b5fb6c03f7dc94482fe0cbb032e8451f04b93c78165df05 +size 126903 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_smile.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_smile.png.meta new file mode 100644 index 0000000..4015b22 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkleMask_lip_smile.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: 9f79442cfa74a03479bcc9683e287520 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles.png new file mode 100644 index 0000000..ee1849e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b363d3dd812da45dbd68fc43a943f46a47d2f590619daba1e2bdc570d931256 +size 22209454 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles.png.meta new file mode 100644 index 0000000..e4546df --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: bf18efd814a59c645a89649c222ce5ec +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_sad.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_sad.png new file mode 100644 index 0000000..7c33ec3 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_sad.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92c3390f88e8d560433333bfddb3c485521bdda423ca8d29ec9d7b0aa2a16d06 +size 21769126 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_sad.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_sad.png.meta new file mode 100644 index 0000000..266c6d6 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_sad.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: e86ced7d9ef006641b3cf8855baf388b +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_smile.png b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_smile.png new file mode 100644 index 0000000..e7c4d63 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_smile.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2d0b6d1de854a60f2c4beb08d2ff9cb09f0ff6dcd4a593b9e3cd335968f9ceb +size 21780975 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_smile.png.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_smile.png.meta new file mode 100644 index 0000000..99bf290 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Models/version2/Avatar_Shieh/shieh_wrinkles_smile.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: b3054ff6e9f73b243b3cda952fa02424 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 1 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs.meta new file mode 100644 index 0000000..96d0d01 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f4c3d6d86a0a5b2499122b22fa6ab21c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Avatar_Shieh_V2.prefab b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Avatar_Shieh_V2.prefab new file mode 100644 index 0000000..1576415 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Avatar_Shieh_V2.prefab @@ -0,0 +1,465 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3051409913850635161 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3051409913850609593} + - component: {fileID: 3051409913849839515} + - component: {fileID: 3051409913848708443} + m_Layer: 0 + m_Name: Eye_Left + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3051409913850609593 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635161} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.034480397, y: 0.008242355, z: 0.078922845} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3051409913850609595} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3051409913849839515 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635161} + m_Mesh: {fileID: 4300002, guid: cc2bd8780f283784899dcb72f2f7702f, type: 3} +--- !u!23 &3051409913848708443 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635161} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 64185bf5c669e274ca89bb76c87d1429, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &3051409913850635163 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3051409913850609595} + - component: {fileID: 3051409913860149339} + - component: {fileID: 3051409913850733895} + - component: {fileID: 3051409913850733890} + m_Layer: 0 + m_Name: Avatar_Shieh_V2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3051409913850609595 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635163} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -0.04, z: -0.158} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 3051409913850609593} + - {fileID: 3051409913850609599} + - {fileID: 3051409913850609597} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!95 &3051409913860149339 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635163} + m_Enabled: 1 + m_Avatar: {fileID: 9000000, guid: cc2bd8780f283784899dcb72f2f7702f, type: 3} + m_Controller: {fileID: 0} + m_CullingMode: 1 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!114 &3051409913850733895 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635163} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2872c722b18f6d043ad0dbae08561d64, type: 3} + m_Name: + m_EditorClassIdentifier: + EyesModels: + - {fileID: 3051409913850609593} + - {fileID: 3051409913850609599} + EyeShapeTables: + - skinnedMeshRenderer: {fileID: 3051409913864302235} + eyeShapes: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + EyebrowAnimationCurveUpper: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + EyebrowAnimationCurveLower: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + EyebrowAnimationCurveHorizontal: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 0 + NeededToGetData: 1 +--- !u!114 &3051409913850733890 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635163} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 42350b51669fc604cb2cad73c39f116c, type: 3} + m_Name: + m_EditorClassIdentifier: + LipShapeTables: + - skinnedMeshRenderer: {fileID: 3051409913864302235} + lipShapes: 010000000000000002000000030000000400000006000000050000000800000007000000090000000a0000000b0000000d0000000c0000000f0000000e00000011000000100000001200000014000000130000001600000015000000170000001800000019000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1a000000200000001b0000001c0000001d0000001e0000001f00000022000000210000002400000023000000 + NeededToGetData: 1 +--- !u!1 &3051409913850635165 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3051409913850609597} + - component: {fileID: 3051409913864302235} + m_Layer: 0 + m_Name: Head + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3051409913850609597 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635165} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0, y: -0.05097887, z: 0.004202667} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3051409913850609595} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!137 &3051409913864302235 +SkinnedMeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635165} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 3 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 64185bf5c669e274ca89bb76c87d1429, type: 2} + - {fileID: 2100000, guid: ed4b25628f9822042ae28821748b430f, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + serializedVersion: 2 + m_Quality: 0 + m_UpdateWhenOffscreen: 1 + m_SkinnedMotionVectors: 1 + m_Mesh: {fileID: 4300000, guid: cc2bd8780f283784899dcb72f2f7702f, type: 3} + m_Bones: [] + m_BlendShapeWeights: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + m_RootBone: {fileID: 0} + m_AABB: + m_Center: {x: 0, y: 0, z: 0.0039771833} + m_Extent: {x: 0.0988433, y: 0.18122566, z: 0.12538658} + m_DirtyAABB: 0 +--- !u!1 &3051409913850635167 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3051409913850609599} + - component: {fileID: 3051409913849839513} + - component: {fileID: 3051409913848708441} + m_Layer: 0 + m_Name: Eye_Right + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3051409913850609599 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635167} + m_LocalRotation: {x: 0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.034480397, y: 0.008242355, z: 0.078922845} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3051409913850609595} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3051409913849839513 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635167} + m_Mesh: {fileID: 4300004, guid: cc2bd8780f283784899dcb72f2f7702f, type: 3} +--- !u!23 &3051409913848708441 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3051409913850635167} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 64185bf5c669e274ca89bb76c87d1429, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Avatar_Shieh_V2.prefab.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Avatar_Shieh_V2.prefab.meta new file mode 100644 index 0000000..470f5c4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Avatar_Shieh_V2.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4e2328178fed81348aec48d0f79c86fa +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Eye Framework.prefab b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Eye Framework.prefab new file mode 100644 index 0000000..23f0ed4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Eye Framework.prefab @@ -0,0 +1,54 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 1707266662751158} + m_IsPrefabParent: 1 +--- !u!1 &1707266662751158 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4879914434278830} + - component: {fileID: 114214629311031788} + m_Layer: 0 + m_Name: Eye Framework + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4879914434278830 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1707266662751158} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &114214629311031788 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1707266662751158} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 47613961cde0a8b4aa4f79219b7e523c, type: 3} + m_Name: + m_EditorClassIdentifier: + EnableEye: 1 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Eye Framework.prefab.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Eye Framework.prefab.meta new file mode 100644 index 0000000..610abd9 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Eye Framework.prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f676e25d0fcd1ec4fa22af3017316de9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 100100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Head Render Scene.prefab b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Head Render Scene.prefab new file mode 100644 index 0000000..184d857 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Head Render Scene.prefab @@ -0,0 +1,553 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &4074961599298165399 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4074961599298165385} + - component: {fileID: 4074961599298165398} + m_Layer: 0 + m_Name: Point Light (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4074961599298165385 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961599298165399} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.2949375, y: -0.06575787, z: -5.280289} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8952382327610939962} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &4074961599298165398 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961599298165399} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 2 + m_Color: {r: 1, g: 0.93290716, b: 0.8915094, a: 1} + m_Intensity: 4.5 + m_Range: 0.74 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: 2 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!1 &4074961600008829738 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4074961600008829740} + - component: {fileID: 4074961600008829741} + m_Layer: 0 + m_Name: Point Light (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4074961600008829740 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961600008829738} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.1779375, y: -0.058757782, z: -5.280289} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8952382327610939962} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &4074961600008829741 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961600008829738} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 2 + m_Color: {r: 1, g: 0.93290716, b: 0.8915094, a: 1} + m_Intensity: 4.5 + m_Range: 0.74 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: 2 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!1 &4074961600518024484 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4074961600518024487} + - component: {fileID: 4074961600518024486} + m_Layer: 0 + m_Name: Point Light (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4074961600518024487 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961600518024484} + m_LocalRotation: {x: 1, y: -0, z: -0, w: 0} + m_LocalPosition: {x: -0.7109375, y: 0.56050384, z: -31.090294} + m_LocalScale: {x: 1, y: 1, z: 1.7900008} + m_Children: [] + m_Father: {fileID: 8952382327610939962} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 180, y: 0, z: 0} +--- !u!108 &4074961600518024486 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961600518024484} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 2 + m_Color: {r: 1, g: 0.9656903, b: 0.9386792, a: 1} + m_Intensity: 10 + m_Range: 56 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 2 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 20, y: 20} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 10 + m_ShadowAngle: 0 +--- !u!1 &4074961600630269481 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4074961600630269483} + - component: {fileID: 4074961600630269480} + m_Layer: 0 + m_Name: Point Light (9) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4074961600630269483 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961600630269481} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.6849375, y: -0.058757782, z: -5.280289} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8952382327610939962} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &4074961600630269480 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961600630269481} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 2 + m_Color: {r: 1, g: 0.93290716, b: 0.8915094, a: 1} + m_Intensity: 2 + m_Range: 2.3 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: 2 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!1 &4074961600660305650 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4074961600660305652} + - component: {fileID: 4074961600660305653} + m_Layer: 0 + m_Name: Reflection Probe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 4294967295 + m_IsActive: 1 +--- !u!4 &4074961600660305652 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961600660305650} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.7109375, y: -1.3017578, z: -4.696289} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 8952382327610939962} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!215 &4074961600660305653 +ReflectionProbe: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961600660305650} + m_Enabled: 1 + serializedVersion: 2 + m_Type: 0 + m_Mode: 0 + m_RefreshMode: 0 + m_TimeSlicingMode: 0 + m_Resolution: 128 + m_UpdateFrequency: 0 + m_BoxSize: {x: 10, y: 10, z: 10} + m_BoxOffset: {x: 0, y: 0, z: 0} + m_NearClip: 0.3 + m_FarClip: 1000 + m_ShadowDistance: 100 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_IntensityMultiplier: 0.32 + m_BlendDistance: 1 + m_HDR: 1 + m_BoxProjection: 0 + m_RenderDynamicObjects: 0 + m_UseOcclusionCulling: 1 + m_Importance: 1 + m_CustomBakedTexture: {fileID: 0} +--- !u!1 &4074961601106615688 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4074961601106615692} + - component: {fileID: 4074961601106615693} + - component: {fileID: 4074961601106615690} + - component: {fileID: 4074961601106615691} + m_Layer: 0 + m_Name: Cast Shadows_cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4074961601106615692 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961601106615688} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -0.52393746, y: -0.11075783, z: -6.846289} + m_LocalScale: {x: 7.657784, y: 5.6148458, z: 0.41230226} + m_Children: [] + m_Father: {fileID: 8952382327610939962} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &4074961601106615693 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961601106615688} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4074961601106615690 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961601106615688} + m_Enabled: 1 + m_CastShadows: 3 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!65 &4074961601106615691 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4074961601106615688} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &8040272353404943719 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8952382327610939962} + m_Layer: 0 + m_Name: Head Render Scene + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8952382327610939962 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8040272353404943719} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.7109375, y: 1.3017578, z: 4.696289} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4074961599873163959} + - {fileID: 4074961600518024487} + - {fileID: 4074961599298165385} + - {fileID: 4074961600008829740} + - {fileID: 4074961600630269483} + - {fileID: 4074961600660305652} + - {fileID: 4074961601106615692} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &4074961599873038391 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 8952382327610939962} + m_Modifications: + - target: {fileID: 100000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_Name + value: BG_Sphere + objectReference: {fileID: 0} + - target: {fileID: 100000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_StaticEditorFlags + value: 4294967295 + objectReference: {fileID: 0} + - target: {fileID: 100000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_LocalPosition.x + value: -0.7109375 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_LocalPosition.y + value: -1.3017578 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_LocalPosition.z + value: -4.696289 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2300000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 8a5a89b610f3b1849965dba78a1458f1, type: 2} + - target: {fileID: 2300000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_StitchLightmapSeams + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2300000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} + propertyPath: m_CastShadows + value: 2 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, type: 3} +--- !u!4 &4074961599873163959 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 400000, guid: 199c3bd67beb8c6469f1453fe2a36ff8, + type: 3} + m_PrefabInstance: {fileID: 4074961599873038391} + m_PrefabAsset: {fileID: 0} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Head Render Scene.prefab.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Head Render Scene.prefab.meta new file mode 100644 index 0000000..db1d037 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Head Render Scene.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7776754447252ff4087ea2ebcc9821d3 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Lip Framework.prefab b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Lip Framework.prefab new file mode 100644 index 0000000..b5c5b4e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Lip Framework.prefab @@ -0,0 +1,54 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &100100000 +Prefab: + m_ObjectHideFlags: 1 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: [] + m_RemovedComponents: [] + m_ParentPrefab: {fileID: 0} + m_RootGameObject: {fileID: 1827556865440936} + m_IsPrefabParent: 1 +--- !u!1 &1827556865440936 +GameObject: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + serializedVersion: 5 + m_Component: + - component: {fileID: 4953106396633158} + - component: {fileID: 114413432704905738} + m_Layer: 0 + m_Name: Lip Framework + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4953106396633158 +Transform: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1827556865440936} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &114413432704905738 +MonoBehaviour: + m_ObjectHideFlags: 1 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 100100000} + m_GameObject: {fileID: 1827556865440936} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 41f6d745d46210a49a0df9fe7d0d1102, type: 3} + m_Name: + m_EditorClassIdentifier: + EnableLip: 1 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Lip Framework.prefab.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Lip Framework.prefab.meta new file mode 100644 index 0000000..492551e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Prefabs/Lip Framework.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 86d935e0d01acbe44887f792476d36e5 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Readme.md b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Readme.md new file mode 100644 index 0000000..2b32797 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Readme.md @@ -0,0 +1,19 @@ +# VIVE OpenXR Facial Tracking Unity Feature + +To help software developers create an application with actual facial expressions on 3D avatars with the OpenXR facial tracing extension [XR_HTC_facial_tracking](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_HTC_facial_tracking). + +## Load sample code +**Window** > **Package Manager** > **VIVE OpenXR Plugin - Windows** > **Samples** > Click to import **FacialTracking Example** + +## Play the sample scene +1. **Edit** > **Project Settings** > **XR Plug-in Management** > Select **OpenXR** , click Exclamation mark next to it then choose **Fix All**. +2. **Edit** > **Project Settings** > **XR Plug-in Management** > **OpenXR** > Add Interaction profiles for your device. +3. **Edit** > **Project Settings** > **XR Plug-in Management** > **OpenXR** > Select **Facial Tracking** under **VIVE OpenXR** Feature Groups. +4. In the Unity Project window, select the sample scene file in **Assets** > **Samples** > **VIVE OpenXR Plugin - Windows** > **1.0.12** > **FacialTracking Example** > **Scenes** > **FaceSample.unity** then click Play. + +## How to use VIVE OpenXR Facial Tracking Unity Feature +1. Import VIVE OpenXR Plugin - Windows +2. Add your avatar object to the Unity scene. + - Attach "AvatarEyeSample.cs" and "AvatarLipSample.cs" to your avatar object or Drag "Avatar_Shieh_V2" prefab into scene hierarchy. + - Refer to functions **StartFrameWork** and **StopFrameWork** in **FacialManager.cs** for creating and releasing handle for face. + - Refer to the function **GetWeightings** in **FacialManager.cs** for getting the weightings of blendshapes. \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Readme.md.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Readme.md.meta new file mode 100644 index 0000000..8b8d598 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Readme.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 30b23b4f71cad4447a3391acbb89f4d0 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes.meta new file mode 100644 index 0000000..55c31c9 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a61dfaae82a22ea46a30881e98813962 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSample.unity b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSample.unity new file mode 100644 index 0000000..a906ad4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSample.unity @@ -0,0 +1,755 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.45112008, g: 0.49971223, b: 0.5675026, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 4890085278179872738, guid: 139b813ee621cbb41b237fe73214bf9f, type: 2} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &306469291 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 1972517298404456, guid: 628ff83903a43c74ba5c884b8d6d0b59, type: 2} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 306469292} + - component: {fileID: 306469293} + m_Layer: 0 + m_Name: Avatar Sample + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &306469292 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 4567766556640800, guid: 628ff83903a43c74ba5c884b8d6d0b59, type: 2} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 306469291} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1374042943} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &306469293 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 306469291} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 196084005ab84764aac2e78a079dc66c, type: 3} + m_Name: + m_EditorClassIdentifier: + camera: {fileID: 1387412029} +--- !u!1001 &539581763 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 4074961600660305650, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8040272353404943719, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_Name + value: Head Render Scene + objectReference: {fileID: 0} + - target: {fileID: 8040272353404943719, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8952382327610939962, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 7776754447252ff4087ea2ebcc9821d3, type: 3} +--- !u!1 &760214750 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 760214753} + - component: {fileID: 760214752} + - component: {fileID: 760214751} + m_Layer: 0 + m_Name: Objects placed in front of user + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &760214751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 760214750} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 19eff34b54274a84c8b0f87cffbfd76a, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!20 &760214752 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 760214750} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 2147483647 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 8400000, guid: 600a6f0266444c145945aa3e7f2a29a6, type: 2} + m_TargetDisplay: 0 + m_TargetEye: 0 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &760214753 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 760214750} + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: 0.6} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1921226929} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!4 &1374042943 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + m_PrefabInstance: {fileID: 3051409913039127684} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1387412024 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1387412029} + - component: {fileID: 1387412028} + - component: {fileID: 1387412026} + - component: {fileID: 1387412025} + - component: {fileID: 1387412027} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &1387412025 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387412024} + m_Enabled: 1 +--- !u!124 &1387412026 +Behaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387412024} + m_Enabled: 1 +--- !u!114 &1387412027 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387412024} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5a2a9c34df4095f47b9ca8f975175f5b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Device: 0 + m_PoseSource: 2 + m_PoseProviderComponent: {fileID: 0} + m_TrackingType: 0 + m_UpdateType: 0 + m_UseRelativeTransform: 0 +--- !u!20 &1387412028 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387412024} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.01 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &1387412029 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1387412024} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1921226928 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1921226929} + - component: {fileID: 1921226932} + - component: {fileID: 1921226931} + - component: {fileID: 1921226930} + m_Layer: 0 + m_Name: Mirror + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1921226929 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1921226928} + m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: -1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 760214753} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!23 &1921226930 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1921226928} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 20c0a6a4ee4540848b1ad902026d6110, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 1 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 0 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &1921226931 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1921226928} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!33 &1921226932 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1921226928} + m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2095842635 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2095842637} + - component: {fileID: 2095842636} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &2095842636 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2095842635} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &2095842637 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2095842635} + m_LocalRotation: {x: -0.008544729, y: -0.21568543, z: 0.9708363, w: -0.10432531} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 24.871, y: -358.205, z: -167.337} +--- !u!1001 &3051409913039127684 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 306469292} + m_Modifications: + - target: {fileID: 3051409913850609593, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalScale.z + value: -1 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609593, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609593, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609593, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609593, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalScale.z + value: -1 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalPosition.y + value: -0.04 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalPosition.z + value: -0.158 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609595, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609597, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalScale.z + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609599, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalScale.z + value: -1 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609599, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609599, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609599, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850609599, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850635163, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_Name + value: Avatar_Shieh_V2 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850733890, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850733890, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: NeededToGetData + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850733895, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3051409913850733895, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} + propertyPath: NeededToGetData + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 4e2328178fed81348aec48d0f79c86fa, type: 3} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSample.unity.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSample.unity.meta new file mode 100644 index 0000000..3520a29 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSample.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 95faae79a7fda8248a4f435507170572 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSampleSettings.lighting b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSampleSettings.lighting new file mode 100644 index 0000000..1a3f4ce --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSampleSettings.lighting @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89a4704d8475f9ce68cf799e18712158a258baf1db77a3031f7e2fa26b571182 +size 1821 diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSampleSettings.lighting.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSampleSettings.lighting.meta new file mode 100644 index 0000000..dfab646 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scenes/FaceSampleSettings.lighting.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 139b813ee621cbb41b237fe73214bf9f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 4890085278179872738 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts.meta new file mode 100644 index 0000000..2d0fc10 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bbd12fde1e123894dafba0082f69c79a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye.meta new file mode 100644 index 0000000..8f0bc7d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7eb9da8a5f7ef3740828986abcac7265 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye.cs new file mode 100644 index 0000000..5c9927f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye.cs @@ -0,0 +1,71 @@ +//========= Copyright 2019, HTC Corporation. All rights reserved. =========== +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using UnityEngine; +using UnityEngine.XR.OpenXR; +namespace VIVE +{ + namespace FacialTracking.Sample + { + public static class Eye + { + public const int WeightingCount = (int)XrEyeShapeHTC.XR_EYE_EXPRESSION_MAX_ENUM_HTC; + private static XrFacialExpressionsHTC EyeExpression_; + private static int LastUpdateFrame = -1; + private static Error LastUpdateResult = Error.FAILED; + private static Dictionary Weightings; + private static float[] blendshapes = new float[60]; + static Eye() + { + Weightings = new Dictionary(); + for (int i = 0; i < WeightingCount; ++i) Weightings.Add((XrEyeShapeHTC)i, 0.0f); + } + private static bool UpdateData() + { + if (Time.frameCount == LastUpdateFrame) return LastUpdateResult == Error.WORK; + else LastUpdateFrame = Time.frameCount; + EyeExpression_.expressionCount = 60; + EyeExpression_.type = XrStructureType.XR_TYPE_FACIAL_EXPRESSIONS_HTC; + EyeExpression_.blendShapeWeightings = Marshal.AllocCoTaskMem(sizeof(float) * EyeExpression_.expressionCount); + var feature = OpenXRSettings.Instance.GetFeature(); + int res = feature.xrGetFacialExpressionsHTC(OpenXRSettings.Instance.GetFeature().m_expressionHandle, ref EyeExpression_); + if (res == (int)XrResult.XR_SUCCESS) + { + Marshal.Copy(EyeExpression_.blendShapeWeightings, blendshapes, 0, EyeExpression_.expressionCount); + LastUpdateResult = Error.WORK; + + } + else + { + LastUpdateResult = Error.FAILED; + } + return LastUpdateResult == Error.WORK; + } + public static bool GetEyeWeightings(out Dictionary shapes, XrFacialExpressionsHTC expression) + { + for (int i = 0; i < WeightingCount; ++i) + { + Weightings[(XrEyeShapeHTC)(i)] = blendshapes[i]; + } + shapes = Weightings; + return true; + } + + + /// + /// Gets weighting values from Eye module. + /// + /// Weighting values obtained from Eye module. + /// Indicates whether the values received are new.\ + [Obsolete("Create FacialManager object and call member function GetWeightings instead")] + public static bool GetEyeWeightings(out Dictionary shapes) + { + UpdateData(); + return GetEyeWeightings(out shapes, EyeExpression_); + } + + } + + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye.cs.meta new file mode 100644 index 0000000..e40d949 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 86a415a999d54da45982ad39e33e9ac1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeData.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeData.cs new file mode 100644 index 0000000..e97afe7 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeData.cs @@ -0,0 +1,32 @@ +//========= Copyright 2018, HTC Corporation. All rights reserved. =========== +using System; +using System.Runtime.InteropServices; +using UnityEngine; + +namespace VIVE +{ + namespace FacialTracking.Sample + { + public enum EyeShape + { + None = -1, + Eye_Left_Blink = 0, + Eye_Left_Wide, + Eye_Left_Right, + Eye_Left_Left, + Eye_Left_Up, + Eye_Left_Down, + Eye_Right_Blink = 6, + Eye_Right_Wide, + Eye_Right_Right, + Eye_Right_Left, + Eye_Right_Up, + Eye_Right_Down, + Eye_Frown = 12, + Eye_Left_Squeeze, + Eye_Right_Squeeze, + Max = 15, + } + + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeData.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeData.cs.meta new file mode 100644 index 0000000..915902a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 37460e91d6cb92340a576dfe03bef2b4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeShapeTableDrawer.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeShapeTableDrawer.cs new file mode 100644 index 0000000..2a3fe50 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeShapeTableDrawer.cs @@ -0,0 +1,72 @@ +//========= Copyright 2018, HTC Corporation. All rights reserved. =========== +#if UNITY_EDITOR +using UnityEngine; +using UnityEditor; +using System; + +namespace VIVE +{ + namespace FacialTracking.Sample + { + [CustomPropertyDrawer(typeof(EyeShapeTable))] + public class EyeShapeTableDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(position, label, property); + + Rect newFieldPosition = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); + newFieldPosition.height = EditorGUIUtility.singleLineHeight; + Rect newLabelPosition = position; + newLabelPosition.width -= newFieldPosition.width; + newLabelPosition.height = EditorGUIUtility.singleLineHeight; + SerializedProperty propSkinedMesh = property.FindPropertyRelative("skinnedMeshRenderer"); + SerializedProperty propEyeShapes = property.FindPropertyRelative("eyeShapes"); + EditorGUI.PropertyField(newFieldPosition, propSkinedMesh, GUIContent.none); + newFieldPosition.y += EditorGUIUtility.singleLineHeight; + + SkinnedMeshRenderer skinnedMesh = propSkinedMesh.objectReferenceValue as SkinnedMeshRenderer; + if (skinnedMesh != null && skinnedMesh.sharedMesh.blendShapeCount > 0) + { + if (propEyeShapes.arraySize != skinnedMesh.sharedMesh.blendShapeCount) + { + propEyeShapes.arraySize = skinnedMesh.sharedMesh.blendShapeCount; + for (int i = 0; i < skinnedMesh.sharedMesh.blendShapeCount; ++i) + { + SerializedProperty propEyeShape = propEyeShapes.GetArrayElementAtIndex(i); + string elementName = skinnedMesh.sharedMesh.GetBlendShapeName(i); + + propEyeShape.intValue = (int)XrEyeShapeHTC.XR_EYE_SHAPE_NONE_HTC; + foreach (XrEyeShapeHTC EyeShape in (XrEyeShapeHTC[])Enum.GetValues(typeof(XrEyeShapeHTC))) + { + if (elementName == EyeShape.ToString()) + propEyeShape.intValue = (int)EyeShape; + } + } + } + for (int i = 0; i < skinnedMesh.sharedMesh.blendShapeCount; ++i) + { + SerializedProperty propEyeShape = propEyeShapes.GetArrayElementAtIndex(i); + newLabelPosition.y = newFieldPosition.y; + string elementName = skinnedMesh.sharedMesh.GetBlendShapeName(i); + EditorGUI.LabelField(newLabelPosition, " " + elementName); + EditorGUI.PropertyField(newFieldPosition, propEyeShape, GUIContent.none); + newFieldPosition.y += EditorGUIUtility.singleLineHeight; + } + } + EditorGUI.EndProperty(); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + int LineCount = 1; + SerializedProperty propSkinedMesh = property.FindPropertyRelative("skinnedMeshRenderer"); + SkinnedMeshRenderer skinnedMesh = propSkinedMesh.objectReferenceValue as SkinnedMeshRenderer; + if (skinnedMesh != null) LineCount += skinnedMesh.sharedMesh.blendShapeCount; + return EditorGUIUtility.singleLineHeight * LineCount; + } + } + + } +} +#endif \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeShapeTableDrawer.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeShapeTableDrawer.cs.meta new file mode 100644 index 0000000..1ca370d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/EyeShapeTableDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fb05e3e629aecd44ebe7dbfc4a7a6d56 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye_Framework.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye_Framework.cs new file mode 100644 index 0000000..45971cc --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye_Framework.cs @@ -0,0 +1,100 @@ +//========= Copyright 2018, HTC Corporation. All rights reserved. =========== +using System; +using UnityEngine; +using UnityEngine.XR.OpenXR; +namespace VIVE +{ + namespace FacialTracking.Sample + { + public class Eye_Framework : MonoBehaviour + { + public enum FrameworkStatus { STOP, START, WORKING, ERROR, NOT_SUPPORT } + /// + /// The status of the Eye engine. + /// + public static FrameworkStatus Status { get; protected set; } + + /// + /// Whether to enable Eye module. + /// + public bool EnableEye = true; + + private static Eye_Framework Mgr = null; + public static Eye_Framework Instance + { + get + { + if (Mgr == null) + { + Mgr = FindObjectOfType(); + } + if (Mgr == null) + { + Debug.LogError("Eye_Framework not found"); + } + return Mgr; + } + } + + void Start() + { + StartFramework(); + } + + void OnDestroy() + { + StopFramework(); + } + [Obsolete("Create FacialManager object and call member function StartFramework instead")] + public void StartFramework() + { + if (!EnableEye) return; + if (Status == FrameworkStatus.WORKING || Status == FrameworkStatus.NOT_SUPPORT) return; + XrFacialTrackerCreateInfoHTC m_expressioncreateInfo = new XrFacialTrackerCreateInfoHTC( + XrStructureType.XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC, + IntPtr.Zero, + XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC); + var feature = OpenXRSettings.Instance.GetFeature(); + int res = feature.xrCreateFacialTrackerHTC(m_expressioncreateInfo, out OpenXRSettings.Instance.GetFeature().m_expressionHandle); + if (res == (int)XrResult.XR_SUCCESS || res == (int)XrResult.XR_SESSION_LOSS_PENDING) + { + Debug.Log("Initial Eye success : " + res); + Status = FrameworkStatus.WORKING; + } + else + { + Debug.LogError("Initial Eye fail : " + res); + Status = FrameworkStatus.ERROR; + } + } + [Obsolete("Create FacialManager object and call member function StopFramework instead")] + public void StopFramework() + { + if (Status != FrameworkStatus.NOT_SUPPORT) + { + if (Status != FrameworkStatus.STOP) + { + var feature = OpenXRSettings.Instance.GetFeature(); + int res = feature.xrDestroyFacialTrackerHTC(OpenXRSettings.Instance.GetFeature().m_expressionHandle); + if (res == (int)XrResult.XR_SUCCESS) + { + Debug.Log("Release Eye engine success : " + res); + + } + else + { + Debug.LogError("Release Eye engine fail : " + res); + } + + } + else + { + Debug.Log("Stop Eye Framework : module not on"); + } + } + Status = FrameworkStatus.STOP; + } + } + + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye_Framework.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye_Framework.cs.meta new file mode 100644 index 0000000..0480319 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Eye_Framework.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 47613961cde0a8b4aa4f79219b7e523c +timeCreated: 1545374952 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample.meta new file mode 100644 index 0000000..bb82e42 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e820c013bcd10a4ea94b6d91672f893 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/AvatarEyeSample.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/AvatarEyeSample.cs new file mode 100644 index 0000000..48395b6 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/AvatarEyeSample.cs @@ -0,0 +1,234 @@ +//========= Copyright 2018, HTC Corporation. All rights reserved. =========== +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace VIVE +{ + namespace FacialTracking.Sample + { + [Serializable] + public class EyeShapeTable + { + public SkinnedMeshRenderer skinnedMeshRenderer; + public EyeShape[] eyeShapes; + } + public class AvatarEyeSample : MonoBehaviour + { + [SerializeField] private Transform[] EyesModels = new Transform[0]; + [SerializeField] private List EyeShapeTables; + /// + /// Customize this curve to fit the blend shapes of your avatar. + /// + [SerializeField] private AnimationCurve EyebrowAnimationCurveUpper; + /// + /// Customize this curve to fit the blend shapes of your avatar. + /// + [SerializeField] private AnimationCurve EyebrowAnimationCurveLower; + /// + /// Customize this curve to fit the blend shapes of your avatar. + /// + [SerializeField] private AnimationCurve EyebrowAnimationCurveHorizontal; + + public bool NeededToGetData = true; + private Dictionary EyeWeightings = new Dictionary(); + //Map Openxr eye shape to Avatar eye blendshape + private static Dictionary ShapeMap; + private AnimationCurve[] EyebrowAnimationCurves = new AnimationCurve[(int)EyeShape.Max]; + private GameObject[] EyeAnchors; + private const int NUM_OF_EYES = 2; + private static XrFacialExpressionsHTC EyeExpression; + private FacialManager facialManager = new FacialManager(); + static AvatarEyeSample() + { + ShapeMap = new Dictionary(); + ShapeMap.Add(EyeShape.Eye_Left_Blink, XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_BLINK_HTC); + ShapeMap.Add(EyeShape.Eye_Left_Wide, XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_WIDE_HTC); + ShapeMap.Add(EyeShape.Eye_Right_Blink, XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_BLINK_HTC); + ShapeMap.Add(EyeShape.Eye_Right_Wide, XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_WIDE_HTC); + ShapeMap.Add(EyeShape.Eye_Left_Squeeze, XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_SQUEEZE_HTC); + ShapeMap.Add(EyeShape.Eye_Right_Squeeze, XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_SQUEEZE_HTC); + ShapeMap.Add(EyeShape.Eye_Left_Down, XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_DOWN_HTC); + ShapeMap.Add(EyeShape.Eye_Right_Down, XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_DOWN_HTC); + ShapeMap.Add(EyeShape.Eye_Left_Left, XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_OUT_HTC); + ShapeMap.Add(EyeShape.Eye_Right_Left, XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_IN_HTC); + ShapeMap.Add(EyeShape.Eye_Left_Right, XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_IN_HTC); + ShapeMap.Add(EyeShape.Eye_Right_Right, XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_OUT_HTC); + ShapeMap.Add(EyeShape.Eye_Left_Up, XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_UP_HTC); + ShapeMap.Add(EyeShape.Eye_Right_Up, XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_UP_HTC); + } + private void Start() + { + facialManager.StartFramework(XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC); + SetEyesModels(EyesModels[0], EyesModels[1]); + SetEyeShapeTables(EyeShapeTables); + + AnimationCurve[] curves = new AnimationCurve[(int)EyeShape.Max]; + for (int i = 0; i < EyebrowAnimationCurves.Length; ++i) + { + if (i == (int)EyeShape.Eye_Left_Up || i == (int)EyeShape.Eye_Right_Up) curves[i] = EyebrowAnimationCurveUpper; + else if (i == (int)EyeShape.Eye_Left_Down || i == (int)EyeShape.Eye_Right_Down) curves[i] = EyebrowAnimationCurveLower; + else curves[i] = EyebrowAnimationCurveHorizontal; + } + SetEyeShapeAnimationCurves(curves); + } + + private void Update() + { + if (NeededToGetData) + { + facialManager.GetWeightings(out EyeWeightings); + UpdateEyeShapes(EyeWeightings); + + + Vector3 GazeDirectionCombinedLocal = Vector3.zero; + if (EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_IN_HTC] > EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_OUT_HTC]) + { + GazeDirectionCombinedLocal.x = -1 * EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_IN_HTC]; + } + else + { + GazeDirectionCombinedLocal.x = EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_OUT_HTC]; + } + if (EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_UP_HTC] > EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_DOWN_HTC]) + { + GazeDirectionCombinedLocal.y = EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_UP_HTC]; + } + else + { + GazeDirectionCombinedLocal.y = -EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_LEFT_DOWN_HTC]; + } + GazeDirectionCombinedLocal.z = (float)1.0; + + Vector3 target = EyeAnchors[0].transform.TransformPoint(GazeDirectionCombinedLocal); + EyesModels[0].LookAt(target); + + if (EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_IN_HTC] > EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_OUT_HTC]) + { + GazeDirectionCombinedLocal.x = EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_IN_HTC]; + } + else + { + GazeDirectionCombinedLocal.x = -1 * EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_OUT_HTC]; + } + if (EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_UP_HTC] > EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_DOWN_HTC]) + { + GazeDirectionCombinedLocal.y = EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_UP_HTC]; + } + else + { + GazeDirectionCombinedLocal.y = -EyeWeightings[XrEyeShapeHTC.XR_EYE_EXPRESSION_RIGHT_DOWN_HTC]; + } + GazeDirectionCombinedLocal.z = (float)1.0; + + target = EyeAnchors[1].transform.TransformPoint(GazeDirectionCombinedLocal); + EyesModels[1].LookAt(target); + } + } + private void OnDestroy() + { + facialManager.StopFramework(XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC); + DestroyEyeAnchors(); + } + + public void SetEyesModels(Transform leftEye, Transform rightEye) + { + if (leftEye != null && rightEye != null) + { + EyesModels = new Transform[NUM_OF_EYES] { leftEye, rightEye }; + DestroyEyeAnchors(); + CreateEyeAnchors(); + } + } + + public void SetEyeShapeTables(List eyeShapeTables) + { + bool valid = true; + if (eyeShapeTables == null) + { + valid = false; + } + else + { + for (int table = 0; table < eyeShapeTables.Count; ++table) + { + if (eyeShapeTables[table].skinnedMeshRenderer == null) + { + valid = false; + break; + } + for (int shape = 0; shape < eyeShapeTables[table].eyeShapes.Length; ++shape) + { + EyeShape eyeShape = eyeShapeTables[table].eyeShapes[shape]; + if (eyeShape > EyeShape.Max || eyeShape < 0) + { + valid = false; + break; + } + } + } + } + if (valid) + EyeShapeTables = eyeShapeTables; + } + + public void SetEyeShapeAnimationCurves(AnimationCurve[] eyebrowAnimationCurves) + { + if (eyebrowAnimationCurves.Length == (int)EyeShape.Max) + EyebrowAnimationCurves = eyebrowAnimationCurves; + } + + public void UpdateEyeShapes(Dictionary eyeWeightings) + { + foreach (var table in EyeShapeTables) + RenderModelEyeShape(table, eyeWeightings); + } + + private void RenderModelEyeShape(EyeShapeTable eyeShapeTable, Dictionary weighting) + { + for (int i = 0; i < eyeShapeTable.eyeShapes.Length; ++i) + { + EyeShape eyeShape = eyeShapeTable.eyeShapes[i]; + if (eyeShape > EyeShape.Max || eyeShape < 0 || !ShapeMap.ContainsKey(eyeShape)) continue; + XrEyeShapeHTC xreyeshape = ShapeMap[eyeShape]; + if (eyeShape == EyeShape.Eye_Left_Blink || eyeShape == EyeShape.Eye_Right_Blink) + { + + eyeShapeTable.skinnedMeshRenderer.SetBlendShapeWeight(i, weighting[xreyeshape] * 100f); + } + else + { + AnimationCurve curve = EyebrowAnimationCurves[(int)eyeShape]; + eyeShapeTable.skinnedMeshRenderer.SetBlendShapeWeight(i, curve.Evaluate(weighting[xreyeshape]) * 100f); + } + + + } + } + + private void CreateEyeAnchors() + { + EyeAnchors = new GameObject[NUM_OF_EYES]; + for (int i = 0; i < NUM_OF_EYES; ++i) + { + EyeAnchors[i] = new GameObject(); + EyeAnchors[i].name = "EyeAnchor_" + i; + EyeAnchors[i].transform.SetParent(gameObject.transform); + EyeAnchors[i].transform.localPosition = EyesModels[i].localPosition; + EyeAnchors[i].transform.localRotation = EyesModels[i].localRotation; + EyeAnchors[i].transform.localScale = EyesModels[i].localScale; + } + } + + private void DestroyEyeAnchors() + { + if (EyeAnchors != null) + { + foreach (var obj in EyeAnchors) + if (obj != null) Destroy(obj); + } + } + } + + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/AvatarEyeSample.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/AvatarEyeSample.cs.meta new file mode 100644 index 0000000..5734949 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/AvatarEyeSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2872c722b18f6d043ad0dbae08561d64 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/MirrorCameraSample_Eye.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/MirrorCameraSample_Eye.cs new file mode 100644 index 0000000..f1ede99 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/MirrorCameraSample_Eye.cs @@ -0,0 +1,35 @@ +//========= Copyright 2018, HTC Corporation. All rights reserved. =========== +using System.Runtime.InteropServices; +using UnityEngine; + +namespace VIVE +{ + namespace FacialTracking.Sample + { + /// + /// A very basic mirror. + /// + [RequireComponent(typeof(Camera))] + public class MirrorCameraSample_Eye : MonoBehaviour + { + private const float Distance = 0.6f; + private void Update() + { + if (Eye_Framework.Status != Eye_Framework.FrameworkStatus.WORKING) return; + + } + + private void Release() + { + } + private void SetMirroTransform() + { + transform.position = Camera.main.transform.position + Camera.main.transform.forward * Distance; + transform.position = new Vector3(transform.position.x, Camera.main.transform.position.y, transform.position.z); + transform.LookAt(Camera.main.transform); + transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, 0); + } + } + + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/MirrorCameraSample_Eye.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/MirrorCameraSample_Eye.cs.meta new file mode 100644 index 0000000..6bf8985 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Eye/Sample/MirrorCameraSample_Eye.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 19eff34b54274a84c8b0f87cffbfd76a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/FollowCamera.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/FollowCamera.cs new file mode 100644 index 0000000..f4a102f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/FollowCamera.cs @@ -0,0 +1,22 @@ +using UnityEngine; + +namespace VIVE.FacialTracking.Sample +{ + public class FollowCamera : MonoBehaviour + { + // Start is called before the first frame update + public new Transform camera; + private Vector3 offset; + void Start() + { + this.transform.position = new Vector3(camera.position.x, camera.position.y, camera.position.z + 1); + } + + // Update is called once per frame + void Update() + { + this.transform.position = new Vector3(this.transform.position.x, camera.position.y, this.transform.position.z); + } + } +} + diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/FollowCamera.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/FollowCamera.cs.meta new file mode 100644 index 0000000..d49319e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/FollowCamera.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 196084005ab84764aac2e78a079dc66c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip.meta new file mode 100644 index 0000000..12386c5 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 412f6d64b6ea21045b60b739f1a83f31 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip.cs new file mode 100644 index 0000000..28cad5b --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip.cs @@ -0,0 +1,71 @@ +//========= Copyright 2019, HTC Corporation. All rights reserved. =========== +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using UnityEngine; +using UnityEngine.XR.OpenXR; +namespace VIVE +{ + namespace FacialTracking.Sample + { + public class Lip + { + public const int WeightingCount = (int)XrLipShapeHTC.XR_LIP_SHAPE_MAX_ENUM_HTC; + private static int LastUpdateFrame = -1; + private static Error LastUpdateResult = Error.FAILED; + private static Dictionary Weightings; + private static float[] blendshapes = new float[60]; + private static XrFacialExpressionsHTC LipExpression; + + static Lip() + { + Weightings = new Dictionary(); + for (int i = 0; i < WeightingCount; ++i) Weightings.Add((XrLipShapeHTC)i, 0.0f); + } + + private static bool UpdateData() + { + if (Time.frameCount == LastUpdateFrame) return LastUpdateResult == Error.WORK; + else LastUpdateFrame = Time.frameCount; + LipExpression.expressionCount = 60; + LipExpression.type = XrStructureType.XR_TYPE_FACIAL_EXPRESSIONS_HTC; + LipExpression.blendShapeWeightings = Marshal.AllocCoTaskMem(sizeof(float)* LipExpression.expressionCount); + var feature = OpenXRSettings.Instance.GetFeature(); + int res = feature.xrGetFacialExpressionsHTC(OpenXRSettings.Instance.GetFeature().m_expressionHandle_Lip, ref LipExpression); + + + if(res == (int)XrResult.XR_SUCCESS) + { + LastUpdateResult = Error.WORK; + Marshal.Copy(LipExpression.blendShapeWeightings, blendshapes,0, LipExpression.expressionCount); + for (int i = 0; i < WeightingCount; ++i) + { + Weightings[(XrLipShapeHTC)(i)] = blendshapes[i]; + } + + } + else + { + LastUpdateResult = Error.FAILED; + } + return LastUpdateResult == Error.WORK; + } + + /// + /// Gets weighting values from Lip module. + /// + /// Weighting values obtained from Lip module. + /// Indicates whether the values received are new. + [Obsolete("Create FacialManager object and call member function GetWeightings instead")] + public static bool GetLipWeightings(out Dictionary shapes) + { + bool update = UpdateData(); + shapes = Weightings; + return update; + } + + } + + } +} + diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip.cs.meta new file mode 100644 index 0000000..ba9bca9 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8bc508f7f051e624181e0391cf04db7f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipData.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipData.cs new file mode 100644 index 0000000..e30a512 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipData.cs @@ -0,0 +1,69 @@ +//========= Copyright 2019, HTC Corporation. All rights reserved. =========== +using System; +using System.Runtime.InteropServices; + +namespace VIVE +{ + namespace FacialTracking.Sample + { + public enum LipShape + { + None = -1, + Jaw_Right = 0, + Jaw_Left = 1, + Jaw_Forward = 2, + Jaw_Open = 3, + Mouth_Ape_Shape = 4, + Mouth_Upper_Right = 5, + Mouth_Upper_Left = 6, + Mouth_Lower_Right = 7, + Mouth_Lower_Left = 8, + Mouth_Upper_Overturn = 9, + Mouth_Lower_Overturn = 10, + Mouth_Pout = 11, + Mouth_Smile_Right = 12, + Mouth_Smile_Left = 13, + Mouth_Sad_Right = 14, + Mouth_Sad_Left = 15, + Cheek_Puff_Right = 16, + Cheek_Puff_Left = 17, + Cheek_Suck = 18, + Mouth_Upper_UpRight = 19, + Mouth_Upper_UpLeft = 20, + Mouth_Lower_DownRight = 21, + Mouth_Lower_DownLeft = 22, + Mouth_Upper_Inside = 23, + Mouth_Lower_Inside = 24, + Mouth_Lower_Overlay = 25, + Tongue_LongStep1 = 26, + Tongue_LongStep2 = 32, + Tongue_Down = 30, + Tongue_Up = 29, + Tongue_Right = 28, + Tongue_Left = 27, + Tongue_Roll = 31, + Tongue_UpLeft_Morph = 34, + Tongue_UpRight_Morph = 33, + Tongue_DownLeft_Morph = 36, + Tongue_DownRight_Morph = 35, + Max = 37, + } + + [StructLayout(LayoutKind.Sequential)] + public struct PredictionData + { + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 60)] + public float[] blend_shape_weight; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct LipData + { + public int frame; + public int time; + public IntPtr image; + public PredictionData prediction_data; + }; + + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipData.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipData.cs.meta new file mode 100644 index 0000000..44cccc2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 44593dc2ec4dd36449dfb356ce482a0d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipShapeTableDrawer.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipShapeTableDrawer.cs new file mode 100644 index 0000000..dd73a04 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipShapeTableDrawer.cs @@ -0,0 +1,73 @@ +//========= Copyright 2019, HTC Corporation. All rights reserved. =========== +#if UNITY_EDITOR +using UnityEngine; +using UnityEditor; +using System; + +namespace VIVE +{ + namespace FacialTracking.Sample + { + + [CustomPropertyDrawer(typeof(LipShapeTable))] + public class LipShapeTableDrawer : PropertyDrawer + { + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + EditorGUI.BeginProperty(position, label, property); + + Rect newFieldPosition = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label); + newFieldPosition.height = EditorGUIUtility.singleLineHeight; + Rect newLabelPosition = position; + newLabelPosition.width -= newFieldPosition.width; + newLabelPosition.height = newFieldPosition.height; + SerializedProperty propSkinedMesh = property.FindPropertyRelative("skinnedMeshRenderer"); + SerializedProperty propLipShapes = property.FindPropertyRelative("lipShapes"); + EditorGUI.PropertyField(newFieldPosition, propSkinedMesh, GUIContent.none); + newFieldPosition.y += EditorGUIUtility.singleLineHeight; + + SkinnedMeshRenderer skinnedMesh = propSkinedMesh.objectReferenceValue as SkinnedMeshRenderer; + if (skinnedMesh != null && skinnedMesh.sharedMesh.blendShapeCount > 0) + { + if (propLipShapes.arraySize != skinnedMesh.sharedMesh.blendShapeCount) + { + propLipShapes.arraySize = skinnedMesh.sharedMesh.blendShapeCount; + for (int i = 0; i < skinnedMesh.sharedMesh.blendShapeCount; ++i) + { + SerializedProperty propLipShape = propLipShapes.GetArrayElementAtIndex(i); + string elementName = skinnedMesh.sharedMesh.GetBlendShapeName(i); + + propLipShape.intValue = (int)XrLipShapeHTC.XR_LIP_SHAPE_NONE_HTC; + foreach (XrLipShapeHTC lipShape in (XrLipShapeHTC[])Enum.GetValues(typeof(XrLipShapeHTC))) + { + if (elementName == lipShape.ToString()) + propLipShape.intValue = (int)lipShape; + } + } + } + for (int i = 0; i < skinnedMesh.sharedMesh.blendShapeCount; ++i) + { + SerializedProperty propLipShape = propLipShapes.GetArrayElementAtIndex(i); + newLabelPosition.y = newFieldPosition.y; + string elementName = skinnedMesh.sharedMesh.GetBlendShapeName(i); + EditorGUI.LabelField(newLabelPosition, " " + elementName); + EditorGUI.PropertyField(newFieldPosition, propLipShape, GUIContent.none); + newFieldPosition.y += EditorGUIUtility.singleLineHeight; + } + } + EditorGUI.EndProperty(); + } + + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + int LineCount = 1; + SerializedProperty propSkinedMesh = property.FindPropertyRelative("skinnedMeshRenderer"); + SkinnedMeshRenderer skinnedMesh = propSkinedMesh.objectReferenceValue as SkinnedMeshRenderer; + if (skinnedMesh != null) LineCount += skinnedMesh.sharedMesh.blendShapeCount; + return EditorGUIUtility.singleLineHeight * LineCount; + } + } + + } +} +#endif \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipShapeTableDrawer.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipShapeTableDrawer.cs.meta new file mode 100644 index 0000000..3993f60 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/LipShapeTableDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 91324d258827df746818399b9a51d4d5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip_Framework.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip_Framework.cs new file mode 100644 index 0000000..1d05b3f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip_Framework.cs @@ -0,0 +1,103 @@ +//========= Copyright 2019, HTC Corporation. All rights reserved. =========== +using System; +using UnityEngine; +using UnityEngine.XR.OpenXR; + +namespace VIVE +{ + namespace FacialTracking.Sample + { + public class Lip_Framework : MonoBehaviour + { + public enum FrameworkStatus { STOP, START, WORKING, ERROR } + /// + /// The status of the Lip engine. + /// + public static FrameworkStatus Status { get; protected set; } + /// + /// Whether to enable Lip module. + /// + public bool EnableLip = true; + + private static Lip_Framework Mgr = null; + public static Lip_Framework Instance + { + get + { + if (Mgr == null) + { + Mgr = FindObjectOfType(); + } + if (Mgr == null) + { + Debug.LogError("Lip_Framework not found"); + } + return Mgr; + } + } + + void Start() + { + StartFramework(); + } + + void OnDestroy() + { + StopFramework(); + } + [Obsolete("Create FacialManager object and call member function StartFramework instead")] + + private void StartFramework() + { + if (!EnableLip) return; + if (Status == FrameworkStatus.WORKING) return; + + Status = FrameworkStatus.START; + + Debug.Log("Starting to Initial Lip Engine"); + XrFacialTrackerCreateInfoHTC m_expressioncreateInfo = new XrFacialTrackerCreateInfoHTC( + XrStructureType.XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC, + IntPtr.Zero, + XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC); + var feature = OpenXRSettings.Instance.GetFeature(); + int res = (int)feature.xrCreateFacialTrackerHTC(m_expressioncreateInfo, out OpenXRSettings.Instance.GetFeature().m_expressionHandle_Lip); + if (res == (int)XrResult.XR_SUCCESS || res == (int)XrResult.XR_SESSION_LOSS_PENDING) + { + Debug.Log("Initial Lip Engine :" + res); + Status = FrameworkStatus.WORKING; + } + else + { + Debug.LogError("Initial Lip Engine :" + res); + Status = FrameworkStatus.ERROR; + } + + } + [Obsolete("Create FacialManager object and call member function StopFramework instead")] + + public void StopFramework() + { + if (Status != FrameworkStatus.STOP) + { + var feature = OpenXRSettings.Instance.GetFeature(); + int res = feature.xrDestroyFacialTrackerHTC(OpenXRSettings.Instance.GetFeature().m_expressionHandle_Lip); + if (res == (int)XrResult.XR_SUCCESS) + { + Debug.Log("Release Lip Engine : " + res); + + } + else + { + Debug.LogError("Release Lip Engine : " + res); + } + } + else + { + Debug.Log("Stop Lip Framework : module not on"); + } + Status = FrameworkStatus.STOP; + } + } + + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip_Framework.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip_Framework.cs.meta new file mode 100644 index 0000000..f7db13c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Lip_Framework.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 41f6d745d46210a49a0df9fe7d0d1102 +timeCreated: 1545375801 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample.meta new file mode 100644 index 0000000..3b39499 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 846f91cae57562348bd10c1617b45b13 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/AvatarLipSample.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/AvatarLipSample.cs new file mode 100644 index 0000000..d5d6860 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/AvatarLipSample.cs @@ -0,0 +1,93 @@ +//========= Copyright 2019, HTC Corporation. All rights reserved. =========== +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace VIVE +{ + namespace FacialTracking.Sample + { + [Serializable] + public class LipShapeTable + { + public SkinnedMeshRenderer skinnedMeshRenderer; + public XrLipShapeHTC[] lipShapes; + } + public class AvatarLipSample : MonoBehaviour + { + [SerializeField] private List LipShapeTables; + + public bool NeededToGetData = true; + private Dictionary LipWeightings; + private FacialManager facialManager = new FacialManager(); + private void Start() + { + facialManager.StartFramework(XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC); + SetLipShapeTables(LipShapeTables); + } + + private void Update() + { + if (NeededToGetData) + { + facialManager.GetWeightings(out LipWeightings); + //Lip.GetLipWeightings(out LipWeightings); + UpdateLipShapes(LipWeightings); + } + } + + public void SetLipShapeTables(List lipShapeTables) + { + bool valid = true; + if (lipShapeTables == null) + { + valid = false; + } + else + { + for (int table = 0; table < lipShapeTables.Count; ++table) + { + if (lipShapeTables[table].skinnedMeshRenderer == null) + { + valid = false; + break; + } + for (int shape = 0; shape < lipShapeTables[table].lipShapes.Length; ++shape) + { + XrLipShapeHTC lipShape = lipShapeTables[table].lipShapes[shape]; + if (lipShape > XrLipShapeHTC.XR_LIP_SHAPE_MAX_ENUM_HTC || lipShape < 0) + { + valid = false; + break; + } + } + } + } + if (valid) + LipShapeTables = lipShapeTables; + } + + public void UpdateLipShapes(Dictionary lipWeightings) + { + foreach (var table in LipShapeTables) + RenderModelLipShape(table, lipWeightings); + } + + private void RenderModelLipShape(LipShapeTable lipShapeTable, Dictionary weighting) + { + for (int i = 0; i < lipShapeTable.lipShapes.Length; i++) + { + int targetIndex = (int)lipShapeTable.lipShapes[i]; + if (targetIndex > (int)XrLipShapeHTC.XR_LIP_SHAPE_MAX_ENUM_HTC || targetIndex < 0) continue; + lipShapeTable.skinnedMeshRenderer.SetBlendShapeWeight(i, weighting[(XrLipShapeHTC)targetIndex] * 100); + } + } + + private void OnDestroy() + { + facialManager.StopFramework(XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC); + } + } + + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/AvatarLipSample.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/AvatarLipSample.cs.meta new file mode 100644 index 0000000..3126271 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/AvatarLipSample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 42350b51669fc604cb2cad73c39f116c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/MirrorCameraSample_Lip.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/MirrorCameraSample_Lip.cs new file mode 100644 index 0000000..0caa677 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/MirrorCameraSample_Lip.cs @@ -0,0 +1,32 @@ +//========= Copyright 2019, HTC Corporation. All rights reserved. =========== +using UnityEngine; + +namespace VIVE +{ + namespace FacialTracking.Sample + { + /// + /// A very basic mirror. + /// + [RequireComponent(typeof(Camera))] + public class MirrorCameraSample_Lip : MonoBehaviour + { + private const float Distance = 0.6f; + + private void Update() + { + if (Lip_Framework.Status != Lip_Framework.FrameworkStatus.WORKING) return; + SetMirroTransform(); + } + + private void SetMirroTransform() + { + transform.position = Camera.main.transform.position + Camera.main.transform.forward * Distance; + transform.position = new Vector3(transform.position.x, Camera.main.transform.position.y, transform.position.z); + transform.LookAt(Camera.main.transform); + transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, 0); + } + } + + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/MirrorCameraSample_Lip.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/MirrorCameraSample_Lip.cs.meta new file mode 100644 index 0000000..5a68537 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/Lip/Sample/MirrorCameraSample_Lip.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8dcb8610a1e4fe94a8cc7983d3b650cb +timeCreated: 1545375969 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/VIVE_Enums.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/VIVE_Enums.cs new file mode 100644 index 0000000..2320a7c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/VIVE_Enums.cs @@ -0,0 +1,55 @@ +//========= Copyright 2019, HTC Corporation. All rights reserved. =========== +namespace VIVE +{ + /// + /// error code of ViveSR + /// + public enum Error : int + { + RUNTIME_NOT_FOUND = -3, + NOT_INITIAL = -2, + FAILED = -1, + WORK = 0, + INVALID_INPUT = 1, + FILE_NOT_FOUND = 2, + DATA_NOT_FOUND = 13, + UNDEFINED = 319, + INITIAL_FAILED = 1001, + NOT_IMPLEMENTED = 1003, + NULL_POINTER = 1004, + OVER_MAX_LENGTH = 1005, + FILE_INVALID = 1006, + UNINSTALL_STEAM = 1007, + MEMCPY_FAIL = 1008, + NOT_MATCH = 1009, + NODE_NOT_EXIST = 1010, + UNKONW_MODULE = 1011, + MODULE_FULL = 1012, + UNKNOW_TYPE = 1013, + INVALID_MODULE = 1014, + INVALID_TYPE = 1015, + MEMORY_NOT_ENOUGH = 1016, + BUSY = 1017, + NOT_SUPPORTED = 1018, + INVALID_VALUE = 1019, + COMING_SOON = 1020, + INVALID_CHANGE = 1021, + TIMEOUT = 1022, + DEVICE_NOT_FOUND = 1023, + INVALID_DEVICE = 1024, + NOT_AUTHORIZED = 1025, + ALREADY = 1026, + INTERNAL = 1027, + CONNECTION_FAILED = 1028, + ALLOCATION_FAILED = 1029, + OPERATION_FAILED = 1030, + NOT_AVAILABLE = 1031, + CALLBACK_IN_PROGRESS= 1032, + SERVICE_NOT_FOUND = 1033, + DISABLED_BY_USER = 1034, + EULA_NOT_ACCEPT = 1035, + RUNTIME_NO_RESPONSE = 1036, + OPENCL_NOT_SUPPORT = 1037, + NOT_SUPPORT_EYE_TRACKING = 1038, + }; +} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/VIVE_Enums.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/VIVE_Enums.cs.meta new file mode 100644 index 0000000..5d20ad9 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Scripts/VIVE_Enums.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c81a0042ed8435d4097d6717e1b45dd8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader.meta new file mode 100644 index 0000000..e0d2dcb --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3937f5e15f29cda41996461db3a9207c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Skin&Wrinkle_Jin.shader b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Skin&Wrinkle_Jin.shader new file mode 100644 index 0000000..3693e53 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Skin&Wrinkle_Jin.shader @@ -0,0 +1,631 @@ +// Made with Amplify Shader Editor +// Available at the Unity Asset Store - http://u3d.as/y3X +Shader "Custom/Skin&Wrinkle_Jin" +{ + Properties + { + _Normal("Normal", 2D) = "bump" {} + _Wrinkle("Wrinkle", 2D) = "bump" {} + _Wrinkle_Sad("Wrinkle_Sad", 2D) = "bump" {} + _Wrinkle_Smile("Wrinkle_Smile", 2D) = "bump" {} + _Wide_M("Wide_M", 2D) = "white" {} + _SQZ_M("SQZ_M", 2D) = "white" {} + _lip_Sad_M("lip_Sad_M", 2D) = "white" {} + _lip_Smile_M("lip_Smile_M", 2D) = "white" {} + _WrinkleScale_Squeeze_Left("WrinkleScale_Squeeze_Left", Range( 0 , 1)) = 1 + _WrinkleScale_Squeeze_Right("WrinkleScale_Squeeze_Right", Range( 0 , 1)) = 0 + _WrinkleScale_Wide_Up_Left("WrinkleScale_Wide_Up_Left", Range( 0 , 1)) = 0 + _WrinkleScale_Wide_Up_Right("WrinkleScale_Wide_Up_Right", Range( 0 , 1)) = 0 + _WrinkleScale_Sad_Left("WrinkleScale_Sad_Left", Range( 0 , 1)) = 0 + _WrinkleScale_Sad_Right("WrinkleScale_Sad_Right", Range( 0 , 1)) = 0 + _WrinkleScale_Smile_Left("WrinkleScale_Smile_Left", Range( 0 , 1)) = 0 + _WrinkleScale_Smile_Right("WrinkleScale_Smile_Right", Range( 0 , 1)) = 0 + _wrinkle_AllScale("wrinkle_AllScale", Range( 1 , 50)) = 0 + _Albedo("Albedo", 2D) = "white" {} + _Metalic("Metalic", 2D) = "white" {} + _MetalicPower("MetalicPower", Range( 0 , 1)) = 0 + _Smoothness("Smoothness", Range( 0 , 1)) = 1 + _SSS_Depth("SSS_Depth", Range( 0 , 10)) = 1 + _SSS_Power("SSS_Power", Range( 0 , 1)) = 1 + _Mask("Mask", 2D) = "white" {} + _AO_power("AO_power", Range( 0 , 1)) = 1 + _DetailSkin_Normal("DetailSkin_Normal", 2D) = "white" {} + _DetailSkin_Metalic("DetailSkin_Metalic", 2D) = "white" {} + _DetailSkin_Tiling("DetailSkin_Tiling", Vector) = (1,1,0,0) + _DetailSkin_alpha("DetailSkin_alpha", Range( 0 , 1)) = 1 + _DetailSkin_Rotate("DetailSkin_Rotate", Range( 0 , 360)) = 0 + _DetailSkin_MetalicAlpha("DetailSkin_MetalicAlpha", Range( 0 , 1)) = 0 + _Translucency_Power("Translucency_Power", Range( 0 , 1)) = 0.6 + [Header(Translucency)] + _Translucency("Strength", Range( 0 , 50)) = 1 + _TransNormalDistortion("Normal Distortion", Range( 0 , 1)) = 0.1 + _TransScattering("Scaterring Falloff", Range( 1 , 50)) = 2 + _TransDirect("Direct", Range( 0 , 1)) = 1 + _TransAmbient("Ambient", Range( 0 , 1)) = 0.2 + _TransShadow("Shadow", Range( 0 , 1)) = 0.9 + [HideInInspector] _texcoord( "", 2D ) = "white" {} + [HideInInspector] __dirty( "", Int ) = 1 + } + + SubShader + { + Tags{ "RenderType" = "Opaque" "Queue" = "Geometry+0" } + Cull Back + CGINCLUDE + #include "UnityCG.cginc" + #include "UnityPBSLighting.cginc" + #include "Lighting.cginc" + #pragma target 3.0 + #if defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (defined(SHADER_TARGET_SURFACE_ANALYSIS) && !defined(SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))//ASE Sampler Macros + #define SAMPLE_TEXTURE2D(tex,samplerTex,coord) tex.Sample(samplerTex,coord) + #else//ASE Sampling Macros + #define SAMPLE_TEXTURE2D(tex,samplerTex,coord) tex2D(tex,coord) + #endif//ASE Sampling Macros + + #ifdef UNITY_PASS_SHADOWCASTER + #undef INTERNAL_DATA + #undef WorldReflectionVector + #undef WorldNormalVector + #define INTERNAL_DATA half3 internalSurfaceTtoW0; half3 internalSurfaceTtoW1; half3 internalSurfaceTtoW2; + #define WorldReflectionVector(data,normal) reflect (data.worldRefl, half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal))) + #define WorldNormalVector(data,normal) half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal)) + #endif + struct Input + { + float2 uv_texcoord; + float3 worldNormal; + INTERNAL_DATA + float3 worldPos; + }; + + struct SurfaceOutputStandardCustom + { + half3 Albedo; + half3 Normal; + half3 Emission; + half Metallic; + half Smoothness; + half Occlusion; + half Alpha; + half3 Translucency; + }; + + UNITY_DECLARE_TEX2D_NOSAMPLER(_Normal); + SamplerState sampler_Normal; + uniform float _WrinkleScale_Squeeze_Left; + UNITY_DECLARE_TEX2D_NOSAMPLER(_SQZ_M); + uniform float4 _SQZ_M_ST; + SamplerState sampler_SQZ_M; + uniform float _WrinkleScale_Squeeze_Right; + uniform float _WrinkleScale_Wide_Up_Left; + UNITY_DECLARE_TEX2D_NOSAMPLER(_Wide_M); + uniform float4 _Wide_M_ST; + SamplerState sampler_Wide_M; + uniform float _WrinkleScale_Wide_Up_Right; + uniform float _wrinkle_AllScale; + UNITY_DECLARE_TEX2D_NOSAMPLER(_Wrinkle); + SamplerState sampler_Wrinkle; + uniform float _WrinkleScale_Sad_Left; + UNITY_DECLARE_TEX2D_NOSAMPLER(_lip_Sad_M); + uniform float4 _lip_Sad_M_ST; + SamplerState sampler_lip_Sad_M; + uniform float _WrinkleScale_Sad_Right; + UNITY_DECLARE_TEX2D_NOSAMPLER(_Wrinkle_Sad); + SamplerState sampler_Wrinkle_Sad; + uniform float _WrinkleScale_Smile_Left; + UNITY_DECLARE_TEX2D_NOSAMPLER(_lip_Smile_M); + uniform float4 _lip_Smile_M_ST; + SamplerState sampler_lip_Smile_M; + uniform float _WrinkleScale_Smile_Right; + UNITY_DECLARE_TEX2D_NOSAMPLER(_Wrinkle_Smile); + SamplerState sampler_Wrinkle_Smile; + UNITY_DECLARE_TEX2D_NOSAMPLER(_DetailSkin_Normal); + uniform float2 _DetailSkin_Tiling; + uniform float _DetailSkin_Rotate; + SamplerState sampler_DetailSkin_Normal; + uniform float _DetailSkin_alpha; + UNITY_DECLARE_TEX2D_NOSAMPLER(_Mask); + SamplerState sampler_Mask; + UNITY_DECLARE_TEX2D_NOSAMPLER(_Albedo); + SamplerState sampler_Albedo; + uniform float _Translucency_Power; + uniform float _SSS_Depth; + uniform float _SSS_Power; + uniform float _MetalicPower; + UNITY_DECLARE_TEX2D_NOSAMPLER(_Metalic); + SamplerState sampler_Metalic; + uniform float _DetailSkin_MetalicAlpha; + UNITY_DECLARE_TEX2D_NOSAMPLER(_DetailSkin_Metalic); + SamplerState sampler_DetailSkin_Metalic; + uniform float _Smoothness; + uniform float _AO_power; + uniform half _Translucency; + uniform half _TransNormalDistortion; + uniform half _TransScattering; + uniform half _TransDirect; + uniform half _TransAmbient; + uniform half _TransShadow; + + + struct Gradient + { + int type; + int colorsLength; + int alphasLength; + float4 colors[8]; + float2 alphas[8]; + }; + + + Gradient NewGradient(int type, int colorsLength, int alphasLength, + float4 colors0, float4 colors1, float4 colors2, float4 colors3, float4 colors4, float4 colors5, float4 colors6, float4 colors7, + float2 alphas0, float2 alphas1, float2 alphas2, float2 alphas3, float2 alphas4, float2 alphas5, float2 alphas6, float2 alphas7) + { + Gradient g; + g.type = type; + g.colorsLength = colorsLength; + g.alphasLength = alphasLength; + g.colors[ 0 ] = colors0; + g.colors[ 1 ] = colors1; + g.colors[ 2 ] = colors2; + g.colors[ 3 ] = colors3; + g.colors[ 4 ] = colors4; + g.colors[ 5 ] = colors5; + g.colors[ 6 ] = colors6; + g.colors[ 7 ] = colors7; + g.alphas[ 0 ] = alphas0; + g.alphas[ 1 ] = alphas1; + g.alphas[ 2 ] = alphas2; + g.alphas[ 3 ] = alphas3; + g.alphas[ 4 ] = alphas4; + g.alphas[ 5 ] = alphas5; + g.alphas[ 6 ] = alphas6; + g.alphas[ 7 ] = alphas7; + return g; + } + + + float4 SampleGradient( Gradient gradient, float time ) + { + float3 color = gradient.colors[0].rgb; + UNITY_UNROLL + for (int c = 1; c < 8; c++) + { + float colorPos = saturate((time - gradient.colors[c-1].w) / (gradient.colors[c].w - gradient.colors[c-1].w)) * step(c, (float)gradient.colorsLength-1); + color = lerp(color, gradient.colors[c].rgb, lerp(colorPos, step(0.01, colorPos), gradient.type)); + } + #ifndef UNITY_COLORSPACE_GAMMA + color = half3(GammaToLinearSpaceExact(color.r), GammaToLinearSpaceExact(color.g), GammaToLinearSpaceExact(color.b)); + #endif + float alpha = gradient.alphas[0].x; + UNITY_UNROLL + for (int a = 1; a < 8; a++) + { + float alphaPos = saturate((time - gradient.alphas[a-1].y) / (gradient.alphas[a].y - gradient.alphas[a-1].y)) * step(a, (float)gradient.alphasLength-1); + alpha = lerp(alpha, gradient.alphas[a].x, lerp(alphaPos, step(0.01, alphaPos), gradient.type)); + } + return float4(color, alpha); + } + + + inline half4 LightingStandardCustom(SurfaceOutputStandardCustom s, half3 viewDir, UnityGI gi ) + { + #if !DIRECTIONAL + float3 lightAtten = gi.light.color; + #else + float3 lightAtten = lerp( _LightColor0.rgb, gi.light.color, _TransShadow ); + #endif + half3 lightDir = gi.light.dir + s.Normal * _TransNormalDistortion; + half transVdotL = pow( saturate( dot( viewDir, -lightDir ) ), _TransScattering ); + half3 translucency = lightAtten * (transVdotL * _TransDirect + gi.indirect.diffuse * _TransAmbient) * s.Translucency; + half4 c = half4( s.Albedo * translucency * _Translucency, 0 ); + + SurfaceOutputStandard r; + r.Albedo = s.Albedo; + r.Normal = s.Normal; + r.Emission = s.Emission; + r.Metallic = s.Metallic; + r.Smoothness = s.Smoothness; + r.Occlusion = s.Occlusion; + r.Alpha = s.Alpha; + return LightingStandard (r, viewDir, gi) + c; + } + + inline void LightingStandardCustom_GI(SurfaceOutputStandardCustom s, UnityGIInput data, inout UnityGI gi ) + { + #if defined(UNITY_PASS_DEFERRED) && UNITY_ENABLE_REFLECTION_BUFFERS + gi = UnityGlobalIllumination(data, s.Occlusion, s.Normal); + #else + UNITY_GLOSSY_ENV_FROM_SURFACE( g, s, data ); + gi = UnityGlobalIllumination( data, s.Occlusion, s.Normal, g ); + #endif + } + + void surf( Input i , inout SurfaceOutputStandardCustom o ) + { + float2 uv_SQZ_M = i.uv_texcoord * _SQZ_M_ST.xy + _SQZ_M_ST.zw; + float4 tex2DNode120 = SAMPLE_TEXTURE2D( _SQZ_M, sampler_SQZ_M, uv_SQZ_M ); + Gradient gradient100 = NewGradient( 0, 3, 2, float4( 0, 0, 0, 0.4950027 ), float4( 1, 1, 1, 0.5000076 ), float4( 1, 1, 1, 1 ), 0, 0, 0, 0, 0, float2( 1, 0 ), float2( 1, 1 ), 0, 0, 0, 0, 0, 0 ); + float4 L_m104 = SampleGradient( gradient100, i.uv_texcoord.x ); + Gradient gradient99 = NewGradient( 0, 3, 2, float4( 1, 1, 1, 0.5000076 ), float4( 0, 0, 0, 0.5049973 ), float4( 0, 0, 0, 1 ), 0, 0, 0, 0, 0, float2( 1, 0 ), float2( 1, 1 ), 0, 0, 0, 0, 0, 0 ); + float4 R_m103 = SampleGradient( gradient99, i.uv_texcoord.x ); + float2 uv_Wide_M = i.uv_texcoord * _Wide_M_ST.xy + _Wide_M_ST.zw; + float4 tex2DNode123 = SAMPLE_TEXTURE2D( _Wide_M, sampler_Wide_M, uv_Wide_M ); + float4 all_Eye_m136 = ( ( ( _WrinkleScale_Squeeze_Left * tex2DNode120 * L_m104 ) + ( _WrinkleScale_Squeeze_Right * R_m103 * tex2DNode120 ) + ( _WrinkleScale_Wide_Up_Left * tex2DNode123 * L_m104 ) + ( _WrinkleScale_Wide_Up_Right * tex2DNode123 * R_m103 ) ) * _wrinkle_AllScale ); + float2 uv_lip_Sad_M = i.uv_texcoord * _lip_Sad_M_ST.xy + _lip_Sad_M_ST.zw; + float4 tex2DNode114 = SAMPLE_TEXTURE2D( _lip_Sad_M, sampler_lip_Sad_M, uv_lip_Sad_M ); + float4 all_Sad_m137 = ( ( ( _WrinkleScale_Sad_Left * tex2DNode114 * L_m104 ) + ( _WrinkleScale_Sad_Right * tex2DNode114 * R_m103 ) ) * _wrinkle_AllScale ); + float2 uv_lip_Smile_M = i.uv_texcoord * _lip_Smile_M_ST.xy + _lip_Smile_M_ST.zw; + float4 tex2DNode112 = SAMPLE_TEXTURE2D( _lip_Smile_M, sampler_lip_Smile_M, uv_lip_Smile_M ); + float4 all_Smile_m138 = ( ( ( _WrinkleScale_Smile_Left * tex2DNode112 * L_m104 ) + ( _WrinkleScale_Smile_Right * tex2DNode112 * R_m103 ) ) * _wrinkle_AllScale ); + float4 Normal_out150 = ( float4( UnpackNormal( SAMPLE_TEXTURE2D( _Normal, sampler_Normal, i.uv_texcoord ) ) , 0.0 ) + ( all_Eye_m136 * float4( UnpackNormal( SAMPLE_TEXTURE2D( _Wrinkle, sampler_Wrinkle, i.uv_texcoord ) ) , 0.0 ) ) + ( all_Sad_m137 * float4( UnpackNormal( SAMPLE_TEXTURE2D( _Wrinkle_Sad, sampler_Wrinkle_Sad, i.uv_texcoord ) ) , 0.0 ) ) + ( all_Smile_m138 * float4( UnpackNormal( SAMPLE_TEXTURE2D( _Wrinkle_Smile, sampler_Wrinkle_Smile, i.uv_texcoord ) ) , 0.0 ) ) ); + float2 uv_TexCoord18 = i.uv_texcoord * _DetailSkin_Tiling; + float cos19 = cos( radians( _DetailSkin_Rotate ) ); + float sin19 = sin( radians( _DetailSkin_Rotate ) ); + float2 rotator19 = mul( uv_TexCoord18 - float2( 0.5,0.5 ) , float2x2( cos19 , -sin19 , sin19 , cos19 )) + float2( 0.5,0.5 ); + float4 tex2DNode26 = SAMPLE_TEXTURE2D( _Mask, sampler_Mask, i.uv_texcoord ); + float4 lerpResult158 = lerp( Normal_out150 , SAMPLE_TEXTURE2D( _DetailSkin_Normal, sampler_DetailSkin_Normal, rotator19 ) , ( _DetailSkin_alpha * tex2DNode26.g )); + float4 Normal86 = ( ( lerpResult158 * _DetailSkin_alpha ) + Normal_out150 ); + o.Normal = Normal86.rgb; + float temp_output_37_0 = ( tex2DNode26.r * _Translucency_Power ); + float4 color71 = IsGammaSpace() ? float4(1,1,1,0) : float4(1,1,1,0); + Gradient gradient72 = NewGradient( 0, 2, 2, float4( 0.972549, 0.7921569, 0.7921569, 0 ), float4( 1, 0.9572161, 0.9481132, 1 ), 0, 0, 0, 0, 0, 0, float2( 1, 0 ), float2( 1, 1 ), 0, 0, 0, 0, 0, 0 ); + float3 ase_worldNormal = WorldNormalVector( i, float3( 0, 0, 1 ) ); + float3 ase_worldPos = i.worldPos; + #if defined(LIGHTMAP_ON) && UNITY_VERSION < 560 //aseld + float3 ase_worldlightDir = 0; + #else //aseld + float3 ase_worldlightDir = Unity_SafeNormalize( UnityWorldSpaceLightDir( ase_worldPos ) ); + #endif //aseld + float dotResult7 = dot( ase_worldNormal , ( ase_worldlightDir * _SSS_Depth ) ); + float layeredBlendVar70 = temp_output_37_0; + float4 layeredBlend70 = ( lerp( color71,( SampleGradient( gradient72, dotResult7 ) * _SSS_Power ) , layeredBlendVar70 ) ); + float4 Albedo81 = ( SAMPLE_TEXTURE2D( _Albedo, sampler_Albedo, i.uv_texcoord ) * layeredBlend70 ); + o.Albedo = Albedo81.rgb; + float4 tex2DNode46 = SAMPLE_TEXTURE2D( _Metalic, sampler_Metalic, i.uv_texcoord ); + float4 Metallic84 = ( _MetalicPower * tex2DNode46 ); + o.Metallic = Metallic84.r; + float Smoothness83 = ( ( _DetailSkin_MetalicAlpha * ( SAMPLE_TEXTURE2D( _DetailSkin_Metalic, sampler_DetailSkin_Metalic, i.uv_texcoord ).a * tex2DNode26.g ) ) + ( tex2DNode46.a * _Smoothness ) ); + o.Smoothness = Smoothness83; + float AO85 = ( tex2DNode26.b * _AO_power ); + o.Occlusion = AO85; + float Translucency79 = temp_output_37_0; + float3 temp_cast_9 = (Translucency79).xxx; + o.Translucency = temp_cast_9; + o.Alpha = 1; + } + + ENDCG + CGPROGRAM + #pragma surface surf StandardCustom keepalpha fullforwardshadows exclude_path:deferred + + ENDCG + Pass + { + Name "ShadowCaster" + Tags{ "LightMode" = "ShadowCaster" } + ZWrite On + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile_shadowcaster + #pragma multi_compile UNITY_PASS_SHADOWCASTER + #pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2 + #include "HLSLSupport.cginc" + #if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN ) + #define CAN_SKIP_VPOS + #endif + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + struct v2f + { + V2F_SHADOW_CASTER; + float2 customPack1 : TEXCOORD1; + float4 tSpace0 : TEXCOORD2; + float4 tSpace1 : TEXCOORD3; + float4 tSpace2 : TEXCOORD4; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + v2f vert( appdata_full v ) + { + v2f o; + UNITY_SETUP_INSTANCE_ID( v ); + UNITY_INITIALIZE_OUTPUT( v2f, o ); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o ); + UNITY_TRANSFER_INSTANCE_ID( v, o ); + Input customInputData; + float3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz; + half3 worldNormal = UnityObjectToWorldNormal( v.normal ); + half3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz ); + half tangentSign = v.tangent.w * unity_WorldTransformParams.w; + half3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign; + o.tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x ); + o.tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y ); + o.tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z ); + o.customPack1.xy = customInputData.uv_texcoord; + o.customPack1.xy = v.texcoord; + TRANSFER_SHADOW_CASTER_NORMALOFFSET( o ) + return o; + } + half4 frag( v2f IN + #if !defined( CAN_SKIP_VPOS ) + , UNITY_VPOS_TYPE vpos : VPOS + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( IN ); + Input surfIN; + UNITY_INITIALIZE_OUTPUT( Input, surfIN ); + surfIN.uv_texcoord = IN.customPack1.xy; + float3 worldPos = float3( IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w ); + half3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) ); + surfIN.worldPos = worldPos; + surfIN.worldNormal = float3( IN.tSpace0.z, IN.tSpace1.z, IN.tSpace2.z ); + surfIN.internalSurfaceTtoW0 = IN.tSpace0.xyz; + surfIN.internalSurfaceTtoW1 = IN.tSpace1.xyz; + surfIN.internalSurfaceTtoW2 = IN.tSpace2.xyz; + SurfaceOutputStandardCustom o; + UNITY_INITIALIZE_OUTPUT( SurfaceOutputStandardCustom, o ) + surf( surfIN, o ); + #if defined( CAN_SKIP_VPOS ) + float2 vpos = IN.pos; + #endif + SHADOW_CASTER_FRAGMENT( IN ) + } + ENDCG + } + } + Fallback "Diffuse" + CustomEditor "ASEMaterialInspector" +} +/*ASEBEGIN +Version=18400 +-1440;188;1440;836;5394.574;-782.314;1;True;False +Node;AmplifyShaderEditor.CommentaryNode;94;-5762.245,872.9059;Inherit;False;613.3813;369.743;R_UV;2;102;99;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;95;-5766.595,503.0958;Inherit;False;617.7324;334.9375;L_UV;2;101;100;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;98;-6000.696,807.8517;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.GradientNode;99;-5741.39,964.5538;Inherit;False;0;3;2;1,1,1,0.5000076;0,0,0,0.5049973;0,0,0,1;1,0;1,1;0;1;OBJECT;0 +Node;AmplifyShaderEditor.GradientNode;100;-5739.448,634.3599;Inherit;False;0;3;2;0,0,0,0.4950027;1,1,1,0.5000076;1,1,1,1;1,0;1,1;0;1;OBJECT;0 +Node;AmplifyShaderEditor.GradientSampleNode;101;-5442.127,630.3428;Inherit;True;2;0;OBJECT;;False;1;FLOAT;0;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.GradientSampleNode;102;-5450.901,982.2878;Inherit;True;2;0;OBJECT;;False;1;FLOAT;0;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.CommentaryNode;97;-4702.964,478.5438;Inherit;False;578.3761;292.5326;SQZ_L;3;126;119;116;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;96;-4704.698,798.3118;Inherit;False;592.7122;250.4255;SQZ_R;3;125;118;117;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;103;-5007.304,900.5298;Inherit;False;R_m;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;104;-5048.692,530.6858;Inherit;False;L_m;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.GetLocalVarNode;111;-5653.006,1464.302;Inherit;False;104;L_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;107;-4584.189,1421.759;Inherit;False;Property;_WrinkleScale_Smile_Left;WrinkleScale_Smile_Left;14;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;112;-4920.581,1553.702;Inherit;True;Property;_lip_Smile_M;lip_Smile_M;7;0;Create;True;0;0;False;0;False;-1;9f79442cfa74a03479bcc9683e287520;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.GetLocalVarNode;106;-4506.252,1506.941;Inherit;False;104;L_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;119;-4595.809,536.3148;Inherit;False;Property;_WrinkleScale_Squeeze_Left;WrinkleScale_Squeeze_Left;8;0;Create;True;0;0;False;0;False;1;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.GetLocalVarNode;108;-4459.899,1733.231;Inherit;False;103;R_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.GetLocalVarNode;109;-5654.68,1641.468;Inherit;False;103;R_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.GetLocalVarNode;116;-4558.337,659.2399;Inherit;False;104;L_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;122;-4604.923,1225.47;Inherit;False;Property;_WrinkleScale_Wide_Up_Right;WrinkleScale_Wide_Up_Right;11;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;124;-4606.867,1066.8;Inherit;False;Property;_WrinkleScale_Wide_Up_Left;WrinkleScale_Wide_Up_Left;10;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;123;-4939.582,1173.537;Inherit;True;Property;_Wide_M;Wide_M;4;0;Create;True;0;0;False;0;False;-1;76493984454b03f47a3137acfc5ee3a6;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;117;-4631.354,872.5428;Inherit;False;Property;_WrinkleScale_Squeeze_Right;WrinkleScale_Squeeze_Right;9;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;105;-4559.904,1644.286;Inherit;False;Property;_WrinkleScale_Smile_Right;WrinkleScale_Smile_Right;15;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;120;-5067.851,654.3718;Inherit;True;Property;_SQZ_M;SQZ_M;5;0;Create;True;0;0;False;0;False;-1;0bde64e6f5a7c7645b626bacac977600;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.GetLocalVarNode;118;-4581.327,963.2089;Inherit;False;103;R_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.GetLocalVarNode;115;-4510.704,1303.902;Inherit;False;103;R_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;113;-5762.145,1554.898;Inherit;False;Property;_WrinkleScale_Sad_Right;WrinkleScale_Sad_Right;13;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;110;-5760.923,1394.412;Inherit;False;Property;_WrinkleScale_Sad_Left;WrinkleScale_Sad_Left;12;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;114;-6072.71,1473.314;Inherit;True;Property;_lip_Sad_M;lip_Sad_M;6;0;Create;True;0;0;False;0;False;-1;b651b3205353cbe4eafef19f8cd4eee6;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.GetLocalVarNode;121;-4514.828,1145.745;Inherit;False;104;L_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;126;-4273.433,607.8378;Inherit;False;3;3;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;125;-4273.177,869.8079;Inherit;False;3;3;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;129;-4229.981,1088.737;Inherit;False;3;3;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;131;-4212.857,1507.256;Inherit;False;3;3;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;132;-4205.058,1647.657;Inherit;False;3;3;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;128;-5367.087,1590.42;Inherit;False;3;3;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;127;-5373.886,1434.849;Inherit;False;3;3;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;130;-4223.379,1212.372;Inherit;False;3;3;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;135;-4035.015,1520.885;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;133;-3924.421,634.5908;Inherit;False;4;4;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;155;-5052.234,1888.661;Inherit;False;Property;_wrinkle_AllScale;wrinkle_AllScale;16;0;Create;True;0;0;False;0;False;0;1;1;50;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;134;-5219.82,1446.772;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;152;-3855.492,1516.114;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;154;-5036.926,1444.667;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;153;-3776.39,643.4372;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;136;-3606.879,630.5257;Inherit;False;all_Eye_m;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;138;-3679.374,1511.708;Inherit;False;all_Smile_m;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;157;-3744.246,1786.114;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RegisterLocalVarNode;137;-4825.111,1443.62;Inherit;False;all_Sad_m;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.CommentaryNode;92;-2075.377,645.8531;Inherit;False;2289.385;655.7867;Normal;13;19;17;16;18;14;15;21;22;23;86;151;156;158;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.CommentaryNode;91;-2058.169,-683.2374;Inherit;False;2837.814;1019.518;Albedo;15;72;55;71;11;8;70;81;9;73;10;56;4;7;6;12;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.GetLocalVarNode;139;-3369.641,1091.123;Inherit;False;137;all_Sad_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.SamplerNode;144;-3475.249,870.3969;Inherit;True;Property;_Wrinkle;Wrinkle;1;0;Create;True;0;0;False;0;False;-1;bf18efd814a59c645a89649c222ce5ec;None;True;0;True;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.GetLocalVarNode;143;-3377.436,794.8948;Inherit;False;136;all_Eye_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.SamplerNode;142;-3457.164,1444.427;Inherit;True;Property;_Wrinkle_Smile;Wrinkle_Smile;3;0;Create;True;0;0;False;0;False;-1;b3054ff6e9f73b243b3cda952fa02424;None;True;0;True;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SamplerNode;140;-3468.679,1165.854;Inherit;True;Property;_Wrinkle_Sad;Wrinkle_Sad;2;0;Create;True;0;0;False;0;False;-1;e86ced7d9ef006641b3cf8855baf388b;None;True;0;True;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.GetLocalVarNode;141;-3376.13,1367.524;Inherit;False;138;all_Smile_m;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.SamplerNode;149;-3061.233,1476.57;Inherit;True;Property;_Normal;Normal;0;0;Create;True;0;0;False;0;False;-1;5f6a88171526ba44b8edd0316d32be0e;None;True;0;True;bump;Auto;True;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.Vector2Node;15;-2001.746,780.6942;Inherit;False;Property;_DetailSkin_Tiling;DetailSkin_Tiling;27;0;Create;True;0;0;False;0;False;1,1;30,30;0;3;FLOAT2;0;FLOAT;1;FLOAT;2 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;147;-3115.382,1368.964;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;146;-3121.658,1087.34;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;14;-1980.15,1123.764;Inherit;False;Property;_DetailSkin_Rotate;DetailSkin_Rotate;29;0;Create;True;0;0;False;0;False;0;0;0;360;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;145;-3128.717,826.8129;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;12;-2024.223,-205.4592;Inherit;False;Property;_SSS_Depth;SSS_Depth;21;0;Create;True;0;0;False;0;False;1;1;0;10;0;1;FLOAT;0 +Node;AmplifyShaderEditor.WorldSpaceLightDirHlpNode;6;-1996.104,-375.6187;Inherit;False;True;1;0;FLOAT;0;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.TextureCoordinatesNode;78;-1914.427,375.004;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;11;-1718.054,-374.1815;Inherit;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0 +Node;AmplifyShaderEditor.CommentaryNode;93;-1652.657,1332.536;Inherit;False;1866.496;767.1895;Metallic & Smoothness;14;83;49;84;50;48;47;52;51;46;44;45;43;75;74;;1,1,1,1;0;0 +Node;AmplifyShaderEditor.WorldNormalVector;8;-1778.006,-537.9479;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3 +Node;AmplifyShaderEditor.TextureCoordinatesNode;18;-1764.468,791.4263;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleAddOpNode;148;-2713.122,1102.728;Inherit;False;4;4;0;FLOAT3;0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.Vector2Node;17;-1719.703,955.5605;Inherit;False;Constant;_Vector0;Vector 0;11;0;Create;True;0;0;False;0;False;0.5,0.5;0,0;0;3;FLOAT2;0;FLOAT;1;FLOAT;2 +Node;AmplifyShaderEditor.RadiansOpNode;16;-1687.149,1134.616;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.DotProductOpNode;7;-1533.092,-482.9666;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.GradientNode;72;-1611.289,-622.6675;Inherit;False;0;2;2;0.972549,0.7921569,0.7921569,0;1,0.9572161,0.9481132,1;1,0;1,1;0;1;OBJECT;0 +Node;AmplifyShaderEditor.SamplerNode;26;-1651.963,347.5779;Inherit;True;Property;_Mask;Mask;23;0;Create;True;0;0;False;0;False;-1;7bf471a629e3ed640b3ace8997379f80;4de633b93a5c4fd4ba6a9263663ff7e1;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RotatorNode;19;-1493.154,893.4912;Inherit;False;3;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT;1;False;1;FLOAT2;0 +Node;AmplifyShaderEditor.TextureCoordinatesNode;74;-1586.892,1475.731;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RegisterLocalVarNode;150;-2433.694,1105.526;Inherit;False;Normal_out;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;21;-1270.01,1054.852;Inherit;False;Property;_DetailSkin_alpha;DetailSkin_alpha;28;0;Create;True;0;0;False;0;False;1;1;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.GetLocalVarNode;151;-946.4784,1169.967;Inherit;False;150;Normal_out;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;38;-1161.322,446.4533;Inherit;False;Property;_Translucency_Power;Translucency_Power;31;0;Create;True;0;0;False;0;False;0.6;0.6;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.GradientSampleNode;4;-1301.101,-594.6799;Inherit;True;2;0;OBJECT;;False;1;FLOAT;0;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.RangedFloatNode;56;-1359.7,-345.746;Inherit;False;Property;_SSS_Power;SSS_Power;22;0;Create;True;0;0;False;0;False;1;1;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;23;-951.6035,963.5776;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;22;-1157.514,746.5341;Inherit;True;Property;_DetailSkin_Normal;DetailSkin_Normal;25;0;Create;True;0;0;False;0;False;-1;7a4aa691425a0e84996a3a3f3d3ef326;7a4aa691425a0e84996a3a3f3d3ef326;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.TextureCoordinatesNode;75;-1568.842,1823.917;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SamplerNode;43;-1290.712,1413.351;Inherit;True;Property;_DetailSkin_Metalic;DetailSkin_Metalic;26;0;Create;True;0;0;False;0;False;-1;508aaba794b76264994ff90752435697;508aaba794b76264994ff90752435697;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;37;-792.6582,377.6286;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;46;-1310.521,1795.697;Inherit;True;Property;_Metalic;Metalic;18;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.ColorNode;71;-791.9308,-197.0864;Inherit;False;Constant;_Color0;Color 0;20;0;Create;True;0;0;False;0;False;1,1,1,0;0,0,0,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.TextureCoordinatesNode;73;-289.7696,157.0661;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;44;-847.4484,1410.771;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;55;-900.9518,-430.5521;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;51;-875.8831,1987.181;Inherit;False;Property;_Smoothness;Smoothness;20;0;Create;True;0;0;False;0;False;1;1;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.LerpOp;158;-685.9257,780.9528;Inherit;True;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;45;-778.6556,1602.979;Inherit;False;Property;_DetailSkin_MetalicAlpha;DetailSkin_MetalicAlpha;30;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.LayeredBlendNode;70;-291.9867,-208.8582;Inherit;True;6;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;52;-622.3829,1910.48;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;47;-471.1548,1523.58;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RangedFloatNode;54;-1145.253,556.6238;Inherit;False;Property;_AO_power;AO_power;24;0;Create;True;0;0;False;0;False;1;1;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;159;-431.7331,901.3828;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RangedFloatNode;48;-574.8556,1437.58;Inherit;False;Property;_MetalicPower;MetalicPower;19;0;Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0 +Node;AmplifyShaderEditor.SamplerNode;9;-59.90963,144.5609;Inherit;True;Property;_Albedo;Albedo;17;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;53;-794.247,534.9562;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;156;-236.0334,1015.347;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleAddOpNode;49;-234.1212,1746.979;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;10;354.7015,184.0346;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.SimpleMultiplyOpNode;50;-226.1833,1455.078;Inherit;False;2;2;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;83;-56.14864,1758.119;Inherit;False;Smoothness;-1;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;86;-18.79991,1016.326;Inherit;False;Normal;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;85;-536.3601,562.4451;Inherit;False;AO;-1;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;79;-537.497,429.1004;Inherit;False;Translucency;-1;True;1;0;FLOAT;0;False;1;FLOAT;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;81;546.948,185.7379;Inherit;False;Albedo;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.RegisterLocalVarNode;84;-37.60497,1472.218;Inherit;False;Metallic;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0 +Node;AmplifyShaderEditor.GetLocalVarNode;87;317.3397,872.149;Inherit;False;86;Normal;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.GetLocalVarNode;90;293.7708,1009.577;Inherit;False;83;Smoothness;1;0;OBJECT;;False;1;FLOAT;0 +Node;AmplifyShaderEditor.GetLocalVarNode;89;318.7708,1077.577;Inherit;False;85;AO;1;0;OBJECT;;False;1;FLOAT;0 +Node;AmplifyShaderEditor.GetLocalVarNode;88;317.7708,940.5767;Inherit;False;84;Metallic;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.GetLocalVarNode;80;288.7276,1146.958;Inherit;False;79;Translucency;1;0;OBJECT;;False;1;FLOAT;0 +Node;AmplifyShaderEditor.GetLocalVarNode;82;314.498,801.9138;Inherit;False;81;Albedo;1;0;OBJECT;;False;1;COLOR;0 +Node;AmplifyShaderEditor.StandardSurfaceOutputNode;0;642.5273,826.9124;Float;False;True;-1;2;ASEMaterialInspector;0;0;Standard;JinShader_Skin4;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;False;Back;0;False;-1;0;False;-1;False;0;False;-1;0;False;-1;False;0;Opaque;0.5;True;True;0;False;Opaque;;Geometry;ForwardOnly;14;all;True;True;True;True;0;False;-1;False;0;False;-1;255;False;-1;255;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;-1;False;2;15;10;25;False;0.5;True;0;0;False;-1;0;False;-1;0;0;False;-1;0;False;-1;0;False;-1;0;False;-1;0;False;0;0,0,0,0;VertexOffset;True;False;Cylindrical;False;Relative;0;;-1;32;-1;-1;0;False;0;0;False;-1;-1;0;False;-1;0;0;0;False;0.1;False;-1;0;False;-1;True;16;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT3;0,0,0;False;7;FLOAT3;0,0,0;False;8;FLOAT;0;False;9;FLOAT;0;False;10;FLOAT;0;False;13;FLOAT3;0,0,0;False;11;FLOAT3;0,0,0;False;12;FLOAT3;0,0,0;False;14;FLOAT4;0,0,0,0;False;15;FLOAT3;0,0,0;False;0 +WireConnection;101;0;100;0 +WireConnection;101;1;98;0 +WireConnection;102;0;99;0 +WireConnection;102;1;98;0 +WireConnection;103;0;102;0 +WireConnection;104;0;101;0 +WireConnection;126;0;119;0 +WireConnection;126;1;120;0 +WireConnection;126;2;116;0 +WireConnection;125;0;117;0 +WireConnection;125;1;118;0 +WireConnection;125;2;120;0 +WireConnection;129;0;124;0 +WireConnection;129;1;123;0 +WireConnection;129;2;121;0 +WireConnection;131;0;107;0 +WireConnection;131;1;112;0 +WireConnection;131;2;106;0 +WireConnection;132;0;105;0 +WireConnection;132;1;112;0 +WireConnection;132;2;108;0 +WireConnection;128;0;113;0 +WireConnection;128;1;114;0 +WireConnection;128;2;109;0 +WireConnection;127;0;110;0 +WireConnection;127;1;114;0 +WireConnection;127;2;111;0 +WireConnection;130;0;122;0 +WireConnection;130;1;123;0 +WireConnection;130;2;115;0 +WireConnection;135;0;131;0 +WireConnection;135;1;132;0 +WireConnection;133;0;126;0 +WireConnection;133;1;125;0 +WireConnection;133;2;129;0 +WireConnection;133;3;130;0 +WireConnection;134;0;127;0 +WireConnection;134;1;128;0 +WireConnection;152;0;135;0 +WireConnection;152;1;155;0 +WireConnection;154;0;134;0 +WireConnection;154;1;155;0 +WireConnection;153;0;133;0 +WireConnection;153;1;155;0 +WireConnection;136;0;153;0 +WireConnection;138;0;152;0 +WireConnection;137;0;154;0 +WireConnection;144;1;157;0 +WireConnection;142;1;157;0 +WireConnection;140;1;157;0 +WireConnection;149;1;157;0 +WireConnection;147;0;141;0 +WireConnection;147;1;142;0 +WireConnection;146;0;139;0 +WireConnection;146;1;140;0 +WireConnection;145;0;143;0 +WireConnection;145;1;144;0 +WireConnection;11;0;6;0 +WireConnection;11;1;12;0 +WireConnection;18;0;15;0 +WireConnection;148;0;149;0 +WireConnection;148;1;145;0 +WireConnection;148;2;146;0 +WireConnection;148;3;147;0 +WireConnection;16;0;14;0 +WireConnection;7;0;8;0 +WireConnection;7;1;11;0 +WireConnection;26;1;78;0 +WireConnection;19;0;18;0 +WireConnection;19;1;17;0 +WireConnection;19;2;16;0 +WireConnection;150;0;148;0 +WireConnection;4;0;72;0 +WireConnection;4;1;7;0 +WireConnection;23;0;21;0 +WireConnection;23;1;26;2 +WireConnection;22;1;19;0 +WireConnection;43;1;74;0 +WireConnection;37;0;26;1 +WireConnection;37;1;38;0 +WireConnection;46;1;75;0 +WireConnection;44;0;43;4 +WireConnection;44;1;26;2 +WireConnection;55;0;4;0 +WireConnection;55;1;56;0 +WireConnection;158;0;151;0 +WireConnection;158;1;22;0 +WireConnection;158;2;23;0 +WireConnection;70;0;37;0 +WireConnection;70;1;71;0 +WireConnection;70;2;55;0 +WireConnection;52;0;46;4 +WireConnection;52;1;51;0 +WireConnection;47;0;45;0 +WireConnection;47;1;44;0 +WireConnection;159;0;158;0 +WireConnection;159;1;21;0 +WireConnection;9;1;73;0 +WireConnection;53;0;26;3 +WireConnection;53;1;54;0 +WireConnection;156;0;159;0 +WireConnection;156;1;151;0 +WireConnection;49;0;47;0 +WireConnection;49;1;52;0 +WireConnection;10;0;9;0 +WireConnection;10;1;70;0 +WireConnection;50;0;48;0 +WireConnection;50;1;46;0 +WireConnection;83;0;49;0 +WireConnection;86;0;156;0 +WireConnection;85;0;53;0 +WireConnection;79;0;37;0 +WireConnection;81;0;10;0 +WireConnection;84;0;50;0 +WireConnection;0;0;82;0 +WireConnection;0;1;87;0 +WireConnection;0;3;88;0 +WireConnection;0;4;90;0 +WireConnection;0;5;89;0 +WireConnection;0;7;80;0 +ASEEND*/ +//CHKSM=88987B34B8087CB6E197D31CBF383279D1C2130A \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Skin&Wrinkle_Jin.shader.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Skin&Wrinkle_Jin.shader.meta new file mode 100644 index 0000000..6b33b7f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Skin&Wrinkle_Jin.shader.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: e581164ca006851408ab64a0280abd71 +ShaderImporter: + externalObjects: {} + defaultTextures: + - _Normal: {fileID: 2800000, guid: 5f6a88171526ba44b8edd0316d32be0e, type: 3} + - _SQZ_M: {fileID: 2800000, guid: 0bde64e6f5a7c7645b626bacac977600, type: 3} + - _Wide_M: {fileID: 2800000, guid: 76493984454b03f47a3137acfc5ee3a6, type: 3} + - _Wrinkle: {fileID: 2800000, guid: bf18efd814a59c645a89649c222ce5ec, type: 3} + - _lip_Sad_M: {fileID: 2800000, guid: b651b3205353cbe4eafef19f8cd4eee6, type: 3} + - _Wrinkle_Sad: {fileID: 2800000, guid: e86ced7d9ef006641b3cf8855baf388b, type: 3} + - _lip_Smile_M: {fileID: 2800000, guid: 9f79442cfa74a03479bcc9683e287520, type: 3} + - _Wrinkle_Smile: {fileID: 2800000, guid: b3054ff6e9f73b243b3cda952fa02424, type: 3} + - _DetailSkin_Normal: {fileID: 2800000, guid: 7a4aa691425a0e84996a3a3f3d3ef326, + type: 3} + - _Mask: {fileID: 2800000, guid: 7bf471a629e3ed640b3ace8997379f80, type: 3} + - _DetailSkin_Metalic: {fileID: 2800000, guid: 508aaba794b76264994ff90752435697, + type: 3} + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Wireframe.shader b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Wireframe.shader new file mode 100644 index 0000000..bcbe764 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Wireframe.shader @@ -0,0 +1,148 @@ +Shader "Custom/Wireframe" +{ + Properties + { + _WireColor("Edges Color", Color) = (0,0,0,1) + _WireThickness("Edge Thickness", RANGE(0, 800)) = 100 + _WireSmoothness("Edge Smoothness", RANGE(0, 20)) = 3 + _AlbedoColor("Albedo Color", Color) = (1,1,1,1) + _MainTex("Albedo (RGB)", 2D) = "white" {} + + + //_Color ("Color", Color) = (1,1,1,1) + //_MainTex ("Albedo (RGB)", 2D) = "white" {} + } + + + SubShader + { + Tags { "RenderType" = "Opaque" } + LOD 200 + + Pass + { + CGPROGRAM + // Use shader model 3.0 target, to get nicer looking lighting + #pragma target 3.0 + + #include "UnityCG.cginc" + + #pragma vertex vert + #pragma fragment frag + #pragma geometry geom + + uniform sampler2D _MainTex; + uniform float4 _MainTex_ST; + + struct Input + { + float2 uv_MainTex; + }; + + fixed4 _WireColor; + fixed4 _AlbedoColor; + + uniform float _WireThickness; + uniform float _WireSmoothness; + + struct appdata + { + float4 vertex : POSITION; + float2 texcoord0 : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2g + { + float4 projSpaceVertex : SV_POSITION; + float2 uv0 : TEXCOORD0; + float4 worldSpacePosition : TEXCOORD1; + UNITY_VERTEX_OUTPUT_STEREO + }; + + struct g2f + { + float4 projSpaceVertex : SV_POSITION; + float2 uv0 : TEXCOORD0; + float4 worldSpacePosition : TEXCOORD1; + float4 dist : TEXCOORD2; + UNITY_VERTEX_OUTPUT_STEREO + }; + + v2g vert(appdata v) + { + v2g o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + o.projSpaceVertex = UnityObjectToClipPos(v.vertex); + o.worldSpacePosition = mul(unity_ObjectToWorld, v.vertex); + o.uv0 = TRANSFORM_TEX(v.texcoord0, _MainTex); + return o; + } + + + [maxvertexcount(3)] + void geom(triangle v2g i[3], inout TriangleStream triangleStream) + { + float2 p0 = i[0].projSpaceVertex.xy / i[0].projSpaceVertex.w; + float2 p1 = i[1].projSpaceVertex.xy / i[1].projSpaceVertex.w; + float2 p2 = i[2].projSpaceVertex.xy / i[2].projSpaceVertex.w; + + float2 edge0 = p2 - p1; + float2 edge1 = p2 - p0; + float2 edge2 = p1 - p0; + + float area = abs(edge1.x * edge2.y - edge1.y * edge2.x); + float wireThickness = 800 - _WireThickness; + + g2f o; + + o.uv0 = i[0].uv0; + o.worldSpacePosition = i[0].worldSpacePosition; + o.projSpaceVertex = i[0].projSpaceVertex; + o.dist.xyz = float3((area / length(edge0)), 0.0, 0.0) * o.projSpaceVertex.w * wireThickness; + o.dist.w = 1.0 / o.projSpaceVertex.w; + UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(i[0], o); + triangleStream.Append(o); + + o.uv0 = i[1].uv0; + o.worldSpacePosition = i[1].worldSpacePosition; + o.projSpaceVertex = i[1].projSpaceVertex; + o.dist.xyz = float3(0.0, (area / length(edge1)), 0.0) * o.projSpaceVertex.w * wireThickness; + o.dist.w = 1.0 / o.projSpaceVertex.w; + UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(i[1], o); + triangleStream.Append(o); + + o.uv0 = i[2].uv0; + o.worldSpacePosition = i[2].worldSpacePosition; + o.projSpaceVertex = i[2].projSpaceVertex; + o.dist.xyz = float3(0.0, 0.0, (area / length(edge2))) * o.projSpaceVertex.w * wireThickness; + o.dist.w = 1.0 / o.projSpaceVertex.w; + UNITY_TRANSFER_VERTEX_OUTPUT_STEREO(i[2], o); + triangleStream.Append(o); + } + + fixed4 frag(g2f i) : SV_Target + { + float minDistanceToEdge = min(i.dist[0], min(i.dist[1], i.dist[2])) * i.dist[3]; + + float4 baseColor = _AlbedoColor * tex2D(_MainTex, i.uv0); + + // Early out if we know we are not on a line segment. + if (minDistanceToEdge > 0.9) + { + return fixed4(baseColor.rgb,0); + } + + // Smooth our line out + float t = exp2(_WireSmoothness * -1.0 * minDistanceToEdge * minDistanceToEdge); + fixed4 finalColor = lerp(baseColor, _WireColor, t); + finalColor.a = t; + + return finalColor; + } + ENDCG + } + } +FallBack "Diffuse" +} diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Wireframe.shader.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Wireframe.shader.meta new file mode 100644 index 0000000..42a2e0e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Samples~/Shader/Wireframe.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2a6a855fbef71e745a2f55a929d8f30f +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts.meta new file mode 100644 index 0000000..c5de4d4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a49f13dd5640c8d4e89b897d41545ac2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/FacialManager.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/FacialManager.cs new file mode 100644 index 0000000..a411dfd --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/FacialManager.cs @@ -0,0 +1,216 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.XR.OpenXR; +using System; +namespace VIVE.FacialTracking +{ + public class FacialManager + { + private class FacialData + { + public bool isStarted = false; + public XrFacialTrackingTypeHTC trackingType; + public bool isActive; + public ulong trackerHandle; + public int updatedFrame = -1; + public Dictionary eyeWeightings = new Dictionary(); + public Dictionary LipWeightings = new Dictionary(); + public float[] blendshapes; + public bool isCreated { get { return trackerHandle != default; } } + public FacialData(XrFacialTrackingTypeHTC type) + { + trackingType = type; + for (int i = 0; i < (int)XrEyeShapeHTC.XR_EYE_EXPRESSION_MAX_ENUM_HTC; ++i) eyeWeightings.Add((XrEyeShapeHTC)i, 0.0f); + for (int i = 0; i < (int)XrLipShapeHTC.XR_LIP_SHAPE_MAX_ENUM_HTC; ++i) LipWeightings.Add((XrLipShapeHTC)i, 0.0f); + int shapeSize = type == XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC + ? (int)XrEyeShapeHTC.XR_EYE_EXPRESSION_MAX_ENUM_HTC : (int)XrLipShapeHTC.XR_LIP_SHAPE_MAX_ENUM_HTC; + blendshapes = new float[shapeSize]; + } + public void ClearData() + { + Array.Clear(blendshapes, 0, blendshapes.Length); + eyeWeightings.Clear(); + LipWeightings.Clear(); + } + } + + private FacialData eyeFacialData = new FacialData(XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC); + private FacialData lipFacialData = new FacialData(XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC); + private VIVE_FacialTracking_OpenXR_API feature; + private static bool isInitialized; + private static bool isSystemSupportEye; + private static bool isSystemSupportLip; + + private FacialData getFacialData(XrFacialTrackingTypeHTC type) + { + if (type == XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC) + return eyeFacialData; + else + return lipFacialData; + } + + private void OnFeatureSessionCreate(ulong xrSession) + { + TryCreateFacialTracker(eyeFacialData); + TryCreateFacialTracker(lipFacialData); + } + private void OnFeatureSessionDestroy(ulong xrSession) + { + TryDestroyFacialTracker(eyeFacialData); + TryDestroyFacialTracker(lipFacialData); + } + + private void OnFeatureSystemChange(ulong systemId) + { + UpdateSystemSupported(); + } + + private void UpdateSystemSupported() + { + if (feature == null || !feature.IsEnabledAndInitialized) + { + isSystemSupportEye = false; + isSystemSupportLip = false; + } + else + { + feature.SystemSupportsFacialTracking(out var result,out isSystemSupportEye,out isSystemSupportLip); + if (result != XrResult.XR_SUCCESS) + { + Debug.LogWarning("Fail SystemSupportsHandTracking: " + result); + } + if (!isSystemSupportEye) + { + UnityEngine.Debug.Log("Initial eyetracking failed , the device may not support EyeExpression"); + } + if (!isSystemSupportLip) + { + UnityEngine.Debug.Log("Initial liptracking failed , the device may not support LipExpression"); + } + } + } + + + public bool Initialize() + { + if(feature == null) + feature = OpenXRSettings.Instance.GetFeature(); + if (!isInitialized) + { + if (feature != null) + { + feature.onSessionCreate += OnFeatureSessionCreate; + feature.onSessionDestroy += OnFeatureSessionDestroy; + feature.onSystemChange += OnFeatureSystemChange; + } + if (feature != null && feature.IsEnabledAndInitialized) + { + UpdateSystemSupported(); + isInitialized = true; + } + } + + return isInitialized; + } + private bool TryCreateFacialTracker(FacialData facialData) + { + if (!facialData.isStarted) return false; + if (!Initialize()) { return false; } + if (facialData.trackingType == XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC && !isSystemSupportEye) { return false; } + if (facialData.trackingType == XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_LIP_DEFAULT_HTC && !isSystemSupportLip) { return false; } + if (!feature.IsSessionCreated) { return false; } + if (!facialData.isCreated) + { + if (!feature.TryCreateFacialTracker(facialData.trackingType, out facialData.trackerHandle, out var result)) + { + facialData.trackerHandle = default; + Debug.LogWarning("Fail CreateFacialTracker: " + result); + } + } + + return facialData.isCreated; + } + + private void TryDestroyFacialTracker(FacialData facialData) + { + if (!facialData.isCreated) { return; } + if (!Initialize()) { return; } + + if(!feature.TryDestroFacialTracker(facialData.trackerHandle, out var res)) + { + Debug.LogWarning("Fail DestroyFacialTracker: " + res); + } + else + { + Debug.Log("Success DestroyFacialTracker: " + res); + } + facialData.trackerHandle = default; + facialData.ClearData(); + } + private void TryGetFacialData(FacialData facialData) + { + if(facialData.isCreated) + { + if(facialData.updatedFrame != Time.frameCount) + { + int maxExpressionCount = facialData.trackingType == XrFacialTrackingTypeHTC.XR_FACIAL_TRACKING_TYPE_EYE_DEFAULT_HTC + ? (int)XrEyeShapeHTC.XR_EYE_EXPRESSION_MAX_ENUM_HTC : (int)XrLipShapeHTC.XR_LIP_SHAPE_MAX_ENUM_HTC; + facialData.updatedFrame = Time.frameCount; + if (!feature.TryGetFacialData( + facialData.trackerHandle, + out facialData.isActive, + maxExpressionCount, + out var result, + facialData.blendshapes)) + { + facialData.isActive = false; + Debug.LogWarning("Fail TryGetFacialData: " + result); + } + } + + } + + } + public void StartFramework(XrFacialTrackingTypeHTC type) + { + var facialdata = getFacialData(type); + facialdata.isStarted = true; + TryCreateFacialTracker(facialdata); + } + public void StopFramework(XrFacialTrackingTypeHTC type) + { + var facialdata = getFacialData(type); + facialdata.isStarted = false; + TryDestroyFacialTracker(facialdata); + } + public bool GetWeightings(out Dictionary shapes) + { + if (typeof(T) == typeof(XrEyeShapeHTC)) + { + TryGetFacialData(eyeFacialData); + for (int i = 0; i < (int)XrEyeShapeHTC.XR_EYE_EXPRESSION_MAX_ENUM_HTC; ++i) + { + eyeFacialData.eyeWeightings[(XrEyeShapeHTC)i] = eyeFacialData.blendshapes[i]; + } + shapes = (Dictionary)(System.Object)(eyeFacialData.eyeWeightings); + return true; + } + else if (typeof(T) == typeof(XrLipShapeHTC)) + { + TryGetFacialData(lipFacialData); + for (int i = 0; i < (int)XrLipShapeHTC.XR_LIP_SHAPE_MAX_ENUM_HTC; ++i) + { + lipFacialData.LipWeightings[(XrLipShapeHTC)i] = lipFacialData.blendshapes[i]; + } + shapes = (Dictionary)(System.Object)(lipFacialData.LipWeightings); + return true; + } + else + { + shapes = default; + return false; + } + } + + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/FacialManager.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/FacialManager.cs.meta new file mode 100644 index 0000000..bd82759 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/FacialManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9da6a2c254e9354891b5ab88cd630f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/VIVE_FacialTracking_OpenXR_API.cs b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/VIVE_FacialTracking_OpenXR_API.cs new file mode 100644 index 0000000..c02d0d4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/VIVE_FacialTracking_OpenXR_API.cs @@ -0,0 +1,192 @@ +using System; +using System.Runtime.InteropServices; +using UnityEditor; +using UnityEngine.XR.OpenXR.Features; +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif +namespace VIVE +{ + namespace FacialTracking + { + +#if UNITY_EDITOR + [OpenXRFeature(UiName = "Facial Tracking", + BuildTargetGroups = new[] { BuildTargetGroup.Standalone }, + Company = "HTC", + Desc = "Facial Tracking OpenXR Feature", + DocumentationLink = "https://developer.vive.com/resources/openxr/openxr-pcvr/tutorials/unity/integrate-facial-tracking-your-avatar/", + OpenxrExtensionStrings = "XR_HTC_facial_tracking", + Version = "0.0.1", + FeatureId = featureId)] +#endif + public class VIVE_FacialTracking_OpenXR_API : OpenXRFeature + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.htc.openxr.facialtracking.feature"; + private ulong m_XrInstance; + private ulong m_XrSession; + private ulong m_systemid; + [Obsolete] XrSystemProperties systemProperties; + [Obsolete] public ulong m_expressionHandle; + [Obsolete] public ulong m_expressionHandle_Lip; + + public bool IsInitialized { get { return m_xrGetSystemProperties != null; } } + public bool IsEnabledAndInitialized { get { return enabled && IsInitialized; } } + public bool IsSessionCreated { get { return XrSession != default; } } + public ulong XrInstance { get { return m_XrInstance; } } + public ulong XrSession { get { return m_XrSession; } } + public ulong SystemId { get { return m_systemid; } } + + public event Action onSessionCreate; + public event Action onSessionDestroy; + public event Action onSystemChange; + + /// + protected override bool OnInstanceCreate(ulong xrInstance) + { + UnityEngine.Debug.Log($"OnInstanceCreate({xrInstance:X})"); + m_XrInstance = xrInstance; + + return GetXrFunctionDelegates(xrInstance); + } + + /// + protected override void OnInstanceDestroy(ulong xrInstance) + { + UnityEngine.Debug.Log($"OnInstanceDestroy({xrInstance:X})"); + m_XrInstance = default; + } + protected override void OnSessionCreate(ulong xrSession) + { + UnityEngine.Debug.Log($"OnSessionCreate({xrSession:X})"); + m_XrSession = xrSession; + + try { onSessionCreate?.Invoke(xrSession); } + catch (Exception e) { UnityEngine.Debug.LogError(e); } + } + protected override void OnSystemChange(ulong xrSystem) + { + UnityEngine.Debug.Log($"OnSystemChange({xrSystem:X})"); + m_systemid = xrSystem; + + try { onSystemChange?.Invoke(xrSystem); } + catch (Exception e) { UnityEngine.Debug.LogError(e); } + } + + protected override void OnSessionDestroy(ulong xrSession) + { + UnityEngine.Debug.Log($"OnSessionDestroy({xrSession:X})"); + m_XrSession = default; + try { onSessionDestroy?.Invoke(xrSession); } + catch (Exception e) { UnityEngine.Debug.LogError(e); } + } + + private bool GetXrFunctionDelegates(ulong xrInstance) + { + if (xrGetInstanceProcAddr == null || xrGetInstanceProcAddr == IntPtr.Zero) + UnityEngine.Debug.LogError("xrGetInstanceProcAddr is null"); + // Get delegate of xrGetInstanceProcAddr. + var xrGetProc = Marshal.GetDelegateForFunctionPointer(xrGetInstanceProcAddr); + // Get delegate of other OpenXR functions using xrGetInstanceProcAddr. + if (!MarshelFunc(xrInstance, xrGetProc, "xrGetSystemProperties", ref m_xrGetSystemProperties)) { return false; } + if (!MarshelFunc(xrInstance, xrGetProc, "xrCreateFacialTrackerHTC", ref m_xrCreateFacialTrackerHTC)) { return false; } + if (!MarshelFunc(xrInstance, xrGetProc, "xrDestroyFacialTrackerHTC", ref m_xrDestroyFacialTrackerHTC)) { return false; } + if (!MarshelFunc(xrInstance, xrGetProc, "xrGetFacialExpressionsHTC", ref m_xrGetFacialExpressionsHTC)) { return false; } + return true; + } + private static bool MarshelFunc(ulong instance, xrGetInstanceProcDelegate instanceProc, string funcName, ref T func, bool verbose = true) + where T : Delegate + { + if (instanceProc(instance, funcName, out var fp) != 0) + { + if (verbose) + { + UnityEngine.Debug.LogError("Fail getting function " + funcName); + } + return false; + } + + func = Marshal.GetDelegateForFunctionPointer(fp); + return true; + } + delegate int XrGetInstanceProcAddrDelegate(ulong instance, string name, out IntPtr function); + XrGetInstanceProcAddrDelegate m_XrGetInstanceProcAddr; + + delegate int xrGetSystemPropertiesDelegate(ulong instance, ulong systemId, ref XrSystemProperties properties); + xrGetSystemPropertiesDelegate m_xrGetSystemProperties; + public int xrGetSystemProperties(ref XrSystemProperties properties) => + m_xrGetSystemProperties(m_XrInstance, m_systemid, ref properties); + public int xrGetSystemProperties(ulong instance, ulong systemId, ref XrSystemProperties properties) => + m_xrGetSystemProperties(instance, systemId, ref properties); + + delegate int xrCreateFacialTrackerHTCDelegate(ulong session, XrFacialTrackerCreateInfoHTC createInfo, out ulong expression); + xrCreateFacialTrackerHTCDelegate m_xrCreateFacialTrackerHTC; + public int xrCreateFacialTrackerHTC(XrFacialTrackerCreateInfoHTC createInfo ,out ulong handle) => + m_xrCreateFacialTrackerHTC(m_XrSession, createInfo, out handle); + public int xrCreateFacialTrackerHTC(ulong session, XrFacialTrackerCreateInfoHTC createInfo, out ulong handle) => + m_xrCreateFacialTrackerHTC(session, createInfo, out handle); + + delegate int xrDestroyFacialTrackerHTCDelegate(ulong facialTracker); + xrDestroyFacialTrackerHTCDelegate m_xrDestroyFacialTrackerHTC; + public int xrDestroyFacialTrackerHTC(ulong handle) => + m_xrDestroyFacialTrackerHTC(handle); + + delegate int xrGetFacialExpressionsHTCDelegate(ulong facialTracker, ref XrFacialExpressionsHTC eyeExpressionData); + xrGetFacialExpressionsHTCDelegate m_xrGetFacialExpressionsHTC; + public int xrGetFacialExpressionsHTC(ulong handle,ref XrFacialExpressionsHTC eyeExpressionData) => + m_xrGetFacialExpressionsHTC(handle, ref eyeExpressionData); + + public unsafe void SystemSupportsFacialTracking(out XrResult result,out bool isSupportEye,out bool isSupportLip) + { + XrSystemFacialTrackingPropertiesHTC expressionProperties = new XrSystemFacialTrackingPropertiesHTC + { + type = XrStructureType.XR_TYPE_SYSTEM_FACIAL_TRACKING_PROPERTIES_HTC, + next = IntPtr.Zero, + }; + + var systemProp = new XrSystemProperties() + { + type = XrStructureType.XR_TYPE_SYSTEM_PROPERTIES, + next = (IntPtr)(&expressionProperties), + }; + result = (XrResult)xrGetSystemProperties(XrInstance, SystemId ,ref systemProp); + isSupportEye = expressionProperties.supportEyeFacialTracking != 0; + isSupportLip = expressionProperties.supportLipFacialTracking != 0; + } + + public bool TryCreateFacialTracker(XrFacialTrackingTypeHTC type,out ulong handle, out XrResult result) + { + XrFacialTrackerCreateInfoHTC createInfo = new XrFacialTrackerCreateInfoHTC( + XrStructureType.XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC, + IntPtr.Zero, + type); + result = (XrResult)xrCreateFacialTrackerHTC(XrSession,createInfo, out handle); + return result == XrResult.XR_SUCCESS; + } + public bool TryDestroFacialTracker(ulong handle, out XrResult result) + { + result= (XrResult)xrDestroyFacialTrackerHTC(handle); + return result == XrResult.XR_SUCCESS; + } + public bool TryGetFacialData(ulong handle,out bool isActive,int maxExpressioncount,out XrResult result,float[] blendshapes) + { + XrFacialExpressionsHTC facialExpression = new XrFacialExpressionsHTC() + { + type = XrStructureType.XR_TYPE_FACIAL_EXPRESSIONS_HTC, + expressionCount = maxExpressioncount, + sampleTime = 10L, //An arbitrary number greater than 0 + blendShapeWeightings = Marshal.AllocCoTaskMem(sizeof(float) * maxExpressioncount), + }; + result = (XrResult)xrGetFacialExpressionsHTC(handle, ref facialExpression); + + Marshal.Copy(facialExpression.blendShapeWeightings, blendshapes, 0, maxExpressioncount); + isActive = facialExpression.isActive != 0u; + + return result == XrResult.XR_SUCCESS; + } + } + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/VIVE_FacialTracking_OpenXR_API.cs.meta b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/VIVE_FacialTracking_OpenXR_API.cs.meta new file mode 100644 index 0000000..b90a626 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFacialTracking/Scripts/VIVE_FacialTracking_OpenXR_API.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: be5cb237345f49840bbc00c128fde3d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFocus3Controller.meta b/com.htc.upm.vive.openxr/OpenXRFocus3Controller.meta new file mode 100644 index 0000000..b08e78f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFocus3Controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b82495a07a589504fa93324ca990a306 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime.meta b/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime.meta new file mode 100644 index 0000000..01f34c0 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0421eee005d6f0b438c7c21177d3d8a0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input.meta b/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input.meta new file mode 100644 index 0000000..9752d3f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 126e3d3abfa171b47aeb79e1a84c8a71 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input/Features.meta b/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input/Features.meta new file mode 100644 index 0000000..88a36b4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input/Features.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e4f01d0112cf24f43a73dae4a96e1d45 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input/Features/HtcViveFocus3InputFeature.cs b/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input/Features/HtcViveFocus3InputFeature.cs new file mode 100644 index 0000000..f5303cd --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input/Features/HtcViveFocus3InputFeature.cs @@ -0,0 +1,677 @@ +using System.Collections.Generic; +using UnityEngine.InputSystem.XR; +using UnityEngine.InputSystem.Layouts; +using UnityEngine.InputSystem.Controls; +using UnityEngine.Scripting; +using UnityEngine.XR.OpenXR.Features.Interactions; +using UnityEngine.XR.OpenXR.Input; +#if UNITY_EDITOR +using UnityEditor; +#endif + +using PoseControl = UnityEngine.XR.OpenXR.Input.PoseControl; + +namespace UnityEngine.XR.OpenXR.Features +{ + /// + /// This enables the use of HTC Vive Focus3 Controllers interaction profiles in OpenXR. + /// +#if UNITY_EDITOR + [UnityEditor.XR.OpenXR.Features.OpenXRFeature(UiName = "HTC Vive Focus3 Controller Support", + BuildTargetGroups = new[] { BuildTargetGroup.Standalone, BuildTargetGroup.WSA }, + Company = "HTC", + Desc = "Allows for mapping input to the HTC Vive Focus3 Controller interaction profile.", + //DocumentationLink = "https://developer.vive.com/resources/openxr/openxr-pcvr/tutorials/unity/cosmos-controller-openxr-feature-unity/", + OpenxrExtensionStrings = "XR_HTC_vive_focus3_controller_interaction XR_EXT_palm_pose", + Version = "0.0.2", + Category = UnityEditor.XR.OpenXR.Features.FeatureCategory.Interaction, + FeatureId = featureId)] +#endif + public class HtcViveFocus3InputFeature : OpenXRInteractionFeature + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.htc.openxr.feature.input.htcvivefocus3"; + + /// + /// An Input System device based off the HTC Vive Controller. + /// + /// + [Preserve, InputControlLayout(displayName = "HTC Vive Focus3 Controller (OpenXR)", commonUsages = new[] { "LeftHand", "RightHand" })] + public class ViveFocus3Controller : XRControllerWithRumble + { + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "thumbresttouch" })] + public ButtonControl thumbrestTouched { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "griptouch" })] + public ButtonControl gripTouched { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripAxis" })] + public AxisControl grip { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripButton" })] + public ButtonControl gripPressed { get; private set; } + + /// + /// A representing the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "B", "Y" })] + public ButtonControl secondaryButton { get; private set; } + + /// + /// A representing the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "A", "X" })] + public ButtonControl primaryButton { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "Primary", "menubutton" })] + public ButtonControl menu { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "triggertouch" })] + public ButtonControl triggerTouched { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "triggeraxis" })] + public AxisControl trigger { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "triggerbutton" })] + public ButtonControl triggerPressed { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "Primary2DAxis", "joystickaxes" })] + public Vector2Control joystick { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "joystickorpadpressed", "joystickpressed" })] + public ButtonControl joystickClicked { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "joystickorpadtouched", "joysticktouched" })] + public ButtonControl joystickTouched { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, alias = "device")] + public PoseControl devicePose { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(offset = 0)] + public PoseControl pointer { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this represents the overall tracking state of the device. this value is equivalent to mapping devicePose/isTracked + /// + [Preserve, InputControl(offset = 28)] + new public ButtonControl isTracked { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this represents the bit flag set indicating what data is valid. this value is equivalent to mapping devicePose/trackingState + /// + [Preserve, InputControl(offset = 32)] + new public IntegerControl trackingState { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this is the device position, or grip position. this value is equivalent to mapping devicePose/position + /// + [Preserve, InputControl(offset = 36, aliases = new[] { "gripPosition" })] + new public Vector3Control devicePosition { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this is the device orientation, or grip orientation. this value is equivalent to mapping devicePose/rotation + /// + [Preserve, InputControl(offset = 48, aliases = new[] { "gripOrientation", "gripRotation" })] + new public QuaternionControl deviceRotation { get; private set; } + + /// A required for back compatibility with the XRSDK layouts. this is the pointer position. this value is equivalent to mapping pointerPose/position + /// + [Preserve, InputControl(offset = 96)] + public Vector3Control pointerPosition { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this is the pointer rotation. this value is equivalent to mapping pointerPose/rotation + /// + [Preserve, InputControl(offset = 108, aliases = new[] { "pointerOrientation" })] + public QuaternionControl pointerRotation { get; private set; } + + /// + /// A that represents the binding. + /// + [Preserve, InputControl(usage = "Haptic")] + public HapticControl haptic { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl()] + public PoseControl palm { get; private set; } + + + protected override void FinishSetup() + { + base.FinishSetup(); + thumbrestTouched = GetChildControl("thumbrestTouched"); + gripTouched = GetChildControl("gripTouched"); + grip = GetChildControl("grip"); + gripPressed = GetChildControl("gripPressed"); + primaryButton = GetChildControl("primaryButton"); + secondaryButton = GetChildControl("secondaryButton"); + menu = GetChildControl("menu"); + trigger = GetChildControl("trigger"); + triggerTouched = GetChildControl("triggerTouched"); + triggerPressed = GetChildControl("triggerPressed"); + joystick = GetChildControl("joystick"); + joystickClicked = GetChildControl("joystickClicked"); + joystickTouched = GetChildControl("joystickTouched"); + + devicePose = GetChildControl("devicePose"); + pointer = GetChildControl("pointer"); + + isTracked = GetChildControl("isTracked"); + trackingState = GetChildControl("trackingState"); + devicePosition = GetChildControl("devicePosition"); + deviceRotation = GetChildControl("deviceRotation"); + pointerPosition = GetChildControl("pointerPosition"); + pointerRotation = GetChildControl("pointerRotation"); + haptic = GetChildControl("haptic"); + palm = GetChildControl("palm"); + } + } + /// The interaction profile string used to reference the HTC Vive Focus3 Controller. + public const string profile = "/interaction_profiles/htc/vive_focus3_controller"; + + /// + /// Constant for a interaction binding '.../input/trigger/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string select = "/input/trigger/click"; + + /// + /// Constant for a interaction binding '.../input/a/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string a = "/input/a/click"; + + /// + /// Constant for a interaction binding '.../input/b/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string b = "/input/b/click"; + + /// + /// Constant for a interaction binding '.../input/x/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string x = "/input/x/click"; + + /// + /// Constant for a interaction binding '.../input/y/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string y = "/input/y/click"; + + /// + /// Constant for a interaction binding '.../input/squeeze/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string squeeze = "/input/squeeze/value"; + /// + /// Constant for a interaction binding '.../input/squeeze/touch' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string squeezeTouch = "/input/squeeze/touch"; + /// + /// Constant for a interaction binding '.../input/squeeze/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string squeezeClick = "/input/squeeze/click"; + /// + /// Constant for a interaction binding '.../input/menu/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string menu = "/input/menu/click"; + /// + /// Constant for a interaction binding '.../input/trigger/touch' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string triggerTouch = "/input/trigger/touch"; + /// + /// Constant for a interaction binding '.../input/trigger/value' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string trigger = "/input/trigger/value"; + /// + /// Constant for a interaction binding '.../input/trigger/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string triggerClick = "/input/trigger/click"; + /// + /// Constant for a interaction binding '.../input/trackpad' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string thumbstick = "/input/thumbstick"; + /// + /// Constant for a interaction binding '.../input/trackpad/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string thumbstickClick = "/input/thumbstick/click"; + /// + /// Constant for a interaction binding '.../input/trackpad/touch' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string thumbstickTouch = "/input/thumbstick/touch"; + /// + /// Constant for a interaction binding '.../input/grip/pose' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string grip = "/input/grip/pose"; + /// + /// Constant for a interaction binding '.../input/aim/pose' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string aim = "/input/aim/pose"; + /// + /// Constant for a interaction binding '.../output/haptic' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string haptic = "/output/haptic"; + + /// + /// Constant for a interaction binding '.../input/palm_ext/pose' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string palm = "/input/palm_ext/pose"; + + /// + /// Constant for a interaction binding '.../input/thumbrest/touch' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string thumbrest = "/input/thumbrest/touch"; + + private const string kDeviceLocalizedName = "HTC Vive Focus3 Controller OpenXR"; + /// + /// Registers the layout with the Input System. Matches the that is registered with . + /// + + protected override void RegisterDeviceLayout() + { + InputSystem.InputSystem.RegisterLayout(typeof(ViveFocus3Controller), + matches: new InputDeviceMatcher() + .WithInterface(XRUtilities.InterfaceMatchAnyVersion) + .WithProduct(kDeviceLocalizedName)); + } + + + /// + /// Removes the layout from the Input System. Matches the that is registered with . + /// + protected override void UnregisterDeviceLayout() + { + InputSystem.InputSystem.RemoveLayout(typeof(ViveFocus3Controller).Name); + } + + /// + /// Registers an with OpenXR that matches the HTC Vive Focus3 Controller. Also calls when the Input System package is available. + /// + protected override void RegisterActionMapsWithRuntime() + { + ActionMapConfig actionMap = new ActionMapConfig() + { + name = "vivefocus3controller", + localizedName = kDeviceLocalizedName, + desiredInteractionProfile = profile, + manufacturer = "HTC", + serialNumber = "", + deviceInfos = new List() + { + new DeviceConfig() + { + characteristics = (InputDeviceCharacteristics)(InputDeviceCharacteristics.HeldInHand | InputDeviceCharacteristics.TrackedDevice | InputDeviceCharacteristics.Controller | InputDeviceCharacteristics.Left), + userPath = UserPaths.leftHand + }, + new DeviceConfig() + { + characteristics = (InputDeviceCharacteristics)(InputDeviceCharacteristics.HeldInHand | InputDeviceCharacteristics.TrackedDevice | InputDeviceCharacteristics.Controller | InputDeviceCharacteristics.Right), + userPath = UserPaths.rightHand + } + }, + actions = new List() + { + new ActionConfig() + { + name = "primarybutton", + localizedName = "Primary Button", + type = ActionType.Binary, + usages = new List() + { + "PrimaryButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = x, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = a, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + new ActionConfig() + { + name = "secondarybutton", + localizedName = "Secondary Button", + type = ActionType.Binary, + usages = new List() + { + "SecondaryButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = y, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = b, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + new ActionConfig() + { + name = "thumbrestTouched", + localizedName = "Thumbrest Touched", + type = ActionType.Binary, + usages = new List() + { + "ThumbrestTouch", + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbrest, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "grip", + localizedName = "Grip", + type = ActionType.Axis1D, + usages = new List() + { + "Grip" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeeze, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "gripTouched", + localizedName = "Grip Touched", + type = ActionType.Binary, + usages = new List() + { + "GripTouch", + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeezeTouch, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "grippressed", + localizedName = "Grip Pressed", + type = ActionType.Binary, + usages = new List() + { + "GripPressed", + "GripButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeezeClick, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "menu", + localizedName = "Menu", + type = ActionType.Binary, + usages = new List() + { + "MenuButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = menu, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + } + } + }, + new ActionConfig() + { + name = "trigger", + localizedName = "Trigger", + type = ActionType.Axis1D, + usages = new List() + { + "Trigger" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = trigger, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "triggerTouched", + localizedName = "TriggerTouched", + type = ActionType.Binary, + usages = new List() + { + "TriggerTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = triggerTouch, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "triggerpressed", + localizedName = "Trigger Pressed", + type = ActionType.Binary, + usages = new List() + { + "TriggerPressed", + "TriggerButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = triggerClick, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "thumbstick", + localizedName = "Thumbstick", + type = ActionType.Axis2D, + usages = new List() + { + "Primary2DAxis" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstick, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "thumbsticktouched", + localizedName = "Thumbstick Touched", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstickTouch, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "thumbstickclicked", + localizedName = "Thumbstick Clicked", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisClick" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstickClick, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "devicepose", + localizedName = "Device Pose", + type = ActionType.Pose, + usages = new List() + { + "Device" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = grip, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "pointer", + localizedName = "Pointer Pose", + type = ActionType.Pose, + usages = new List() + { + "Pointer" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = aim, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "haptic", + localizedName = "Haptic Output", + type = ActionType.Vibrate, + usages = new List() { "Haptic" }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = haptic, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "palm", + localizedName = "Palm Pose", + type = ActionType.Pose, + usages = new List() + { + "Palm" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = palm, + interactionProfileName = profile, + } + } + } + } + }; + AddActionMap(actionMap); + } + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input/Features/HtcViveFocus3InputFeature.cs.meta b/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input/Features/HtcViveFocus3InputFeature.cs.meta new file mode 100644 index 0000000..cbe9a62 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRFocus3Controller/Runtime/input/Features/HtcViveFocus3InputFeature.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03f67eb290fa9f3468b94c84f9f50e84 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler.meta b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler.meta new file mode 100644 index 0000000..9096b4e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9c90cb647e537c84ba07688712190d17 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime.meta b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime.meta new file mode 100644 index 0000000..152285e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9b53493b46f302b45977615867be989e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input.meta b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input.meta new file mode 100644 index 0000000..81e3d7f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a7d87364cc42b1a4692f56baec26a8f3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input/Features.meta b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input/Features.meta new file mode 100644 index 0000000..7ac8ccb --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input/Features.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 22ec09192290b7a4fa47af97e8826a6c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input/Features/HtcViveHandInteractionInputFeature.cs b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input/Features/HtcViveHandInteractionInputFeature.cs new file mode 100644 index 0000000..56e178b --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input/Features/HtcViveHandInteractionInputFeature.cs @@ -0,0 +1,264 @@ +using System.Collections.Generic; +using UnityEngine.InputSystem.XR; +using UnityEngine.InputSystem.Layouts; +using UnityEngine.InputSystem.Controls; +using UnityEngine.Scripting; +using UnityEngine.XR.OpenXR.Features.Interactions; +using UnityEngine.XR.OpenXR.Input; +#if UNITY_EDITOR +using UnityEditor; +#endif + +using PoseControl = UnityEngine.XR.OpenXR.Input.PoseControl; + +namespace UnityEngine.XR.OpenXR.Features +{ + /// + /// This enables the use of HTC Vive hand interaction profiles in OpenXR. + /// +#if UNITY_EDITOR + [UnityEditor.XR.OpenXR.Features.OpenXRFeature(UiName = "HTC Vive hand interaction Support", + BuildTargetGroups = new[] { BuildTargetGroup.Standalone, BuildTargetGroup.WSA }, + Company = "HTC", + Desc = "Allows for mapping input to the HTC Vive hand interaction interaction profile.", + DocumentationLink = "https://developer.vive.com/resources/openxr/openxr-pcvr/tutorials/unity/hand-interaction-profile/", + OpenxrExtensionStrings = "XR_HTC_hand_interaction", + Version = "0.0.1", + Category = UnityEditor.XR.OpenXR.Features.FeatureCategory.Interaction, + FeatureId = featureId)] +#endif + public class HtcViveHandInteractionInputFeature : OpenXRInteractionFeature + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.htc.openxr.feature.input.htcvivehandinteraction"; + + /// + /// An Input System device based off the HTC Vive Controller. + /// + /// + [Preserve, InputControlLayout(displayName = "HTC Vive hand interaction (OpenXR)", commonUsages = new[] { "LeftHand", "RightHand" })] + public class ViveHandInteraction : XRController + { + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripAxis" })] + public AxisControl grip { get; private set; } + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "selectaxis" })] + public AxisControl select { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, alias = "device")] + public PoseControl devicePose { get; private set; } + + /// + /// A representing information from the OpenXR binding. + /// + [Preserve, InputControl(offset = 0)] + public PoseControl pointer { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this represents the overall tracking state of the device. this value is equivalent to mapping devicePose/isTracked + /// + [Preserve, InputControl(offset = 28)] + new public ButtonControl isTracked { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this represents the bit flag set indicating what data is valid. this value is equivalent to mapping devicePose/trackingState + /// + [Preserve, InputControl(offset = 32)] + new public IntegerControl trackingState { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this is the device position, or grip position. this value is equivalent to mapping devicePose/position + /// + [Preserve, InputControl(offset = 36, aliases = new[] { "gripPosition" })] + new public Vector3Control devicePosition { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this is the device orientation, or grip orientation. this value is equivalent to mapping devicePose/rotation + /// + [Preserve, InputControl(offset = 48, aliases = new[] { "gripOrientation", "gripRotation" })] + new public QuaternionControl deviceRotation { get; private set; } + + /// A required for back compatibility with the XRSDK layouts. this is the pointer position. this value is equivalent to mapping pointerPose/position + /// + [Preserve, InputControl(offset = 96)] + public Vector3Control pointerPosition { get; private set; } + + /// + /// A required for back compatibility with the XRSDK layouts. this is the pointer rotation. this value is equivalent to mapping pointerPose/rotation + /// + [Preserve, InputControl(offset = 108, aliases = new[] { "pointerOrientation" })] + public QuaternionControl pointerRotation { get; private set; } + + protected override void FinishSetup() + { + base.FinishSetup(); + grip = GetChildControl("grip"); + select = GetChildControl("select"); + + devicePose = GetChildControl("devicePose"); + pointer = GetChildControl("pointer"); + + isTracked = GetChildControl("isTracked"); + trackingState = GetChildControl("trackingState"); + devicePosition = GetChildControl("devicePosition"); + deviceRotation = GetChildControl("deviceRotation"); + pointerPosition = GetChildControl("pointerPosition"); + pointerRotation = GetChildControl("pointerRotation"); + } + } + /// The interaction profile string used to reference the HTC Vive hand interaction. + public const string profile = "/interaction_profiles/htc/hand_interaction"; + + /// + /// Constant for a interaction binding '.../input/squeeze/click' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string squeeze = "/input/squeeze/value"; + /// + /// Constant for a interaction binding '.../input/select/value' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string select = "/input/select/value"; + /// + /// Constant for a interaction binding '.../input/grip/pose' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string grip = "/input/grip/pose"; + /// + /// Constant for a interaction binding '.../input/aim/pose' OpenXR Input Binding. Used by to bind actions to physical inputs. + /// + public const string aim = "/input/aim/pose"; + + private const string kDeviceLocalizedName = "HTC Vive hand interaction OpenXR"; + /// + /// Registers the layout with the Input System. Matches the that is registered with . + /// + protected override void RegisterDeviceLayout() + { + InputSystem.InputSystem.RegisterLayout(typeof(ViveHandInteraction), + matches: new InputDeviceMatcher() + .WithInterface(XRUtilities.InterfaceMatchAnyVersion) + .WithProduct(kDeviceLocalizedName)); + } + + + /// + /// Removes the layout from the Input System. Matches the that is registered with . + /// + protected override void UnregisterDeviceLayout() + { + InputSystem.InputSystem.RemoveLayout(typeof(ViveHandInteraction).Name); + } + + /// + /// Registers an with OpenXR that matches the HTC Vive hand interaction. Also calls when the Input System package is available. + /// + protected override void RegisterActionMapsWithRuntime() + { + ActionMapConfig actionMap = new ActionMapConfig() + { + name = "ViveHandInteraction", + localizedName = kDeviceLocalizedName, + desiredInteractionProfile = profile, + manufacturer = "HTC", + serialNumber = "", + deviceInfos = new List() + { + new DeviceConfig() + { + characteristics = (InputDeviceCharacteristics)(InputDeviceCharacteristics.TrackedDevice | InputDeviceCharacteristics.HandTracking | InputDeviceCharacteristics.Left), + userPath = "/user/hand_htc/left" + }, + new DeviceConfig() + { + characteristics = (InputDeviceCharacteristics)(InputDeviceCharacteristics.TrackedDevice | InputDeviceCharacteristics.HandTracking | InputDeviceCharacteristics.Right), + userPath = "/user/hand_htc/right" + } + }, + actions = new List() + { + new ActionConfig() + { + name = "grip", + localizedName = "Grip", + type = ActionType.Axis1D, + usages = new List() + { + "Grip" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeeze, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "select", + localizedName = "Select", + type = ActionType.Axis1D, + usages = new List() + { + "Select" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = select, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "devicepose", + localizedName = "Device Pose", + type = ActionType.Pose, + usages = new List() + { + "Device" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = grip, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "pointer", + localizedName = "Pointer Pose", + type = ActionType.Pose, + usages = new List() + { + "Pointer" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = aim, + interactionProfileName = profile, + } + } + } + } + }; + AddActionMap(actionMap); + } + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input/Features/HtcViveHandInteractionInputFeature.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input/Features/HtcViveHandInteractionInputFeature.cs.meta new file mode 100644 index 0000000..2dc5664 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandInteractionProfiler/Runtime/input/Features/HtcViveHandInteractionInputFeature.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d6ba0632411b7742b59d20955e2ea57 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking.meta new file mode 100644 index 0000000..1a805e8 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 52487a0e9b06950449d9fe1c91687776 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Editor.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Editor.meta new file mode 100644 index 0000000..31b298f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e3b50201243972949bd077c1e0aff72c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Editor/HandTrackingFeauterInstaller.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Editor/HandTrackingFeauterInstaller.cs new file mode 100644 index 0000000..2936df6 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Editor/HandTrackingFeauterInstaller.cs @@ -0,0 +1,54 @@ +using UnityEditor; +using UnityEditor.XR.OpenXR.Features; +using UnityEngine; +using UnityEngine.XR.OpenXR; +using System; +using System.Linq; +using System.Reflection; +using System.IO; +using VIVE.HandTracking; +using UnityEngine.XR.OpenXR.Features; +namespace UnityEditor.XR.OpenXR.Samples.HandTracking +{ + [InitializeOnLoad] + public class HandTrackingFeauterInstaller : Editor + { +#if !UNITY_SAMPLE_DEV + private const string k_ScriptPath = "HandTracking Example/Editor/HandTrackingFeauterInstaller.cs"; + static HandTrackingFeauterInstaller() + { + FeatureHelpers.RefreshFeatures(BuildTargetGroup.Standalone); + var feature = OpenXRSettings.Instance.GetFeature(); + var HandInteractionfeature = OpenXRSettings.Instance.GetFeature(); + if (feature != null) + { + if (feature.enabled != true) + { + feature.enabled = true; + } + } + if (HandInteractionfeature != null) + { + if (HandInteractionfeature.enabled != true) + { + HandInteractionfeature.enabled = true; + } + } + Debug.Log(AssetDatabase.FindAssets(Path.GetFileNameWithoutExtension(k_ScriptPath)).Select(AssetDatabase.GUIDToAssetPath)); + var source = AssetDatabase.FindAssets(Path.GetFileNameWithoutExtension(k_ScriptPath)) + .Select(AssetDatabase.GUIDToAssetPath) + .FirstOrDefault(r => r.Contains(k_ScriptPath)); + + if (string.IsNullOrEmpty(source)) + { + Debug.LogError("File Not Exist"); + return; + } + + source = Path.GetDirectoryName(source); + Debug.Log(source); + AssetDatabase.DeleteAsset(Path.Combine(Path.GetDirectoryName(source), "Editor")); + } +#endif + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Editor/HandTrackingFeauterInstaller.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Editor/HandTrackingFeauterInstaller.cs.meta new file mode 100644 index 0000000..f56ff43 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Editor/HandTrackingFeauterInstaller.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 25c6b0688a353874791039a7510e9003 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/HandInteractions.inputactions b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/HandInteractions.inputactions new file mode 100644 index 0000000..05fa6cf --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/HandInteractions.inputactions @@ -0,0 +1,182 @@ +{ + "name": "HandInteractions", + "maps": [ + { + "name": "LeftHand", + "id": "9ef2cbaf-c5ca-4f94-afd3-c13e92ae39b0", + "actions": [ + { + "name": "select", + "type": "Value", + "id": "9f7476ef-5e86-4fbd-be2a-d191fcd6bd90", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "grip", + "type": "Value", + "id": "58e87055-a7f7-49e5-874c-ed1531b2fc73", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "selectPose", + "type": "Value", + "id": "2427c326-992b-4b5e-8b32-65766a69b9f6", + "expectedControlType": "Pose", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "devicePose", + "type": "Value", + "id": "14167057-a039-4b71-b169-ae012bc4f26b", + "expectedControlType": "Pose", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "", + "id": "b403b14a-c930-45f9-9a3e-2710e4721344", + "path": "{LeftHand}/select", + "interactions": "", + "processors": "", + "groups": "", + "action": "select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ae0a8fd0-79a3-4996-8334-0c00727c214a", + "path": "{LeftHand}/grip", + "interactions": "", + "processors": "", + "groups": "", + "action": "grip", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "86a6d936-0c97-411d-81bd-f07526f0fd2d", + "path": "{LeftHand}/pointer", + "interactions": "", + "processors": "", + "groups": "", + "action": "selectPose", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "fc0059b7-df77-4d61-9aff-2ca9cd129ca0", + "path": "{LeftHand}/devicePose", + "interactions": "", + "processors": "", + "groups": "", + "action": "devicePose", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "RightHand", + "id": "052ff2d7-a697-4084-a818-72ef080c524d", + "actions": [ + { + "name": "select", + "type": "Value", + "id": "9939050e-1af5-43fd-815b-92041d19b3fa", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "grip", + "type": "Value", + "id": "de49cd41-9a9a-429c-9130-f794cb429550", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "selectPose", + "type": "Value", + "id": "60fe8382-aa5a-4fd9-80cf-6ecc68f90863", + "expectedControlType": "Pose", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "devicePose", + "type": "Value", + "id": "192485c2-2d24-495b-8deb-14f2e327a887", + "expectedControlType": "Pose", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "", + "id": "9ff68142-4e5e-4d24-aed3-a377c8b74534", + "path": "{RightHand}/select", + "interactions": "", + "processors": "", + "groups": "", + "action": "select", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "23ee2cda-2db6-4e45-b13a-259aabd637f1", + "path": "{RightHand}/grip", + "interactions": "", + "processors": "", + "groups": "", + "action": "grip", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "34315523-7e62-43c9-84fc-35cea4259fe5", + "path": "{RightHand}/pointer", + "interactions": "", + "processors": "", + "groups": "", + "action": "selectPose", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4070b955-5c40-46fa-98c5-4c71f99cb6c6", + "path": "{RightHand}/devicePose", + "interactions": "", + "processors": "", + "groups": "", + "action": "devicePose", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [] +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/HandInteractions.inputactions.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/HandInteractions.inputactions.meta new file mode 100644 index 0000000..5dca6bb --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/HandInteractions.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 080a38524d6ab064e91f8ff9cd45bb9b +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 0 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials.meta new file mode 100644 index 0000000..845c282 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1b77d0ecc04d7584bb867772441f7c25 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Blue.mat b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Blue.mat new file mode 100644 index 0000000..ca73695 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Blue.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Blue + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0, g: 0, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Blue.mat.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Blue.mat.meta new file mode 100644 index 0000000..251681d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Blue.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d3293c07c46938149bd6b68f6f5ab4d1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Default.mat b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Default.mat new file mode 100644 index 0000000..80f5803 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Default.mat @@ -0,0 +1,87 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Default + m_Shader: {fileID: 10760, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _ColorMask: 15 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _UVSec: 0 + - _UseUIAlphaClip: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.098039195, g: 0.50673795, b: 0.65882355, a: 0.3137255} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _Specular: {r: 1, g: 0.4481132, b: 0.4481132, a: 0} + m_BuildTextureStacks: [] diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Default.mat.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Default.mat.meta new file mode 100644 index 0000000..c070407 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Default.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9513f1085c3b8d84ab17245d74043608 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Green.mat b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Green.mat new file mode 100644 index 0000000..1f6e2c8 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Green.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Green + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0, g: 1, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Green.mat.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Green.mat.meta new file mode 100644 index 0000000..73fcc2e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Green.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: be5bedb9f42770549af7600305d316fd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Hand.mat b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Hand.mat new file mode 100644 index 0000000..9980048 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Hand.mat @@ -0,0 +1,86 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Hand + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _ColorMask: 15 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _UVSec: 0 + - _UseUIAlphaClip: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Hand.mat.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Hand.mat.meta new file mode 100644 index 0000000..8ea0303 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Hand.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4637b99291c9e1d4b82124a21a34acbc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandLeft_26.fbx b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandLeft_26.fbx new file mode 100644 index 0000000..0e512cb --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandLeft_26.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a750bba67e44cbc78952dcca6a27f13327271c218b7a6443f8bbbb766e83ebb +size 837624 diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandLeft_26.fbx.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandLeft_26.fbx.meta new file mode 100644 index 0000000..9fea867 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandLeft_26.fbx.meta @@ -0,0 +1,102 @@ +fileFormatVersion: 2 +guid: 9a01667fc6435cb479a0445610133fcc +ModelImporter: + serializedVersion: 21100 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandRight_26.fbx b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandRight_26.fbx new file mode 100644 index 0000000..3fb6509 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandRight_26.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc44cc74cb2dfd21a2459306d16d89aa474ada35c1054e949269c95fa13ff678 +size 837637 diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandRight_26.fbx.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandRight_26.fbx.meta new file mode 100644 index 0000000..2fae5b9 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/ObjModelHandRight_26.fbx.meta @@ -0,0 +1,102 @@ +fileFormatVersion: 2 +guid: afa96e79b5b79984ab74e9e1ef200d57 +ModelImporter: + serializedVersion: 21100 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Red.mat b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Red.mat new file mode 100644 index 0000000..f138423 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Red.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Red + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 0, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Red.mat.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Red.mat.meta new file mode 100644 index 0000000..84049c5 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/Red.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 130cd327cb69f5c4ab2bcdb608fbd58c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/White.mat b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/White.mat new file mode 100644 index 0000000..490513e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/White.mat @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: White + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/White.mat.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/White.mat.meta new file mode 100644 index 0000000..781a4d8 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Materials/White.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5daffd924f4d0494c83ce461ca913878 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Models.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Models.meta new file mode 100644 index 0000000..cec38cc --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Models.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9ae1b41407a2d734c96ed160efbc06d2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Models/Cone.fbx b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Models/Cone.fbx new file mode 100644 index 0000000..90c4ea0 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Models/Cone.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:561b7072082b95ffc890a66a3a1c5abd2f2876fa647239aca7931caecbaa1d40 +size 12860 diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Models/Cone.fbx.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Models/Cone.fbx.meta new file mode 100644 index 0000000..e6684e1 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Models/Cone.fbx.meta @@ -0,0 +1,101 @@ +fileFormatVersion: 2 +guid: fa14a214e9ffb1a42850851e0ad9db52 +ModelImporter: + serializedVersion: 20101 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 3 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 0 + importLights: 0 + fileIdsGeneration: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs.meta new file mode 100644 index 0000000..f1c88ef --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 061f4195e1dc74e4e8cf7f657203e2cd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/3DHand.prefab b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/3DHand.prefab new file mode 100644 index 0000000..7877a9b --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/3DHand.prefab @@ -0,0 +1,541 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &7423157989283898626 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7423157989283898627} + m_Layer: 0 + m_Name: 3DHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7423157989283898627 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7423157989283898626} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.015607998, y: -0.013282664, z: -0.07335153} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6957748758881164380} + - {fileID: 6957748757999106292} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &7423157989289999287 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 7423157989283898627} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_LocalPosition.x + value: 0.015607998 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_LocalPosition.y + value: 0.013282664 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07335153 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -1107956732406458091, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 9513f1085c3b8d84ab17245d74043608, type: 2} + - target: {fileID: 919132149155446097, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_Name + value: ObjModelHandLeft_26 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} +--- !u!4 &1023837832511550131 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -1643464455024064252, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1517851468531354918 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8220238113505965713, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1587043492754875532 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8143094687746776891, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1822319482427487084 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 9101342973431810267, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2129234081217865112 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8829542094526668335, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2402645123296224636 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5067591772060704459, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2591330329871673071 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4968064022332693848, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2877863616158530621 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4680475222046787466, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3886056980242657624 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -3248688629254337809, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3923137174990642617 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5869758926971069966, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4176209744140450023 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6841172885717877584, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4227981583638641158 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -2474565242041466447, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4315334464559039638 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6694459045059854113, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4518116779036985979 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6464857450473386444, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4655153904485345964 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -6368592266354454245, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5633725182928596562 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2966563632883308005, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5751558732041407126 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2942538225671237921, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5847509038455621992 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3900922814075712223, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6366441487635361211 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -4657146349703457268, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!1 &6673696290973803778 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 4294711893310725813, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6957748758881164380 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7007883643249497524 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8771503716632908285, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7113238653529847310 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 410696192037670329, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7125949936140118471 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 423390500807168624, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7402668014366828115 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -9097317933092135452, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!1 &7765669265330833126 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!114 &7423157989402685039 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7765669265330833126} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c19189c6a6028a74ab475048ebd154c8, type: 3} + m_Name: + m_EditorClassIdentifier: + nodes: + - {fileID: 5847509038455621992} + - {fileID: 1517851468531354918} + - {fileID: 4227981583638641158} + - {fileID: 2591330329871673071} + - {fileID: 7007883643249497524} + - {fileID: 2129234081217865112} + - {fileID: 9190276837785830995} + - {fileID: 4518116779036985979} + - {fileID: 8951308887720329310} + - {fileID: 7113238653529847310} + - {fileID: 7402668014366828115} + - {fileID: 4655153904485345964} + - {fileID: 7929466683079983724} + - {fileID: 4176209744140450023} + - {fileID: 5751558732041407126} + - {fileID: 1822319482427487084} + - {fileID: 6366441487635361211} + - {fileID: 2877863616158530621} + - {fileID: 3886056980242657624} + - {fileID: 1023837832511550131} + - {fileID: 4315334464559039638} + - {fileID: 3923137174990642617} + - {fileID: 7125949936140118471} + - {fileID: 5633725182928596562} + - {fileID: 2402645123296224636} + - {fileID: 1587043492754875532} + isLeft: 1 + allowUntrackedPose: 1 + Hand: {fileID: 6673696290973803778} + MotionType: 2147483647 +--- !u!4 &7929466683079983724 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8570555479703635493, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &8951308887720329310 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -7260599894360605719, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!4 &9190276837785830995 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -7453960083844481564, guid: 9a01667fc6435cb479a0445610133fcc, type: 3} + m_PrefabInstance: {fileID: 7423157989289999287} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &7423157990146891551 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 7423157989283898627} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_LocalPosition.x + value: 0.015607998 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_LocalPosition.y + value: 0.013282664 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_LocalPosition.z + value: 0.07335153 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_Name + value: ObjModelHandRight_26 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7227333814368855109, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 9513f1085c3b8d84ab17245d74043608, type: 2} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} +--- !u!4 &1023837833795835419 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -1643464455024064252, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1517851467915504014 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8220238113505965713, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1587043491765714980 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8143094687746776891, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1822319483682314180 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 9101342973431810267, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2129234081841414448 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8829542094526668335, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2402645124683137492 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5067591772060704459, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2591330330460226119 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4968064022332693848, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2877863616882874517 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4680475222046787466, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3886056978715186672 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -3248688629254337809, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3923137175738595601 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5869758926971069966, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4176209743526845519 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6841172885717877584, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4227981582215536302 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -2474565242041466447, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4315334463274852414 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6694459045059854113, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4518116778316803795 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6464857450473386444, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4655153903869513220 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -6368592266354454245, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!1 &5402561904108644855 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 3313976086554670824, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5633725184492227322 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2966563632883308005, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5751558732801289790 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2942538225671237921, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5847509039486725568 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3900922814075712223, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6366441486206486803 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -4657146349703457268, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6957748757999106292 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7007883642229584156 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8771503716632908285, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7113238654822912678 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 410696192037670329, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7125949935415725423 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 423390500807168624, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7402668015651537659 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -9097317933092135452, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!1 &7765669264174080590 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!114 &7423157990786583661 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7765669264174080590} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c19189c6a6028a74ab475048ebd154c8, type: 3} + m_Name: + m_EditorClassIdentifier: + nodes: + - {fileID: 5847509039486725568} + - {fileID: 1517851467915504014} + - {fileID: 4227981582215536302} + - {fileID: 2591330330460226119} + - {fileID: 7007883642229584156} + - {fileID: 2129234081841414448} + - {fileID: 9190276836226818811} + - {fileID: 4518116778316803795} + - {fileID: 8951308886156731638} + - {fileID: 7113238654822912678} + - {fileID: 7402668015651537659} + - {fileID: 4655153903869513220} + - {fileID: 7929466684471142084} + - {fileID: 4176209743526845519} + - {fileID: 5751558732801289790} + - {fileID: 1822319483682314180} + - {fileID: 6366441486206486803} + - {fileID: 2877863616882874517} + - {fileID: 3886056978715186672} + - {fileID: 1023837833795835419} + - {fileID: 4315334463274852414} + - {fileID: 3923137175738595601} + - {fileID: 7125949935415725423} + - {fileID: 5633725184492227322} + - {fileID: 2402645124683137492} + - {fileID: 1587043491765714980} + isLeft: 0 + allowUntrackedPose: 1 + Hand: {fileID: 5402561904108644855} + MotionType: 2147483647 +--- !u!4 &7929466684471142084 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8570555479703635493, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &8951308886156731638 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -7260599894360605719, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} +--- !u!4 &9190276836226818811 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -7453960083844481564, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3} + m_PrefabInstance: {fileID: 7423157990146891551} + m_PrefabAsset: {fileID: 0} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/3DHand.prefab.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/3DHand.prefab.meta new file mode 100644 index 0000000..d7384ba --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/3DHand.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9717c3a8fd1feb14a866c93d1d5cecc0 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/PoseMarker.prefab b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/PoseMarker.prefab new file mode 100644 index 0000000..bb3b28b --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/PoseMarker.prefab @@ -0,0 +1,665 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2910298151769479246 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8964967576903015174} + - component: {fileID: 8595007410106638205} + - component: {fileID: 3652344773145504640} + m_Layer: 0 + m_Name: Z-Positive + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8964967576903015174 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2910298151769479246} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.11} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4346727374823547005} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8595007410106638205 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2910298151769479246} + m_Mesh: {fileID: 3613567641014311022, guid: fa14a214e9ffb1a42850851e0ad9db52, type: 3} +--- !u!23 &3652344773145504640 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2910298151769479246} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d3293c07c46938149bd6b68f6f5ab4d1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &4346727372943234171 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4346727372943234170} + - component: {fileID: 4346727372943234167} + - component: {fileID: 4346727372943234164} + - component: {fileID: 4346727372943234165} + m_Layer: 0 + m_Name: XAxis + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4346727372943234170 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727372943234171} + m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.005, y: 0.1, z: 0.005} + m_Children: [] + m_Father: {fileID: 4346727374823547005} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!33 &4346727372943234167 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727372943234171} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4346727372943234164 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727372943234171} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 130cd327cb69f5c4ab2bcdb608fbd58c, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &4346727372943234165 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727372943234171} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!1 &4346727372952809594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4346727372952809589} + - component: {fileID: 4346727372952809590} + - component: {fileID: 4346727372952809591} + - component: {fileID: 4346727372952809588} + m_Layer: 0 + m_Name: YAxis + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4346727372952809589 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727372952809594} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.005, y: 0.1, z: 0.005} + m_Children: [] + m_Father: {fileID: 4346727374823547005} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &4346727372952809590 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727372952809594} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4346727372952809591 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727372952809594} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: be5bedb9f42770549af7600305d316fd, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &4346727372952809588 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727372952809594} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!1 &4346727373368105286 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4346727373368105281} + - component: {fileID: 4346727373368105282} + - component: {fileID: 4346727373368105283} + - component: {fileID: 4346727373368105280} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4346727373368105281 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727373368105286} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.02, y: 0.02, z: 0.02} + m_Children: [] + m_Father: {fileID: 4346727374823547005} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &4346727373368105282 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727373368105286} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4346727373368105283 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727373368105286} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &4346727373368105280 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727373368105286} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &4346727373925079743 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4346727373925079742} + - component: {fileID: 4346727373925079739} + - component: {fileID: 4346727373925079736} + - component: {fileID: 4346727373925079737} + m_Layer: 0 + m_Name: ZAxis + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4346727373925079742 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727373925079743} + m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.005, y: 0.1, z: 0.005} + m_Children: [] + m_Father: {fileID: 4346727374823547005} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &4346727373925079739 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727373925079743} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4346727373925079736 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727373925079743} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: d3293c07c46938149bd6b68f6f5ab4d1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &4346727373925079737 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727373925079743} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!1 &4346727374823546882 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4346727374823547005} + m_Layer: 0 + m_Name: PoseMarker + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4346727374823547005 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4346727374823546882} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4346727373368105281} + - {fileID: 4346727372943234170} + - {fileID: 4346727372952809589} + - {fileID: 4346727373925079742} + - {fileID: 602845843975818768} + - {fileID: 5641498033562402263} + - {fileID: 8964967576903015174} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4640940940180935358 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5641498033562402263} + - component: {fileID: 3201029004716767610} + - component: {fileID: 2164005335530074864} + m_Layer: 0 + m_Name: Y-Positive + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5641498033562402263 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4640940940180935358} + m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0.11, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4346727374823547005} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0} +--- !u!33 &3201029004716767610 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4640940940180935358} + m_Mesh: {fileID: 3613567641014311022, guid: fa14a214e9ffb1a42850851e0ad9db52, type: 3} +--- !u!23 &2164005335530074864 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4640940940180935358} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: be5bedb9f42770549af7600305d316fd, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &6813102403969732157 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 602845843975818768} + - component: {fileID: 6251018130860582685} + - component: {fileID: 227567837646502533} + m_Layer: 0 + m_Name: X-Positive + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &602845843975818768 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6813102403969732157} + m_LocalRotation: {x: -0.5, y: 0.5, z: -0.5, w: 0.5} + m_LocalPosition: {x: 0.11, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4346727374823547005} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 90, z: -90} +--- !u!33 &6251018130860582685 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6813102403969732157} + m_Mesh: {fileID: 3613567641014311022, guid: fa14a214e9ffb1a42850851e0ad9db52, type: 3} +--- !u!23 &227567837646502533 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6813102403969732157} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 130cd327cb69f5c4ab2bcdb608fbd58c, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/PoseMarker.prefab.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/PoseMarker.prefab.meta new file mode 100644 index 0000000..f1b2054 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/PoseMarker.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 71d5e99cf346f174db130c7585b6a3f8 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/SkeletonHand.prefab b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/SkeletonHand.prefab new file mode 100644 index 0000000..5a8ee85 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/SkeletonHand.prefab @@ -0,0 +1,135 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1139942279006104812 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1139942279006104815} + - component: {fileID: 1139942279006104814} + m_Layer: 0 + m_Name: left + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1139942279006104815 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139942279006104812} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1139942279644765727} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1139942279006104814 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139942279006104812} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8c57cc3ae07bcce42ba395c288cba794, type: 3} + m_Name: + m_EditorClassIdentifier: + isLeft: 1 + allowUntrackedPose: 1 + pointColor: {r: 0, g: 1, b: 0, a: 1} + linkColor: {r: 1, g: 1, b: 1, a: 1} + material: {fileID: 2100000, guid: 4637b99291c9e1d4b82124a21a34acbc, type: 2} + MotionType: 2 +--- !u!1 &1139942279644765724 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1139942279644765727} + m_Layer: 0 + m_Name: SkeletonHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &1139942279644765727 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139942279644765724} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.015607998, y: -0.013282664, z: -0.07335153} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1139942279006104815} + - {fileID: 1139942279895550675} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1139942279895550672 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1139942279895550675} + - component: {fileID: 1139942279895550674} + m_Layer: 0 + m_Name: right + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1139942279895550675 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139942279895550672} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1139942279644765727} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1139942279895550674 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1139942279895550672} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8c57cc3ae07bcce42ba395c288cba794, type: 3} + m_Name: + m_EditorClassIdentifier: + isLeft: 0 + allowUntrackedPose: 1 + pointColor: {r: 0, g: 1, b: 0, a: 1} + linkColor: {r: 1, g: 1, b: 1, a: 1} + material: {fileID: 2100000, guid: 4637b99291c9e1d4b82124a21a34acbc, type: 2} + MotionType: 2 diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/SkeletonHand.prefab.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/SkeletonHand.prefab.meta new file mode 100644 index 0000000..513c48a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Prefabs/SkeletonHand.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 26eb62328811e3b41bb1c5e4046cf8bc +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Readme.md b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Readme.md new file mode 100644 index 0000000..f0b9826 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Readme.md @@ -0,0 +1,26 @@ +# VIVE OpenXR Hand Tracking Unity Feature + +To help software developers create an application for locating hand joints with the OpenXR hand tracking extension [XR_EXT_hand_tracking](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_EXT_hand_tracking). + +## Load sample code +**Window** > **Package Manager** > **VIVE OpenXR Plugin - Windows** > **Samples** > Click to import **HandTracking Example** + +## Play the sample scene +1. **Edit** > **Project Settings** > **XR Plug-in Management** > Select **OpenXR** , click Exclamation mark next to it then choose **Fix All**. +2. **Edit** > **Project Settings** > **XR Plug-in Management** > **OpenXR** > Add Interaction profiles for your device. +3. **Edit** > **Project Settings** > **XR Plug-in Management** > **OpenXR** > Select **Hand Tracking** under **VIVE OpenXR** Feature Groups. +4. In the Unity Project window, select the sample scene file in **Assets** > **Samples** > **VIVE OpenXR Plugin - Windows** > **1.0.12** > **HandTracking Example** > **Scenes** > **HandTrackingScene.unity** then click Play. + +## Use VIVE OpenXR Hand Tracking Unity Feature to draw skeleton hand. +1. Import VIVE OpenXR Plugin - Windows +2. Add Hand gameobject to the Unity scene + - Refer to functions **StartFrameWork** and **StopFrameWork** in **HandManager.cs** for creating and releasing handle for hand. + - Refer to the function **GetJointLocation** in **HandManager.cs** for getting the information to locate hand joints. + - Drag "SkeletonHand" prefab into scene hierarchy or Create an empty object and attach **RenderHand.cs**. + +## Use VIVE OpenXR Hand Tracking Unity Feature to draw 3D hand. +1. Import VIVE OpenXR Plugin - Windows +2. Add Hand gameobject to the Unity scene + - Refer to functions **StartFrameWork** and **StopFrameWork** in **HandManager.cs** for creating and releasing handle for hand. + - Refer to the function **GetJointLocation** in **HandManager.cs** for getting the information to locate hand joints. + - Drag "3DHand" prefab into scene hierarchy or attach **RenderModel.cs** to "ObjModelHandLeft_26.fbx" and "ObjModelHandRight_26.fbx". \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Readme.md.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Readme.md.meta new file mode 100644 index 0000000..2d22189 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Readme.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8d56a6be4ede9fe40b2e62763d7a1b52 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scenes.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scenes.meta new file mode 100644 index 0000000..714ab0f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea6bc8c74d1f7f1479b372c0c13537ca +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scenes/HandTrackingScene.unity b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scenes/HandTrackingScene.unity new file mode 100644 index 0000000..1eb7af3 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scenes/HandTrackingScene.unity @@ -0,0 +1,2469 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 705507994} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1001 &85797200 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 538313238} + m_Modifications: + - target: {fileID: 4346727374823546882, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_Name + value: GripPose + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalScale.x + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalScale.y + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalScale.z + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} +--- !u!4 &85797201 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + m_PrefabInstance: {fileID: 85797200} + m_PrefabAsset: {fileID: 0} +--- !u!1 &85797202 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 4346727374823546882, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + m_PrefabInstance: {fileID: 85797200} + m_PrefabAsset: {fileID: 0} +--- !u!114 &85797203 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 85797202} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2fadf230d1919748a9aa21d40f74619, type: 3} + m_Name: + m_EditorClassIdentifier: + m_TrackingType: 0 + m_UpdateType: 0 + m_PositionInput: + m_UseReference: 0 + m_Action: + m_Name: Position Input + m_Type: 0 + m_ExpectedControlType: + m_Id: d4ba6290-8976-48ba-91e3-6478dcbddeb4 + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 1164e7c5-d92a-462e-9dfb-277ff2828814 + m_Path: {RightHand}/devicePose/position + m_Interactions: + m_Processors: + m_Groups: + m_Action: Position Input + m_Flags: 0 + m_Flags: 0 + m_Reference: {fileID: 0} + m_RotationInput: + m_UseReference: 0 + m_Action: + m_Name: Rotation Input + m_Type: 0 + m_ExpectedControlType: + m_Id: 6999f185-6caf-42d5-b1b3-edc90a71c791 + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 809a6315-72dd-4e99-a870-9c5b89251870 + m_Path: {RightHand}/devicePose/rotation + m_Interactions: + m_Processors: + m_Groups: + m_Action: Rotation Input + m_Flags: 0 + m_Flags: 0 + m_Reference: {fileID: 0} + m_PositionAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_RotationAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_HasMigratedActions: 1 +--- !u!1 &131124984 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 131124985} + - component: {fileID: 131124987} + - component: {fileID: 131124986} + m_Layer: 0 + m_Name: SqueezeVal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &131124985 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 131124984} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 9, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1502571526} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!102 &131124986 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 131124984} + m_Text: + m_OffsetZ: 30 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 0 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 0} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!23 &131124987 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 131124984} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &174275605 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 174275606} + - component: {fileID: 174275608} + - component: {fileID: 174275607} + m_Layer: 0 + m_Name: SelectVal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &174275606 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174275605} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -5, y: -1.5132828, z: -0.07335186} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1286465775} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &174275607 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174275605} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &174275608 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174275605} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 393fd0a40b85a9a4b981076df200a2f7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ActionReferenceTrigger: {fileID: -556233012627777057, guid: 080a38524d6ab064e91f8ff9cd45bb9b, type: 3} + pinchValue: {fileID: 1539795196} +--- !u!1 &262108936 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 262108937} + - component: {fileID: 262108939} + - component: {fileID: 262108938} + m_Layer: 0 + m_Name: RightSelect + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &262108937 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 262108936} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 15, y: -1.5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1845592526} + m_Father: {fileID: 353911962} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!102 &262108938 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 262108936} + m_Text: 'Right Select :' + m_OffsetZ: 30 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 0 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 0} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!23 &262108939 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 262108936} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &353911959 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 353911962} + - component: {fileID: 353911961} + - component: {fileID: 353911960} + - component: {fileID: 353911963} + m_Layer: 0 + m_Name: Message + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!102 &353911960 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 353911959} + m_Text: Press Space to switch 3D/Skeleton hand. + m_OffsetZ: 30 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 0 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 0} + m_Color: + serializedVersion: 2 + rgba: 4279842023 +--- !u!23 &353911961 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 353911959} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!4 &353911962 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 353911959} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -12, y: -1.0132827, z: 9.926648} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1636965490} + - {fileID: 262108937} + - {fileID: 1377649254} + - {fileID: 1502571526} + m_Father: {fileID: 963194228} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &353911963 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 353911959} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3e6db3fe75b0e5d48ba6decfa5d009fc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ActionAsset: {fileID: -944628639613478452, guid: 080a38524d6ab064e91f8ff9cd45bb9b, type: 3} +--- !u!1 &411490579 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411490580} + - component: {fileID: 411490582} + - component: {fileID: 411490581} + m_Layer: 0 + m_Name: SelectVal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &411490580 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411490579} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 8.5, y: -1.5132828, z: -0.07335186} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 538313238} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &411490581 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411490579} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &411490582 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411490579} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 393fd0a40b85a9a4b981076df200a2f7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ActionReferenceTrigger: {fileID: 4362351237192111166, guid: 080a38524d6ab064e91f8ff9cd45bb9b, type: 3} + pinchValue: {fileID: 1845592527} +--- !u!1 &538313237 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 538313238} + m_Layer: 0 + m_Name: Right + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &538313238 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 538313237} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1340468156} + - {fileID: 85797201} + - {fileID: 1829646212} + - {fileID: 411490580} + m_Father: {fileID: 2132622477} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &575697743 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 7423157989283898626, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + m_PrefabInstance: {fileID: 7423157989523861034} + m_PrefabAsset: {fileID: 0} +--- !u!1 &642988473 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 642988474} + - component: {fileID: 642988476} + - component: {fileID: 642988475} + m_Layer: 0 + m_Name: AimPose + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &642988474 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 642988473} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1286465775} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &642988475 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 642988473} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f20223b10be10d478250a03bb7ae27f, type: 3} + m_Name: + m_EditorClassIdentifier: + Line: {fileID: 642988473} + GazeRayRenderer: {fileID: 642988476} + m_ActionReferencePose: {fileID: -3621186198135720729, guid: 080a38524d6ab064e91f8ff9cd45bb9b, type: 3} +--- !u!120 &642988476 +LineRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 642988473} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Positions: + - {x: 0, y: 0, z: 0} + - {x: 0, y: 0, z: 4} + m_Parameters: + serializedVersion: 3 + widthMultiplier: 0.1 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0.033519745 + value: 0.056604385 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 0.23529413, g: 0.23529413, b: 0.23529413, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + numCornerVertices: 0 + numCapVertices: 0 + alignment: 0 + textureMode: 0 + shadowBias: 0 + generateLightingData: 0 + m_UseWorldSpace: 1 + m_Loop: 0 +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705507995} + - component: {fileID: 705507994} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 1 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &963194225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 963194228} + - component: {fileID: 963194227} + - component: {fileID: 963194226} + - component: {fileID: 963194229} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &963194226 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 +--- !u!20 &963194227 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &963194228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 353911962} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &963194229 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5a2a9c34df4095f47b9ca8f975175f5b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Device: 0 + m_PoseSource: 2 + m_PoseProviderComponent: {fileID: 0} + m_TrackingType: 0 + m_UpdateType: 0 + m_UseRelativeTransform: 0 +--- !u!1001 &964975220 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1286465775} + m_Modifications: + - target: {fileID: 4346727374823546882, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_Name + value: GripPose + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalScale.x + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalScale.y + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalScale.z + value: 0.2 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} +--- !u!4 &964975221 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4346727374823547005, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + m_PrefabInstance: {fileID: 964975220} + m_PrefabAsset: {fileID: 0} +--- !u!1 &964975222 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 4346727374823546882, guid: 71d5e99cf346f174db130c7585b6a3f8, type: 3} + m_PrefabInstance: {fileID: 964975220} + m_PrefabAsset: {fileID: 0} +--- !u!114 &964975223 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 964975222} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2fadf230d1919748a9aa21d40f74619, type: 3} + m_Name: + m_EditorClassIdentifier: + m_TrackingType: 0 + m_UpdateType: 0 + m_PositionInput: + m_UseReference: 0 + m_Action: + m_Name: Position Input + m_Type: 0 + m_ExpectedControlType: + m_Id: 8d7bb445-ceec-4022-ab92-4d79ca90cc18 + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 491201d0-b6b9-4ee5-8648-ff4e72c07cb7 + m_Path: {LeftHand}/devicePose/position + m_Interactions: + m_Processors: + m_Groups: + m_Action: Position Input + m_Flags: 0 + m_Flags: 0 + m_Reference: {fileID: 0} + m_RotationInput: + m_UseReference: 0 + m_Action: + m_Name: Rotation Input + m_Type: 0 + m_ExpectedControlType: + m_Id: 378f0e0e-6a9c-4769-afb6-714eec375da4 + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: ad40f952-2d15-455f-b701-2175997c1680 + m_Path: {LeftHand}/devicePose/rotation + m_Interactions: + m_Processors: + m_Groups: + m_Action: Rotation Input + m_Flags: 0 + m_Flags: 0 + m_Reference: {fileID: 0} + m_PositionAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_RotationAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_HasMigratedActions: 1 +--- !u!1 &1013272644 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 1139942279644765724, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + m_PrefabInstance: {fileID: 1139942280017852737} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1174834769 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1174834770} + - component: {fileID: 1174834772} + - component: {fileID: 1174834771} + m_Layer: 0 + m_Name: SqueezeVal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1174834770 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1174834769} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -5, y: -3.213283, z: -0.07335186} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1286465775} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1174834771 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1174834769} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &1174834772 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1174834769} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 393fd0a40b85a9a4b981076df200a2f7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ActionReferenceTrigger: {fileID: 4375789157635192129, guid: 080a38524d6ab064e91f8ff9cd45bb9b, type: 3} + pinchValue: {fileID: 1290197106} +--- !u!1 &1286465774 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1286465775} + m_Layer: 0 + m_Name: Left + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1286465775 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1286465774} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1174834770} + - {fileID: 964975221} + - {fileID: 642988474} + - {fileID: 174275606} + m_Father: {fileID: 2132622477} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1290197104 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1290197105} + - component: {fileID: 1290197107} + - component: {fileID: 1290197106} + m_Layer: 0 + m_Name: SqueezeVal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1290197105 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1290197104} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 9, y: -0.00000011920929, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1377649254} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!102 &1290197106 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1290197104} + m_Text: + m_OffsetZ: 30 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 0 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 0} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!23 &1290197107 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1290197104} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1340468155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1340468156} + - component: {fileID: 1340468158} + - component: {fileID: 1340468157} + m_Layer: 0 + m_Name: SqueezeVal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1340468156 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1340468155} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 8.5, y: -3.2132826, z: -0.07335186} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 538313238} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!23 &1340468157 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1340468155} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &1340468158 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1340468155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 393fd0a40b85a9a4b981076df200a2f7, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ActionReferenceTrigger: {fileID: 405682012955777798, guid: 080a38524d6ab064e91f8ff9cd45bb9b, type: 3} + pinchValue: {fileID: 131124986} +--- !u!1 &1377649253 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1377649254} + - component: {fileID: 1377649256} + - component: {fileID: 1377649255} + m_Layer: 0 + m_Name: LeftSqueeze + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1377649254 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377649253} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -3.2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1290197105} + m_Father: {fileID: 353911962} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!102 &1377649255 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377649253} + m_Text: 'Left Squeeze :' + m_OffsetZ: 30 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 0 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 0} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!23 &1377649256 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377649253} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1502571525 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1502571526} + - component: {fileID: 1502571528} + - component: {fileID: 1502571527} + m_Layer: 0 + m_Name: RightSqueeze + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1502571526 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1502571525} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 15, y: -3.2, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 131124985} + m_Father: {fileID: 353911962} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!102 &1502571527 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1502571525} + m_Text: 'Right Squeeze:' + m_OffsetZ: 30 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 0 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 0} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!23 &1502571528 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1502571525} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1539795193 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1539795194} + - component: {fileID: 1539795197} + - component: {fileID: 1539795196} + m_Layer: 0 + m_Name: SelectVal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1539795194 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1539795193} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 9, y: -0.00000011920929, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1636965490} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!102 &1539795196 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1539795193} + m_Text: + m_OffsetZ: 30 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 0 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 0} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!23 &1539795197 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1539795193} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1636965489 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1636965490} + - component: {fileID: 1636965492} + - component: {fileID: 1636965491} + m_Layer: 0 + m_Name: LeftSelect + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1636965490 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1636965489} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -1.5, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1539795194} + m_Father: {fileID: 353911962} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!102 &1636965491 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1636965489} + m_Text: 'Left Select :' + m_OffsetZ: 30 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 0 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 0} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!23 &1636965492 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1636965489} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1829646210 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1829646212} + - component: {fileID: 1829646211} + - component: {fileID: 1829646213} + m_Layer: 0 + m_Name: AimPose + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!120 &1829646211 +LineRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829646210} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Positions: + - {x: 0, y: 0, z: 0} + - {x: 0, y: 0, z: 4} + m_Parameters: + serializedVersion: 3 + widthMultiplier: 0.1 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0.033519745 + value: 0.056604385 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 0.23529413, g: 0.23529413, b: 0.23529413, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + numCornerVertices: 0 + numCapVertices: 0 + alignment: 0 + textureMode: 0 + shadowBias: 0 + generateLightingData: 0 + m_UseWorldSpace: 1 + m_Loop: 0 +--- !u!4 &1829646212 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829646210} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 538313238} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1829646213 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1829646210} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1f20223b10be10d478250a03bb7ae27f, type: 3} + m_Name: + m_EditorClassIdentifier: + Line: {fileID: 1829646210} + GazeRayRenderer: {fileID: 1829646211} + m_ActionReferencePose: {fileID: 5176057270050798957, guid: 080a38524d6ab064e91f8ff9cd45bb9b, type: 3} +--- !u!1 &1845592525 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1845592526} + - component: {fileID: 1845592528} + - component: {fileID: 1845592527} + m_Layer: 0 + m_Name: SelectVal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1845592526 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845592525} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 9, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 262108937} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!102 &1845592527 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845592525} + m_Text: + m_OffsetZ: 30 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 0 + m_Alignment: 0 + m_TabSize: 4 + m_FontSize: 0 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 0} + m_Color: + serializedVersion: 2 + rgba: 4294967295 +--- !u!23 &1845592528 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1845592525} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1869704026 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1869704028} + - component: {fileID: 1869704027} + m_Layer: 0 + m_Name: SwitchHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1869704027 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1869704026} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2642121393e03fd46ba257307ca9cb51, type: 3} + m_Name: + m_EditorClassIdentifier: + hand3D: {fileID: 575697743} + handSkeleton: {fileID: 1013272644} +--- !u!4 &1869704028 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1869704026} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -0.015609741, y: -0.013282776, z: -0.07335153} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2132622476 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2132622477} + m_Layer: 0 + m_Name: HandInteraction + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2132622477 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2132622476} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1286465775} + - {fileID: 538313238} + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1139942280017852737 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 1139942279644765724, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_Name + value: SkeletonHand + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 1139942279644765727, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 26eb62328811e3b41bb1c5e4046cf8bc, type: 3} +--- !u!1001 &7423157989523861034 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 6957748757999106292, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6957748757999106292, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6957748757999106292, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6957748758881164380, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6957748758881164380, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6957748758881164380, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898626, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_Name + value: 3DHand + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_RootOrder + value: 4 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7423157989283898627, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 9717c3a8fd1feb14a866c93d1d5cecc0, type: 3} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scenes/HandTrackingScene.unity.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scenes/HandTrackingScene.unity.meta new file mode 100644 index 0000000..4549231 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scenes/HandTrackingScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8d77374400df33e4396eb7e610d731d7 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts.meta new file mode 100644 index 0000000..754c520 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 686c57b9d62a14c47b8353ea34d46bb3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ActionAssetEnabler.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ActionAssetEnabler.cs new file mode 100644 index 0000000..65837d5 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ActionAssetEnabler.cs @@ -0,0 +1,24 @@ +using UnityEngine.InputSystem; + +namespace UnityEngine.XR.OpenXR.Samples.ControllerSample +{ + public class ActionAssetEnabler : MonoBehaviour + { + [SerializeField] + InputActionAsset m_ActionAsset; + public InputActionAsset actionAsset + { + get => m_ActionAsset; + set => m_ActionAsset = value; + } + + private void OnEnable() + { + if(m_ActionAsset != null) + { + m_ActionAsset.Enable(); + } + } + + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ActionAssetEnabler.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ActionAssetEnabler.cs.meta new file mode 100644 index 0000000..2240030 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ActionAssetEnabler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3e6db3fe75b0e5d48ba6decfa5d009fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/Controller.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/Controller.cs new file mode 100644 index 0000000..af15bef --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/Controller.cs @@ -0,0 +1,83 @@ +using System; +using UnityEngine.InputSystem; +using UnityEngine.UI; +using UnityEngine; + +public class Controller : MonoBehaviour +{ + [SerializeField] + private InputActionReference m_ActionReferenceTrigger; + public InputActionReference actionReferenceTrigger { get => m_ActionReferenceTrigger ; set => m_ActionReferenceTrigger=value; } + + public TextMesh pinchValue; + //[SerializeField] + //private InputActionReference m_ActionReferenceGrip; + //public InputActionReference actionReferenceGrip { get => m_ActionReferenceGrip ; set => m_ActionReferenceGrip=value; } + + Type lastActiveType_Trigger = null; + + // Update is called once per frame + void Update() + { + pinchValue.text = "0"; + if ( actionReferenceTrigger != null && actionReferenceTrigger.action != null + && actionReferenceTrigger.action.enabled && actionReferenceTrigger.action.controls.Count > 0 + /*&& actionReferenceGrip != null && actionReferenceGrip.action != null + && actionReferenceGrip.action.enabled && actionReferenceGrip.action.controls.Count > 0*/) + { + // Grip + //Type typeToUse_Grip = null; + //if(actionReferenceGrip.action.activeControl != null) + //{ + // typeToUse_Grip = actionReferenceGrip.action.activeControl.valueType; + //} + //else + //{ + // typeToUse_Grip = lastActiveType_Grip; + //} + + //if(typeToUse_Grip == typeof(float)) + //{ + // lastActiveType_Grip = typeof(float); + // float value = actionReferenceGrip.action.ReadValue(); + // if(value > 0.5) + // { + // if(!isSwitchedMeshPrefab) + // { + // isSwitchedMeshPrefab = true; + // Debug.Log("Press Button B."); + // //if(MeshSubSystem != null) + // //{ + // // MeshSubSystem.GetComponent().SwitchMeshPrefab(); + // //} + // } + // } + // else + // { + // isSwitchedMeshPrefab = false; + // } + //} + + // Trigger + Type typeToUse_Trigger = null; + if(actionReferenceTrigger.action.activeControl != null) + { + typeToUse_Trigger = actionReferenceTrigger.action.activeControl.valueType; + } + else + { + typeToUse_Trigger = lastActiveType_Trigger; + } + + if(typeToUse_Trigger == typeof(float)) + { + lastActiveType_Trigger = typeof(float); + float value = actionReferenceTrigger.action.ReadValue(); + pinchValue.text = value.ToString(); + + } + + } + } + +} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/Controller.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/Controller.cs.meta new file mode 100644 index 0000000..dc685cb --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/Controller.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 393fd0a40b85a9a4b981076df200a2f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/FrameWork.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/FrameWork.cs new file mode 100644 index 0000000..7a40781 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/FrameWork.cs @@ -0,0 +1,290 @@ +using System; +using UnityEngine; +using UnityEngine.XR.OpenXR; +using VIVE.HandTracking; +[Obsolete("Use HandManager instead")] +public static class FrameWork +{ + private class HandData + { + public bool isStarted; + public XrHandEXT hand; + public ulong trackerHandle; + public bool isActive; + public int jointUpdatedFrame = -1; + public XrHandJointLocationEXT[] joints = new XrHandJointLocationEXT[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT]; + public XrHandJointVelocityEXT[] velocities = new XrHandJointVelocityEXT[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT]; + + public bool isCreated { get { return trackerHandle != default; } } + + public void ClearJoints() + { + Array.Clear(joints, 0, joints.Length); + Array.Clear(velocities, 0, velocities.Length); + } + } + + private static HandTracking_OpenXR_API feature; + private static bool isInitialized; + private static bool isSystemSupported; + private static ulong refSpace; + private static HandData leftHandData = new HandData() { hand = XrHandEXT.XR_HAND_LEFT_EXT }; + private static HandData rightHandData = new HandData() { hand = XrHandEXT.XR_HAND_RIGHT_EXT }; + + private static bool isRefSpaceCreated { get { return refSpace != default; } } + + private static HandData GetHandData(bool isLeft) + { + return isLeft ? leftHandData : rightHandData; + } + + public static bool Initialize() + { + if (!isInitialized) + { + if (feature == null) + { + feature = OpenXRSettings.Instance.GetFeature(); + + if (feature != null) + { + // FIXME: Assume featuer instance won't be destroied and created to a new one + feature.onSessionCreate += OnFeatureSessionCreate; + feature.onSessionDestroy += OnFeatureSessionDestroy; + feature.onSystemChange += OnFeatureSystemChange; + } + } + + if (feature != null && feature.IsEnabledAndInitialized) + { + UpdateSystemSupported(); + isInitialized = true; + } + } + + return isInitialized; + } + + private static void OnFeatureSessionCreate(ulong xrSession) + { + TryCreateHandTracker(leftHandData); + TryCreateHandTracker(rightHandData); + } + + private static void OnFeatureSessionDestroy(ulong xrSession) + { + DestroyHandTracker(leftHandData); + DestroyHandTracker(rightHandData); + DestroyRefSpace(); + } + + private static void OnFeatureSystemChange(ulong systemId) + { + UpdateSystemSupported(); + } + + private static void UpdateSystemSupported() + { + if (feature == null || !feature.IsEnabledAndInitialized) + { + isSystemSupported = false; + } + else + { + isSystemSupported = feature.SystemSupportsHandTracking(out var result); + + if (!isSystemSupported) + { + if (result != XrResult.XR_SUCCESS) + { + Debug.LogWarning("Fail SystemSupportsHandTracking: " + result); + } + else + { + Debug.LogWarning("Hand tracking not supported by the system"); + } + } + } + } + + private static bool TryCreateHandTracker(HandData handData) + { + if (!handData.isStarted) { return false; } + if (!Initialize()) { return false; } + if (!isSystemSupported) { return false; } + if (!feature.IsSessionCreated) { return false; } + + if (!handData.isCreated) + { + if (!feature.TryCreateHandTracker(handData.hand, out handData.trackerHandle, out var result)) + { + handData.trackerHandle = default; + Debug.LogWarning("Fail CreateHandTracker: " + result); + } + } + + return handData.isCreated; + } + + private static void DestroyHandTracker(HandData handData) + { + if (!handData.isCreated) { return; } + if (!Initialize()) { return; } + + feature.TryDestroyHandTracker(handData.trackerHandle, out _); + handData.trackerHandle = default; + handData.ClearJoints(); + } + + private static bool InitializeRefSpace() + { + if (!Initialize()) { return false; } + if (!isSystemSupported) { return false; } + if (!feature.IsSessionCreated) { return false; } + + if (!isRefSpaceCreated) + { + const XrReferenceSpaceType preferSpaceType = XrReferenceSpaceType.XR_REFERENCE_SPACE_TYPE_STAGE; + XrReferenceSpaceType spaceType; + if (!feature.TryGetSupportedReferenceSpaceType(preferSpaceType, out spaceType, out var result)) + { + Debug.LogWarning("Fail GetSupportedReferenceSpaceType: " + result); + } + else + { + if (!feature.TryCreateReferenceSpace( + spaceType, + new XrVector3f(0f, 0f, 0f), + new XrQuaternionf(0f, 0f, 0f, 1f), + out refSpace, + out result)) + { + refSpace = default; + Debug.LogWarning("Fail CreateReferenceSpace: " + result); + } + } + } + + return isRefSpaceCreated; + } + + private static void DestroyRefSpace() + { + if (!isRefSpaceCreated) { return; } + + if (Initialize()) + { + if (!feature.TryDestroyReferenceSpace(refSpace, out var result)) + { + Debug.LogWarning("Fail DestroyReferenceSpace: " + result); + } + } + + refSpace = default; + } + + public static void StartFrameWork(bool isLeft) + { + var handData = GetHandData(isLeft); + handData.isStarted = true; + + TryCreateHandTracker(handData); + } + + public static void StopFrameWork(bool isLeft) + { + var handData = GetHandData(isLeft); + handData.isStarted = false; + + DestroyHandTracker(handData); + } + + public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints, bool forceUpdate = false) + { + var handData = GetHandData(isleft); + if (handData.isCreated) + { + if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount) + { + handData.jointUpdatedFrame = Time.frameCount; + + if (InitializeRefSpace()) + { + if (!feature.TryLocateHandJoints( + handData.trackerHandle, + refSpace, + out handData.isActive, + handData.joints, + out var result)) + { + handData.isActive = false; + Debug.LogWarning("Fail LocateHandJoints: " + result); + } + } + } + } + + joints = handData.joints; + return handData.isActive; + } + + public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints,ref XrHandJointsMotionRangeEXT type, bool forceUpdate = false) + { + var handData = GetHandData(isleft); + if (handData.isCreated) + { + if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount) + { + handData.jointUpdatedFrame = Time.frameCount; + + if (InitializeRefSpace()) + { + if (!feature.TryLocateHandJoints( + handData.trackerHandle, + refSpace, + ref type, + out handData.isActive, + handData.joints, + out var result)) + { + handData.isActive = false; + Debug.LogWarning("Fail LocateHandJoints: " + result); + } + } + } + } + joints = handData.joints; + return handData.isActive; + } + + public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints, out XrHandJointVelocityEXT[] velocities, bool forceUpdate = false) + { + var handData = GetHandData(isleft); + if (handData.isCreated) + { + if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount) + { + handData.jointUpdatedFrame = Time.frameCount; + + if (InitializeRefSpace()) + { + if (!feature.TryLocateHandJoints( + handData.trackerHandle, + refSpace, + out handData.isActive, + handData.joints, + handData.velocities, + out var result)) + { + handData.isActive = false; + Debug.LogWarning("Fail LocateHandJoints: " + result); + } + } + } + } + + joints = handData.joints; + velocities = handData.velocities; + return handData.isActive; + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/FrameWork.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/FrameWork.cs.meta new file mode 100644 index 0000000..82c041f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/FrameWork.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89e4cae3bc180f14c906224f93d20210 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.cs new file mode 100644 index 0000000..730dc48 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.cs @@ -0,0 +1,152 @@ +//------------------------------------------------------------------------------ +// +// This code was auto-generated by com.unity.inputsystem:InputActionCodeGenerator +// version 1.4.1 +// from Assets/Samples/VIVE OpenXR Plugin - Windows/1.0.12/HandTracking Example/Scripts/InputMaster.inputactions +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine.InputSystem; +using UnityEngine.InputSystem.Utilities; + +public partial class @InputMaster : IInputActionCollection2, IDisposable +{ + public InputActionAsset asset { get; } + public @InputMaster() + { + asset = InputActionAsset.FromJson(@"{ + ""name"": ""InputMaster"", + ""maps"": [ + { + ""name"": ""Keyboard"", + ""id"": ""94ee31f8-c9ac-4138-b5b9-ad5ecec1870d"", + ""actions"": [ + { + ""name"": ""SpacePress"", + ""type"": ""Button"", + ""id"": ""2a246a3d-969f-4d95-8e12-9e0000e5b19c"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false + } + ], + ""bindings"": [ + { + ""name"": """", + ""id"": ""d6ea233e-905c-4913-a644-8a84098fea9f"", + ""path"": ""/space"", + ""interactions"": """", + ""processors"": """", + ""groups"": """", + ""action"": ""SpacePress"", + ""isComposite"": false, + ""isPartOfComposite"": false + } + ] + } + ], + ""controlSchemes"": [] +}"); + // Keyboard + m_Keyboard = asset.FindActionMap("Keyboard", throwIfNotFound: true); + m_Keyboard_SpacePress = m_Keyboard.FindAction("SpacePress", throwIfNotFound: true); + } + + public void Dispose() + { + UnityEngine.Object.Destroy(asset); + } + + public InputBinding? bindingMask + { + get => asset.bindingMask; + set => asset.bindingMask = value; + } + + public ReadOnlyArray? devices + { + get => asset.devices; + set => asset.devices = value; + } + + public ReadOnlyArray controlSchemes => asset.controlSchemes; + + public bool Contains(InputAction action) + { + return asset.Contains(action); + } + + public IEnumerator GetEnumerator() + { + return asset.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Enable() + { + asset.Enable(); + } + + public void Disable() + { + asset.Disable(); + } + public IEnumerable bindings => asset.bindings; + + public InputAction FindAction(string actionNameOrId, bool throwIfNotFound = false) + { + return asset.FindAction(actionNameOrId, throwIfNotFound); + } + public int FindBinding(InputBinding bindingMask, out InputAction action) + { + return asset.FindBinding(bindingMask, out action); + } + + // Keyboard + private readonly InputActionMap m_Keyboard; + private IKeyboardActions m_KeyboardActionsCallbackInterface; + private readonly InputAction m_Keyboard_SpacePress; + public struct KeyboardActions + { + private @InputMaster m_Wrapper; + public KeyboardActions(@InputMaster wrapper) { m_Wrapper = wrapper; } + public InputAction @SpacePress => m_Wrapper.m_Keyboard_SpacePress; + public InputActionMap Get() { return m_Wrapper.m_Keyboard; } + public void Enable() { Get().Enable(); } + public void Disable() { Get().Disable(); } + public bool enabled => Get().enabled; + public static implicit operator InputActionMap(KeyboardActions set) { return set.Get(); } + public void SetCallbacks(IKeyboardActions instance) + { + if (m_Wrapper.m_KeyboardActionsCallbackInterface != null) + { + @SpacePress.started -= m_Wrapper.m_KeyboardActionsCallbackInterface.OnSpacePress; + @SpacePress.performed -= m_Wrapper.m_KeyboardActionsCallbackInterface.OnSpacePress; + @SpacePress.canceled -= m_Wrapper.m_KeyboardActionsCallbackInterface.OnSpacePress; + } + m_Wrapper.m_KeyboardActionsCallbackInterface = instance; + if (instance != null) + { + @SpacePress.started += instance.OnSpacePress; + @SpacePress.performed += instance.OnSpacePress; + @SpacePress.canceled += instance.OnSpacePress; + } + } + } + public KeyboardActions @Keyboard => new KeyboardActions(this); + public interface IKeyboardActions + { + void OnSpacePress(InputAction.CallbackContext context); + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.cs.meta new file mode 100644 index 0000000..79ca399 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 00c2bfc723925654087046942f18ab09 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.inputactions b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.inputactions new file mode 100644 index 0000000..6647aa9 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.inputactions @@ -0,0 +1,34 @@ +{ + "name": "InputMaster", + "maps": [ + { + "name": "Keyboard", + "id": "94ee31f8-c9ac-4138-b5b9-ad5ecec1870d", + "actions": [ + { + "name": "SpacePress", + "type": "Button", + "id": "2a246a3d-969f-4d95-8e12-9e0000e5b19c", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "d6ea233e-905c-4913-a644-8a84098fea9f", + "path": "/space", + "interactions": "", + "processors": "", + "groups": "", + "action": "SpacePress", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [] +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.inputactions.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.inputactions.meta new file mode 100644 index 0000000..09a31e6 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/InputMaster.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: d8c42cba5f401b94db94490595c0f4df +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 1 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/LineRender.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/LineRender.cs new file mode 100644 index 0000000..e2c5d21 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/LineRender.cs @@ -0,0 +1,39 @@ +using System; +using UnityEngine.InputSystem; +using UnityEngine.UI; +using UnityEngine; + + +public class LineRender : MonoBehaviour +{ + [Tooltip("Root object of Line mesh")] + public GameObject Line = null; + [SerializeField] private LineRenderer GazeRayRenderer; + + [SerializeField] + private InputActionReference m_ActionReferencePose; + public InputActionReference actionReferencePose { get => m_ActionReferencePose; set => m_ActionReferencePose = value; } + + // Update is called once per frame + void Update() + { + Vector3 DirectionCombinedLocal; + if (actionReferencePose != null && actionReferencePose.action != null + && actionReferencePose.action.enabled && actionReferencePose.action.controls.Count > 0) + { + //GazeRayRenderer.SetActive(true); + UnityEngine.XR.OpenXR.Input.Pose poseval = actionReferencePose.action.ReadValue(); + Quaternion gazeRotation = poseval.rotation; + Quaternion orientation = new Quaternion( + 1 * (gazeRotation.x), + 1 * (gazeRotation.y), + 1 * gazeRotation.z, + 1 * gazeRotation.w); + DirectionCombinedLocal = orientation * Vector3.forward; + Vector3 DirectionCombined = Camera.main.transform.TransformDirection(DirectionCombinedLocal); + GazeRayRenderer.SetPosition(0, poseval.position); + GazeRayRenderer.SetPosition(1, poseval.position + DirectionCombinedLocal * 4); + } + } + +} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/LineRender.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/LineRender.cs.meta new file mode 100644 index 0000000..c231308 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/LineRender.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1f20223b10be10d478250a03bb7ae27f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ReadOnlyDrawer.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ReadOnlyDrawer.cs new file mode 100644 index 0000000..27c76b0 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ReadOnlyDrawer.cs @@ -0,0 +1,28 @@ +using UnityEditor; +using UnityEngine; + +namespace VIVE.HandTracking.Sample +{ + public class ReadOnlyAttribute : PropertyAttribute + { + + } + +#if UNITY_EDITOR + [CustomPropertyDrawer(typeof(ReadOnlyAttribute))] + public class ReadOnlyDrawer : PropertyDrawer + { + public override float GetPropertyHeight(SerializedProperty property, GUIContent label) + { + return EditorGUI.GetPropertyHeight(property, label, true); + } + + public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) + { + GUI.enabled = false; + EditorGUI.PropertyField(position, property, label, true); + GUI.enabled = true; + } + } +#endif +} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ReadOnlyDrawer.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ReadOnlyDrawer.cs.meta new file mode 100644 index 0000000..17ddb84 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/ReadOnlyDrawer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a85838490cd239847a9f06ea17789601 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderHand.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderHand.cs new file mode 100644 index 0000000..985f920 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderHand.cs @@ -0,0 +1,190 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using VIVE.HandTracking; + +namespace VIVE.HandTracking.Sample +{ + public class RenderHand : MonoBehaviour + { + // Links between keypoints, 2*i & 2*i+1 forms a link. + // keypoint index: 1: palm, 2-5: thumb, 6-10: index, 11-15: middle, 16-20: ring, 21-25: pinky + // fingers are counted from bottom to top + private static int[] Connections = new int[] { + 1, 2, 1, 6, 1, 11, 1, 16, 1, 21, // palm and finger starts + 2, 6, 6, 11, 11, 16, 16, 21, // finger starts + 2, 3, 3, 4, 4, 5, // thumb + 6, 7, 7, 8, 8, 9, 9, 10, // index + 11, 12, 12, 13, 13, 14, 14, 15, // middle + 16, 17, 17, 18, 18, 19, 19, 20, // ring + 21, 22, 22, 23, 23, 24, 24, 25 // pinky + }; + [Tooltip("Draw left hand if true, right hand otherwise")] + public bool isLeft = false; + [Tooltip("Use inferred or last-known posed when hand loses tracking if true.")] + public bool allowUntrackedPose = false; + [Tooltip("Default color of hand points")] + public Color pointColor = Color.green; + [Tooltip("Default color of links between keypoints in skeleton mode")] + public Color linkColor = Color.white; + [Tooltip("Material for hand points and links")] + [SerializeField] + private Material material = null; + private XrHandJointsMotionRangeEXT MotionType = XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_MAX_ENUM_EXT; + [Tooltip("Type of hand joints range of motion")] + [ReadOnly] public string HandJointsMotionRange; + + private List points = new List(); + // list of links created (only for skeleton) + private List links = new List(); + // Start is called before the first frame update + private XrHandJointLocationEXT[] HandjointLocations = new + XrHandJointLocationEXT[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT]; + // shared material for all point objects + private Material pointMat = null; + // shared material for all link objects + private Material linkMat = null; + private void Start() + { + HandManager.StartFrameWork(isLeft); + pointMat = new Material(material); + if (isLeft) + { + pointColor = Color.blue; + } + else + { + pointColor = Color.red; + } + pointMat.color = pointColor; + linkMat = new Material(material); + linkMat.color = linkColor; + + for (int i = 0; i < (int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT; i++) + { + var go = GameObject.CreatePrimitive(PrimitiveType.Sphere); + go.name = ((XrHandJointEXT)i).ToString(); + go.transform.parent = transform; + go.transform.localScale = Vector3.one * 0.012f; + go.SetActive(false); + points.Add(go); + go.transform.position = new Vector3((float)i * 0.1f, 0, 0); + // handle layer + go.layer = gameObject.layer; + // handle material + go.GetComponent().sharedMaterial = pointMat; + } + + // create game objects for links between keypoints, only used in skeleton mode + for (int i = 0; i < Connections.Length; i += 2) + { + var go = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + go.name = "link" + i; + go.transform.parent = transform; + go.transform.localScale = Vector3.one * 0.005f; + go.SetActive(false); + links.Add(go); + // handle layer + go.layer = gameObject.layer; + // handle material + go.GetComponent().sharedMaterial = linkMat; + } + } + // Update is called once per frame + private void Update() + { + if (HandManager.GetJointLocation(isLeft, out HandjointLocations, ref MotionType)) + { + UpdateJointLocation(); + switch (MotionType) + { + case XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT: + HandJointsMotionRange = "UNOBSTRUCTED"; + break; + case XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT: + HandJointsMotionRange = "CONTROLLER"; + break; + default: + HandJointsMotionRange = ""; + break; + } + } + else + { + for (int i = 0; i < points.Count; i++) + { + var go = points[i]; + go.SetActive(false); + } + + for (int i = 0; i < links.Count; i++) + { + var link = links[i]; + link.SetActive(false); + } + } + } + + private void UpdateJointLocation() + { + for (int i = 0; i < points.Count; i++) + { + var go = points[i]; + XrQuaternionf orientation; + XrVector3f position; + float radius = HandjointLocations[i].radius; + if (allowUntrackedPose) //Use inferred or last-known pose when lost tracking + { + orientation = HandjointLocations[i].pose.orientation; + position = HandjointLocations[i].pose.position; + go.transform.localPosition = new Vector3(position.x, position.y, -position.z); + go.SetActive(true); + } + else + { + if ((HandjointLocations[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT) != 0) + { + orientation = HandjointLocations[i].pose.orientation; + } + if ((HandjointLocations[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_POSITION_TRACKED_BIT) != 0) + { + position = HandjointLocations[i].pose.position; + go.transform.localPosition = new Vector3(position.x, position.y, -position.z); + go.SetActive(true); + } + else + { + UnityEngine.Debug.Log("Lost tracking"); + go.SetActive(false); + } + } + } + + for (int i = 0; i < links.Count; i++) + { + var link = links[i]; + var pose1 = points[Connections[i * 2]].transform.position; + var pose2 = points[Connections[i * 2 + 1]].transform.position; + + // calculate link position and rotation based on points on both end + link.SetActive(true); + link.transform.position = (pose1 + pose2) / 2; + var direction = pose2 - pose1; + link.transform.rotation = Quaternion.FromToRotation(Vector3.up, direction); + link.transform.localScale = new Vector3(0.006f, direction.magnitude / 2f - 0.0051f, 0.006f); + } + + } + private void OnDestroy() + { + HandManager.StopFrameWork(isLeft); + UnityEngine.Debug.Log("OnDestroy"); + } + + //public void setHandVisible(bool isVisible) + //{ + // Hand.SetActive(isVisible); + //} + } + +} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderHand.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderHand.cs.meta new file mode 100644 index 0000000..bcc8163 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderHand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8c57cc3ae07bcce42ba395c288cba794 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderModel.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderModel.cs new file mode 100644 index 0000000..effcdea --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderModel.cs @@ -0,0 +1,78 @@ +using UnityEngine; +using VIVE.HandTracking; + +namespace VIVE.HandTracking.Sample +{ + public class RenderModel : MonoBehaviour + { + private readonly Quaternion zBackModelRotFix = Quaternion.AngleAxis(180f, Vector3.up); + + public Transform[] nodes = new Transform[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT]; + [Tooltip("Draw left hand if true, right hand otherwise")] + public bool isLeft = false; + [Tooltip("Use inferred or last-known posed when hand loses tracking if true.")] + public bool allowUntrackedPose = false; + [Tooltip("Root object of skinned mesh")] + public GameObject Hand = null; + private XrHandJointsMotionRangeEXT MotionType = XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_MAX_ENUM_EXT; + [Tooltip("Type of hand joints range of motion")] + [ReadOnly]public string HandJointsMotionRange; + + + // Start is called before the first frame update + private void Start() + { + HandManager.StartFrameWork(isLeft); + } + + // Update is called once per frame + private void Update() + { + if (HandManager.GetJointLocation(isLeft, out var joints, ref MotionType)) + { + setHandVisible(true); + + for (int i = (int)XrHandJointEXT.XR_HAND_JOINT_PALM_EXT; i < (int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT; i++) + { + var posValid = (joints[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_POSITION_VALID_BIT) != 0; + var posTracked = (joints[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_POSITION_TRACKED_BIT) != 0; + var rotValid = (joints[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_ORIENTATION_VALID_BIT) != 0; + var rotTracked = (joints[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT) != 0; + + var pos = new Vector3(joints[i].pose.position.x, joints[i].pose.position.y, -joints[i].pose.position.z); + var rot = new Quaternion(-joints[i].pose.orientation.x, -joints[i].pose.orientation.y, joints[i].pose.orientation.z, joints[i].pose.orientation.w) * zBackModelRotFix; + + if (posValid && (allowUntrackedPose || posTracked)) { nodes[i].position = transform.TransformPoint(pos); } + if (rotValid && (allowUntrackedPose || rotTracked)) { nodes[i].rotation = transform.rotation * rot; } + } + switch (MotionType) + { + case XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT: + HandJointsMotionRange = "UNOBSTRUCTED"; + break; + case XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT: + HandJointsMotionRange = "CONTROLLER"; + break; + default: + HandJointsMotionRange = ""; + break; + } + } + else + { + setHandVisible(false); + } + } + + private void OnDestroy() + { + HandManager.StopFrameWork(isLeft); + } + + public void setHandVisible(bool isVisible) + { + Hand.SetActive(isVisible); + } + } + +} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderModel.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderModel.cs.meta new file mode 100644 index 0000000..2f8e80e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/RenderModel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c19189c6a6028a74ab475048ebd154c8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/SwitchHand.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/SwitchHand.cs new file mode 100644 index 0000000..c08c08b --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/SwitchHand.cs @@ -0,0 +1,46 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace VIVE.HandTracking.Sample +{ + public class SwitchHand : MonoBehaviour + { + public InputMaster inputMaster; + public GameObject hand3D; + public GameObject handSkeleton; + private bool isSwitch = false; + private void Awake() + { + inputMaster = new InputMaster(); + inputMaster.Enable(); + } + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + float ispressed = inputMaster.Keyboard.SpacePress.ReadValue(); + if (ispressed > 0.5) + { + if(!isSwitch) + { + UnityEngine.Debug.Log("press space"); + hand3D.SetActive(!hand3D.activeSelf); + handSkeleton.SetActive(!handSkeleton.activeSelf); + isSwitch = true; + } + } + else + { + isSwitch = false; + } + + } + } + +} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/SwitchHand.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/SwitchHand.cs.meta new file mode 100644 index 0000000..139706b --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Samples~/Scripts/SwitchHand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2642121393e03fd46ba257307ca9cb51 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Script.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Script.meta new file mode 100644 index 0000000..8186226 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Script.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 98067af793989634da2aed490cf3f25b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandManager.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandManager.cs new file mode 100644 index 0000000..c7e4eae --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandManager.cs @@ -0,0 +1,293 @@ +using System; +using UnityEngine; +using UnityEngine.XR.OpenXR; + +namespace VIVE.HandTracking +{ + public static class HandManager + { + private class HandData + { + public bool isStarted; + public XrHandEXT hand; + public ulong trackerHandle; + public bool isActive; + public int jointUpdatedFrame = -1; + public XrHandJointLocationEXT[] joints = new XrHandJointLocationEXT[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT]; + public XrHandJointVelocityEXT[] velocities = new XrHandJointVelocityEXT[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT]; + + public bool isCreated { get { return trackerHandle != default; } } + + public void ClearJoints() + { + Array.Clear(joints, 0, joints.Length); + Array.Clear(velocities, 0, velocities.Length); + } + } + + private static HandTracking_OpenXR_API feature; + private static bool isInitialized; + private static bool isSystemSupported; + private static ulong refSpace; + private static HandData leftHandData = new HandData() { hand = XrHandEXT.XR_HAND_LEFT_EXT }; + private static HandData rightHandData = new HandData() { hand = XrHandEXT.XR_HAND_RIGHT_EXT }; + + private static bool isRefSpaceCreated { get { return refSpace != default; } } + + private static HandData GetHandData(bool isLeft) + { + return isLeft ? leftHandData : rightHandData; + } + + public static bool Initialize() + { + if (!isInitialized) + { + if (feature == null) + { + feature = OpenXRSettings.Instance.GetFeature(); + + if (feature != null) + { + // FIXME: Assume featuer instance won't be destroied and created to a new one + feature.onSessionCreate += OnFeatureSessionCreate; + feature.onSessionDestroy += OnFeatureSessionDestroy; + feature.onSystemChange += OnFeatureSystemChange; + } + } + + if (feature != null && feature.IsEnabledAndInitialized) + { + UpdateSystemSupported(); + isInitialized = true; + } + } + + return isInitialized; + } + + private static void OnFeatureSessionCreate(ulong xrSession) + { + TryCreateHandTracker(leftHandData); + TryCreateHandTracker(rightHandData); + } + + private static void OnFeatureSessionDestroy(ulong xrSession) + { + DestroyHandTracker(leftHandData); + DestroyHandTracker(rightHandData); + DestroyRefSpace(); + } + + private static void OnFeatureSystemChange(ulong systemId) + { + UpdateSystemSupported(); + } + + private static void UpdateSystemSupported() + { + if (feature == null || !feature.IsEnabledAndInitialized) + { + isSystemSupported = false; + } + else + { + isSystemSupported = feature.SystemSupportsHandTracking(out var result); + + if (!isSystemSupported) + { + if (result != XrResult.XR_SUCCESS) + { + Debug.LogWarning("Fail SystemSupportsHandTracking: " + result); + } + else + { + Debug.LogWarning("Hand tracking not supported by the system"); + } + } + } + } + + private static bool TryCreateHandTracker(HandData handData) + { + if (!handData.isStarted) { return false; } + if (!Initialize()) { return false; } + if (!isSystemSupported) { return false; } + if (!feature.IsSessionCreated) { return false; } + + if (!handData.isCreated) + { + if (!feature.TryCreateHandTracker(handData.hand, out handData.trackerHandle, out var result)) + { + handData.trackerHandle = default; + Debug.LogWarning("Fail CreateHandTracker: " + result); + } + } + + return handData.isCreated; + } + + private static void DestroyHandTracker(HandData handData) + { + if (!handData.isCreated) { return; } + if (!Initialize()) { return; } + + feature.TryDestroyHandTracker(handData.trackerHandle, out _); + handData.trackerHandle = default; + handData.ClearJoints(); + } + + private static bool InitializeRefSpace() + { + if (!Initialize()) { return false; } + if (!isSystemSupported) { return false; } + if (!feature.IsSessionCreated) { return false; } + + if (!isRefSpaceCreated) + { + const XrReferenceSpaceType preferSpaceType = XrReferenceSpaceType.XR_REFERENCE_SPACE_TYPE_STAGE; + XrReferenceSpaceType spaceType; + if (!feature.TryGetSupportedReferenceSpaceType(preferSpaceType, out spaceType, out var result)) + { + Debug.LogWarning("Fail GetSupportedReferenceSpaceType: " + result); + } + else + { + if (!feature.TryCreateReferenceSpace( + spaceType, + new XrVector3f(0f, 0f, 0f), + new XrQuaternionf(0f, 0f, 0f, 1f), + out refSpace, + out result)) + { + refSpace = default; + Debug.LogWarning("Fail CreateReferenceSpace: " + result); + } + } + } + + return isRefSpaceCreated; + } + + private static void DestroyRefSpace() + { + if (!isRefSpaceCreated) { return; } + + if (Initialize()) + { + if (!feature.TryDestroyReferenceSpace(refSpace, out var result)) + { + Debug.LogWarning("Fail DestroyReferenceSpace: " + result); + } + } + + refSpace = default; + } + + public static void StartFrameWork(bool isLeft) + { + var handData = GetHandData(isLeft); + handData.isStarted = true; + + TryCreateHandTracker(handData); + } + + public static void StopFrameWork(bool isLeft) + { + var handData = GetHandData(isLeft); + handData.isStarted = false; + + DestroyHandTracker(handData); + } + + public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints, bool forceUpdate = false) + { + var handData = GetHandData(isleft); + if (handData.isCreated) + { + if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount) + { + handData.jointUpdatedFrame = Time.frameCount; + + if (InitializeRefSpace()) + { + if (!feature.TryLocateHandJoints( + handData.trackerHandle, + refSpace, + out handData.isActive, + handData.joints, + out var result)) + { + handData.isActive = false; + Debug.LogWarning("Fail LocateHandJoints: " + result); + } + } + } + } + + joints = handData.joints; + return handData.isActive; + } + + public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints, ref XrHandJointsMotionRangeEXT type, bool forceUpdate = false) + { + var handData = GetHandData(isleft); + if (handData.isCreated) + { + if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount) + { + handData.jointUpdatedFrame = Time.frameCount; + + if (InitializeRefSpace()) + { + if (!feature.TryLocateHandJoints( + handData.trackerHandle, + refSpace, + ref type, + out handData.isActive, + handData.joints, + out var result)) + { + handData.isActive = false; + Debug.LogWarning("Fail LocateHandJoints: " + result); + } + } + } + } + joints = handData.joints; + return handData.isActive; + } + + public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints, out XrHandJointVelocityEXT[] velocities, bool forceUpdate = false) + { + var handData = GetHandData(isleft); + if (handData.isCreated) + { + if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount) + { + handData.jointUpdatedFrame = Time.frameCount; + + if (InitializeRefSpace()) + { + if (!feature.TryLocateHandJoints( + handData.trackerHandle, + refSpace, + out handData.isActive, + handData.joints, + handData.velocities, + out var result)) + { + handData.isActive = false; + Debug.LogWarning("Fail LocateHandJoints: " + result); + } + } + } + } + + joints = handData.joints; + velocities = handData.velocities; + return handData.isActive; + } + } + +} diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandManager.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandManager.cs.meta new file mode 100644 index 0000000..f92928e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ffbd7154b240117469bbc995d51d58a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandTracking_OpenXR_API.cs b/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandTracking_OpenXR_API.cs new file mode 100644 index 0000000..aa0edc2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandTracking_OpenXR_API.cs @@ -0,0 +1,429 @@ +using System; +using System.Runtime.InteropServices; +using UnityEditor; +using UnityEngine.XR.OpenXR.Features; +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif + +namespace VIVE +{ + namespace HandTracking + { + +#if UNITY_EDITOR + [OpenXRFeature(UiName = "Hand Tracking", + BuildTargetGroups = new[] { BuildTargetGroup.Standalone }, + Company = "HTC", + Desc = "Hand Tracking OpenXR Feature", + DocumentationLink = "https://developer.vive.com/resources/openxr/openxr-pcvr/tutorials/unity/how-integrate-hand-tracking-data-your-hand-model/", + OpenxrExtensionStrings = "XR_EXT_hand_tracking", + Version = "0.0.1", + FeatureId = featureId)] +#endif + public class HandTracking_OpenXR_API : OpenXRFeature + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.company.openxr.handtracking.feature"; + private IntPtr oldxrGetInstanceProcAddr; + private IntPtr oldWaitFrame; + private ulong m_xrInstance; + private ulong m_xrSession; + private ulong m_systemId; + private XrFrameWaitInfo m_frameWaitInfo; + private XrFrameState m_frameState; + + [Obsolete] public ulong m_space; + [Obsolete] public XrSystemProperties systemProperties; + [Obsolete] public ulong m_leftHandle; + [Obsolete] public ulong m_rightHandle; + + public bool IsInitialized { get { return m_xrGetSystemProperties != null; } } + public bool IsEnabledAndInitialized { get { return enabled && IsInitialized; } } + public bool IsSessionCreated { get { return XrSession != default; } } + public ulong XrInstance { get { return m_xrInstance; } } + public ulong XrSession { get { return m_xrSession; } } + public ulong SystemId { get { return m_systemId; } } + + public event Action onSessionCreate; + public event Action onSessionDestroy; + public event Action onSystemChange; + protected override IntPtr HookGetInstanceProcAddr(IntPtr func) + { + UnityEngine.Debug.Log("EXT: registering our own xrGetInstanceProcAddr"); + oldxrGetInstanceProcAddr = func; + m_intercept_xrWaitFrame_xrGetInstanceProcAddr = intercept_xrWaitFrame_xrGetInstanceProcAddr; + return Marshal.GetFunctionPointerForDelegate(m_intercept_xrWaitFrame_xrGetInstanceProcAddr); + } + + + private int intercept_xrWaitFrame_xrGetInstanceProcAddr(ulong instance, string name, out IntPtr function) + { + if (oldxrGetInstanceProcAddr == null || oldxrGetInstanceProcAddr == IntPtr.Zero) + { + UnityEngine.Debug.LogError("oldxrGetInstanceProcAddr is null"); + function = IntPtr.Zero; + return -1; + } + + // Get delegate of old xrGetInstanceProcAddr. + var xrGetProc = Marshal.GetDelegateForFunctionPointer(oldxrGetInstanceProcAddr); + + int result = xrGetProc(instance, name,out function); + if(name == "xrWaitFrame") + { + oldWaitFrame = function; + m_intercept_xrWaitFrame = intercepted_xrWaitFrame; + function = Marshal.GetFunctionPointerForDelegate(m_intercept_xrWaitFrame); ; + UnityEngine.Debug.Log("Getting xrWaitFrame func"); + } + return result; + + } + + private int intercepted_xrWaitFrame(ulong session,ref XrFrameWaitInfo frameWaitInfo, ref XrFrameState frameState) + { + // Get delegate of old xrWaitFrame. + var xrWaitFrame = Marshal.GetDelegateForFunctionPointer(oldWaitFrame); + int res = xrWaitFrame(session, ref frameWaitInfo, ref frameState); + m_frameWaitInfo = frameWaitInfo; + m_frameState = frameState; + return res; + } + + /// + protected override bool OnInstanceCreate(ulong xrInstance) + { + UnityEngine.Debug.Log($"OnInstanceCreate({xrInstance:X})"); + m_xrInstance = xrInstance; + return GetXrFunctionDelegates(xrInstance); + } + + /// + protected override void OnInstanceDestroy(ulong xrInstance) + { + UnityEngine.Debug.Log($"OnInstanceDestroy({xrInstance:X})"); + m_xrInstance = default; + //ClearXrFunctionDelegates(); + } + + /// + protected override void OnSessionCreate(ulong xrSession) + { + UnityEngine.Debug.Log($"OnSessionCreate({xrSession:X})"); + m_xrSession = xrSession; + + try { onSessionCreate?.Invoke(xrSession); } + catch (Exception e) { UnityEngine.Debug.LogError(e); } + } + + /// + protected override void OnSystemChange(ulong xrSystem) + { + UnityEngine.Debug.Log($"OnSystemChange({xrSystem:X})"); + m_systemId = xrSystem; + + try { onSystemChange?.Invoke(xrSystem); } + catch (Exception e) { UnityEngine.Debug.LogError(e); } + } + + /// + protected override void OnSessionDestroy(ulong xrSession) + { + UnityEngine.Debug.Log($"OnSessionDestroy({xrSession:X})"); + m_xrSession = default; + + try { onSessionDestroy?.Invoke(xrSession); } + catch (Exception e) { UnityEngine.Debug.LogError(e); } + } + + /// Return true if the result equals zero. + private bool GetXrFunctionDelegates(ulong xrInstance) + { + if (xrGetInstanceProcAddr == null || xrGetInstanceProcAddr == IntPtr.Zero) + { + UnityEngine.Debug.LogError("xrGetInstanceProcAddr is null"); + return false; + } + + // Get delegate of xrGetInstanceProcAddr. + var xrGetProc = Marshal.GetDelegateForFunctionPointer(xrGetInstanceProcAddr); + + if (!MarshelFunc(xrInstance, xrGetProc, "xrGetSystemProperties", ref m_xrGetSystemProperties)) { return false; } + if (!MarshelFunc(xrInstance, xrGetProc, "xrEnumerateReferenceSpaces", ref m_xrEnumerateReferenceSpaces)) { return false; } + if (!MarshelFunc(xrInstance, xrGetProc, "xrEnumerateReferenceSpaces", ref m_xrEnumerateReferenceSpaces2)) { return false; } + if (!MarshelFunc(xrInstance, xrGetProc, "xrCreateReferenceSpace", ref m_xrCreateReferenceSpace)) { return false; } + if (!MarshelFunc(xrInstance, xrGetProc, "xrDestroySpace", ref m_xrDestroySpace)) { return false; } + if (!MarshelFunc(xrInstance, xrGetProc, "xrCreateHandTrackerEXT", ref m_xrCreateHandTrackerEXT)) { return false; } + if (!MarshelFunc(xrInstance, xrGetProc, "xrDestroyHandTrackerEXT", ref m_xrDestroyHandTrackerEXT)) { return false; } + if (!MarshelFunc(xrInstance, xrGetProc, "xrLocateHandJointsEXT", ref m_xrLocateHandJointsEXT)) { return false; } + return true; + } + + private void ClearXrFunctionDelegates() + { + m_xrGetSystemProperties = null; + m_xrEnumerateReferenceSpaces = null; + m_xrEnumerateReferenceSpaces2 = null; + m_xrCreateReferenceSpace = null; + m_xrDestroySpace = null; + m_xrCreateHandTrackerEXT = null; + m_xrDestroyHandTrackerEXT = null; + m_xrLocateHandJointsEXT = null; + } + + private static bool MarshelFunc(ulong instance, xrGetInstanceProcDelegate instanceProc, string funcName, ref T func, bool verbose = true) + where T : Delegate + { + if (instanceProc(instance, funcName, out var fp) != 0) + { + if (verbose) + { + UnityEngine.Debug.LogError("Fail getting function " + funcName); + } + return false; + } + + func = Marshal.GetDelegateForFunctionPointer(fp); + return true; + } + + private xrGetInstanceProcDelegate m_intercept_xrWaitFrame_xrGetInstanceProcAddr; + + private delegate int xrGetSystemPropertiesDelegate(ulong instance, ulong systemId, ref XrSystemProperties properties); + private xrGetSystemPropertiesDelegate m_xrGetSystemProperties; + public int xrGetSystemProperties(ref XrSystemProperties properties) => + m_xrGetSystemProperties(XrInstance, SystemId, ref properties); + public int xrGetSystemProperties(ulong instance, ulong systemId, ref XrSystemProperties properties) => + m_xrGetSystemProperties(instance, systemId, ref properties); + + private delegate int xrWaitFrameDelegate(ulong session,ref XrFrameWaitInfo frameWaitInfo, ref XrFrameState frameState); + private xrWaitFrameDelegate m_intercept_xrWaitFrame; + #region space + private delegate int xrEnumerateReferenceSpacesDelegate(ulong session, int spaceCapacityInput, out int spaceCountOutput, out XrReferenceSpaceType spaces); + private xrEnumerateReferenceSpacesDelegate m_xrEnumerateReferenceSpaces; + public int xrEnumerateReferenceSpaces(int spaceCapacityInput, out int spaceCountOutput, out XrReferenceSpaceType spaces) => + m_xrEnumerateReferenceSpaces(XrSession, spaceCapacityInput, out spaceCountOutput, out spaces); + + private delegate int xrEnumerateReferenceSpacesDelegate2(ulong session, int spaceCapacityInput, out int spaceCountOutput, IntPtr spaces); + private xrEnumerateReferenceSpacesDelegate2 m_xrEnumerateReferenceSpaces2; + public int xrEnumerateReferenceSpaces(ulong session, int spaceCapacityInput, out int spaceCountOutput, IntPtr spaces) => + m_xrEnumerateReferenceSpaces2(session, spaceCapacityInput, out spaceCountOutput, spaces); + + private delegate int xrCreateReferenceSpaceDelegate(ulong session, ref XrReferenceSpaceCreateInfo createInfo, out ulong space); + private xrCreateReferenceSpaceDelegate m_xrCreateReferenceSpace; + public int xrCreateReferenceSpace(ref XrReferenceSpaceCreateInfo createInfo, out ulong space) => + m_xrCreateReferenceSpace(XrSession, ref createInfo, out space); + public int xrCreateReferenceSpace(ulong session, ref XrReferenceSpaceCreateInfo createInfo, out ulong space) => + m_xrCreateReferenceSpace(session, ref createInfo, out space); + + private delegate int xrDestroySpaceDelegate(ulong space); + private xrDestroySpaceDelegate m_xrDestroySpace; + public int xrDestroySpace(ulong space) => + m_xrDestroySpace(space); + #endregion + + private delegate int xrCreateHandTrackerEXTDelegate(ulong session, XrHandTrackerCreateInfoEXT createInfo, out ulong handTracker); + private xrCreateHandTrackerEXTDelegate m_xrCreateHandTrackerEXT; + public int xrCreateHandTrackerEXT(XrHandTrackerCreateInfoEXT createInfo, out ulong handle) => + m_xrCreateHandTrackerEXT(XrSession, createInfo, out handle); + public int xrCreateHandTrackerEXT(ulong session, XrHandTrackerCreateInfoEXT createInfo, out ulong handle) => + m_xrCreateHandTrackerEXT(session, createInfo, out handle); + + private delegate int xrDestroyHandTrackerEXTDelegate(ulong handTracker); + private xrDestroyHandTrackerEXTDelegate m_xrDestroyHandTrackerEXT; + public int xrDestroyHandTrackerEXT(ulong handle) => + m_xrDestroyHandTrackerEXT(handle); + + private delegate int xrLocateHandJointsEXTDelegate(ulong handTracker,ref XrHandJointsLocateInfoEXT locateInfo, ref XrHandJointLocationsEXT locations); + private xrLocateHandJointsEXTDelegate m_xrLocateHandJointsEXT; + public int xrLocateHandJointsEXT(ulong handTracker,ref XrHandJointsLocateInfoEXT locateInfo, ref XrHandJointLocationsEXT locations) => + m_xrLocateHandJointsEXT(handTracker,ref locateInfo, ref locations); + + public unsafe bool SystemSupportsHandTracking(out XrResult result) + { + var handTrackingSystemProp = new XrSystemHandTrackingPropertiesEXT() + { + type = XrStructureType.XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT, + next = IntPtr.Zero, + }; + + var systemProp = new XrSystemProperties() + { + type = XrStructureType.XR_TYPE_SYSTEM_PROPERTIES, + next = (IntPtr)(&handTrackingSystemProp), + }; + + result = (XrResult)xrGetSystemProperties(XrInstance, SystemId, ref systemProp); + return result == XrResult.XR_SUCCESS && handTrackingSystemProp.supportsHandTracking != 0u; + } + + public bool TryGetSupportedReferenceSpaceTypeCount(out int count, out XrResult result) + { + result = (XrResult)m_xrEnumerateReferenceSpaces2(XrSession, 0, out count, IntPtr.Zero); + return result == XrResult.XR_SUCCESS; + } + + public bool TryGetSupportedReferenceSpaceTypes(XrReferenceSpaceType[] spaces, out XrResult result) + { + if (spaces == null || spaces.Length == 0) + { + result = default; + return true; + } + + result = (XrResult)m_xrEnumerateReferenceSpaces2(XrSession, spaces.Length, out _, ArrayPtr(spaces)); + return result == XrResult.XR_SUCCESS; + } + + public bool TryGetSupportedReferenceSpaceType(XrReferenceSpaceType preferType, out XrReferenceSpaceType supportedType, out XrResult result) + { + supportedType = default; + if (!TryGetSupportedReferenceSpaceTypeCount(out var count, out result)) { return false; } + if (count == 0) { return false; } // FIXME: error code? + + var spaces = new XrReferenceSpaceType[count]; + if (!TryGetSupportedReferenceSpaceTypes(spaces, out result)) { return false; } + + for (int i = 0; i < count; ++i) + { + supportedType = spaces[i]; + if (supportedType == preferType) { break; } + } + + return true; + } + + public bool TryCreateReferenceSpace(XrReferenceSpaceType refSpaceType, XrVector3f position, XrQuaternionf orientation, out ulong handle, out XrResult result) + { + var createInfo = new XrReferenceSpaceCreateInfo() + { + type = XrStructureType.XR_TYPE_REFERENCE_SPACE_CREATE_INFO, + next = IntPtr.Zero, + referencespacetype = refSpaceType, + poseInReferenceSpace = new XrPosef() + { + position = position, + orientation = orientation, + }, + }; + + result = (XrResult)xrCreateReferenceSpace(XrSession, ref createInfo, out handle); + return result == XrResult.XR_SUCCESS; + } + + public bool TryDestroyReferenceSpace(ulong handle, out XrResult result) + { + result = (XrResult)xrDestroySpace(handle); + return result == XrResult.XR_SUCCESS; + } + + public bool TryCreateHandTracker(XrHandEXT hand, out ulong handle, out XrResult result, XrHandJointSetEXT jointSet = XrHandJointSetEXT.XR_HAND_JOINT_SET_DEFAULT_EXT) + { + var createInfo = new XrHandTrackerCreateInfoEXT() + { + type = XrStructureType.XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT, + next = IntPtr.Zero, + hand = hand, + handJointSet = XrHandJointSetEXT.XR_HAND_JOINT_SET_DEFAULT_EXT, + }; + + result = (XrResult)xrCreateHandTrackerEXT(XrSession, createInfo, out handle); + return result == XrResult.XR_SUCCESS; + } + + public bool TryDestroyHandTracker(ulong handle, out XrResult result) + { + result = (XrResult)xrDestroyHandTrackerEXT(handle); + return result == XrResult.XR_SUCCESS; + } + + public bool TryLocateHandJoints(ulong handle, ulong space, out bool isActive, XrHandJointLocationEXT[] locationArray, out XrResult result) + { + return TryLocateHandJoints(handle, space, out isActive, locationArray, null, out result); + } + + public bool TryLocateHandJoints(ulong handle, ulong space, out bool isActive, XrHandJointLocationEXT[] locationArray, XrHandJointVelocityEXT[] velocityArray, out XrResult result) + { + return TryLocateHandJoints(handle, space, IntPtr.Zero, out isActive, locationArray, velocityArray, out result); + } + + public bool TryLocateHandJoints(ulong handle, ulong space, ref XrHandJointsMotionRangeEXT motionRange, out bool isActive, XrHandJointLocationEXT[] locationArray, out XrResult result) + { + return TryLocateHandJoints(handle, space, ref motionRange, out isActive, locationArray, null, out result); + } + + public unsafe bool TryLocateHandJoints(ulong handle, ulong space, ref XrHandJointsMotionRangeEXT motionRange, out bool isActive, XrHandJointLocationEXT[] locationArray, XrHandJointVelocityEXT[] velocityArray, out XrResult result) + { + var motionRangeInfo = new XrHandJointsMotionRangeInfoEXT() + { + type = XrStructureType.XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT, + next = IntPtr.Zero, + handJointsMotionRange = motionRange, + }; + + bool res = TryLocateHandJoints(handle, space, (IntPtr)(&motionRangeInfo), out isActive, locationArray, velocityArray, out result); + motionRange = motionRangeInfo.handJointsMotionRange; + return res; + } + + private unsafe bool TryLocateHandJoints(ulong handle, ulong space, IntPtr motionRangeInfo, out bool isActive, XrHandJointLocationEXT[] locationArray, XrHandJointVelocityEXT[] velocityArray, out XrResult result) + { + var locateInfo = new XrHandJointsLocateInfoEXT() + { + type = XrStructureType.XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT, + next = motionRangeInfo, + baseSpace = space, + time = m_frameState.predictedDisplayTime, //An arbitrary number greater than 0 + }; + + var locVelocitiesPtr = IntPtr.Zero; + if (velocityArray != null) + { + var locVelocities = new XrHandJointVelocitiesEXT() + { + type = XrStructureType.XR_TYPE_HAND_JOINT_VELOCITIES_EXT, + next = IntPtr.Zero, + jointCount = (uint)velocityArray.Length, + jointVelocities = ArrayPtr(velocityArray) + }; + + locVelocitiesPtr = (IntPtr)(&locVelocities); + } + + var locations = new XrHandJointLocationsEXT() + { + type = XrStructureType.XR_TYPE_HAND_JOINT_LOCATIONS_EXT, + next = locVelocitiesPtr, + jointCount = locationArray == null ? 0 : locationArray.Length, + jointLocations = ArrayPtr(locationArray), + }; + + result = (XrResult)xrLocateHandJointsEXT(handle,ref locateInfo, ref locations); + isActive = locations.isActive != 0u; + return result == XrResult.XR_SUCCESS; + } + + private unsafe static IntPtr ArrayPtr(XrReferenceSpaceType[] array) + { + if (array == null) { return IntPtr.Zero; } + fixed (XrReferenceSpaceType* p = array) { return (IntPtr)p; } + } + + private unsafe static IntPtr ArrayPtr(XrHandJointLocationEXT[] array) + { + if (array == null) { return IntPtr.Zero; } + fixed (XrHandJointLocationEXT* p = array) { return (IntPtr)p; } + } + + private unsafe static IntPtr ArrayPtr(XrHandJointVelocityEXT[] array) + { + if (array == null) { return IntPtr.Zero; } + fixed (XrHandJointVelocityEXT* p = array) { return (IntPtr)p; } + } + + } + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandTracking_OpenXR_API.cs.meta b/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandTracking_OpenXR_API.cs.meta new file mode 100644 index 0000000..8fc81ef --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRHandTracking/Script/HandTracking_OpenXR_API.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38169f0e301608a469f311ebb2233162 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding.meta new file mode 100644 index 0000000..a6dfd41 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ffbc15e43390d9d47af0e60075d687f5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/ActionAssetEnabler.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/ActionAssetEnabler.cs new file mode 100644 index 0000000..03579e1 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/ActionAssetEnabler.cs @@ -0,0 +1,23 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.InputSystem; + +public class ActionAssetEnabler : MonoBehaviour +{ + [SerializeField] + InputActionAsset m_ActionAsset; + public InputActionAsset actionAsset + { + get => m_ActionAsset; + set => m_ActionAsset = value; + } + + private void OnEnable() + { + if(m_ActionAsset != null) + { + m_ActionAsset.Enable(); + } + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/ActionAssetEnabler.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/ActionAssetEnabler.cs.meta new file mode 100644 index 0000000..775938c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/ActionAssetEnabler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 882e1090e76def749ad1a34789211e37 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Controller.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Controller.cs new file mode 100644 index 0000000..5893548 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Controller.cs @@ -0,0 +1,103 @@ +using System; +using UnityEngine.InputSystem; +using UnityEngine.UI; +using UnityEngine; + +public class Controller : MonoBehaviour +{ + [SerializeField] + private InputActionReference m_ActionReferenceTrigger; + public InputActionReference actionReferenceTrigger { get => m_ActionReferenceTrigger ; set => m_ActionReferenceTrigger=value; } + [SerializeField] + private InputActionReference m_ActionReferenceGrip; + public InputActionReference actionReferenceGrip { get => m_ActionReferenceGrip ; set => m_ActionReferenceGrip=value; } + public GameObject MeshSubSystem; + public Transform spawnPoint; + public GameObject sphere; + public float shootVelocity = 5f; + + Type lastActiveType_Trigger = null; + Type lastActiveType_Grip = null; + bool isSpawned = false; + bool isSwitchedMeshPrefab = false; + // Update is called once per frame + void Update() + { + if ( actionReferenceTrigger != null && actionReferenceTrigger.action != null + && actionReferenceTrigger.action.enabled && actionReferenceTrigger.action.controls.Count > 0 + && actionReferenceGrip != null && actionReferenceGrip.action != null + && actionReferenceGrip.action.enabled && actionReferenceGrip.action.controls.Count > 0) + { + // Grip + Type typeToUse_Grip = null; + if(actionReferenceGrip.action.activeControl != null) + { + typeToUse_Grip = actionReferenceGrip.action.activeControl.valueType; + } + else + { + typeToUse_Grip = lastActiveType_Grip; + } + + if(typeToUse_Grip == typeof(float)) + { + lastActiveType_Grip = typeof(float); + float value = actionReferenceGrip.action.ReadValue(); + if(value > 0.5) + { + if(!isSwitchedMeshPrefab) + { + isSwitchedMeshPrefab = true; + Debug.Log("Press Button B."); + if(MeshSubSystem != null) + { + MeshSubSystem.GetComponent().SwitchMeshPrefab(); + } + } + } + else + { + isSwitchedMeshPrefab = false; + } + } + + // Trigger + Type typeToUse_Trigger = null; + if(actionReferenceTrigger.action.activeControl != null) + { + typeToUse_Trigger = actionReferenceTrigger.action.activeControl.valueType; + } + else + { + typeToUse_Trigger = lastActiveType_Trigger; + } + + if(typeToUse_Trigger == typeof(float)) + { + lastActiveType_Trigger = typeof(float); + float value = actionReferenceTrigger.action.ReadValue(); + if(value > 0.5) + { + if(!isSpawned) + { + isSpawned = true; + SpawnTarget(); + } + } + else + { + isSpawned = false; + } + } + } + } + + private void SpawnTarget() + { + GameObject ball = Instantiate(sphere, spawnPoint); + Rigidbody rb = ball.GetComponent(); + rb.velocity = ball.transform.parent.forward * shootVelocity; + rb.isKinematic = false; + ball.transform.parent = null; + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Controller.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Controller.cs.meta new file mode 100644 index 0000000..9e08901 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Controller.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 15b06a835f580bf4995da3b45ecf229d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/DestrySelf.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/DestrySelf.cs new file mode 100644 index 0000000..7041f2d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/DestrySelf.cs @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class DestrySelf : MonoBehaviour +{ + public float LifeTime = 5f; + // Start is called before the first frame update + void Start() + { + Destroy(this.gameObject, LifeTime); + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/DestrySelf.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/DestrySelf.cs.meta new file mode 100644 index 0000000..ebe160a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/DestrySelf.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89d0d284e76483043b0ffc8bfafe077f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Editor/MeshingFeatureInstaller.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Editor/MeshingFeatureInstaller.cs new file mode 100644 index 0000000..c1e6474 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Editor/MeshingFeatureInstaller.cs @@ -0,0 +1,89 @@ +using System; +using System.Linq; +using System.Reflection; +using System.IO; +using UnityEngine; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Samples.MeshingFeature; +using UnityEditor.XR.OpenXR.Features; + +namespace UnityEditor.XR.OpenXR.Samples.MeshingFeature +{ + /// + /// Custom editor for meshing behaviour that ensures the meshing feature plugin can be loaded. + /// + /// For the SceneUnderstanding sample to be loaded the sample folder must be an immediate child of the 'Assets' folder and + /// must be there on Unity startup. This script will copy the sample folder to the required destination and attempt + /// to force a restart after. + /// + /// Note that this script will self destruct after running by deleting the script asset to ensure it only ever runs once. + /// + /// Note that when developing samples this copying functionality may not be desired. To disable this + /// functionality add the UNITY_SAMPLE_DEV define to your project. + /// + [InitializeOnLoad] + public class MeshingFeatureInstaller : Editor + { +#if !UNITY_SAMPLE_DEV + private const string k_MeshingFeaturePath = "SceneUnderstanding Example/MeshingFeaturePlugin/UnitySubsystemsManifest.json"; + + private const string k_ErrorMessage = "The SceneUnderstanding Example requires the `MeshingFeaturePlugin' folder be moved to the root 'Assets` folder to run properly. An attempt was made to automatically move these files to the correct location but failed, please move these files manaually before running the sample."; + + private const string k_DialogText = "The SceneUnderstanding Example requires that the MeshingFeature subsystem be registered, which will require Unity editor to be restarted.\n\nDo you want to *RESTART* the editor now?"; + + static MeshingFeatureInstaller() + { + // Automatically enable the feature + FeatureHelpers.RefreshFeatures(BuildTargetGroup.Standalone); + var feature = OpenXRSettings.Instance.GetFeature(); + if (feature != null) + feature.enabled = true; + + // Find the subsystem manifest to figure out where the sample was installed + var source = AssetDatabase + .FindAssets(Path.GetFileNameWithoutExtension(k_MeshingFeaturePath)) + .Select(AssetDatabase.GUIDToAssetPath) + .FirstOrDefault(r => r.Contains(k_MeshingFeaturePath)); + + if (string.IsNullOrEmpty(source)) + { + Debug.LogError(k_ErrorMessage); + return; + } + + // Extract the `UnitySubsystemsManifest.json` from the path + source = Path.GetDirectoryName(source); + + // Target path is 'Assets/` + var target = Path.Combine("Assets", Path.GetFileNameWithoutExtension(source)); + + // Attempt to move the entire folder + var moveResult = AssetDatabase.MoveAsset(source, target); + if (!string.IsNullOrWhiteSpace(moveResult)) + { + Debug.LogError(moveResult); + return; + } + + Debug.Log($"Moved '{source}' to '{target}"); + + if (EditorUtility.DisplayDialog("Warning", k_DialogText, "Yes", "No")) + { + // Restart editor. + var editorApplicationType = typeof(EditorApplication); + var requestCloseAndRelaunchWithCurrentArgumentsMethod = + editorApplicationType.GetMethod("RequestCloseAndRelaunchWithCurrentArguments", + BindingFlags.NonPublic | BindingFlags.Static); + + if (requestCloseAndRelaunchWithCurrentArgumentsMethod == null) + throw new MissingMethodException(editorApplicationType.FullName, "RequestCloseAndRelaunchWithCurrentArguments"); + + requestCloseAndRelaunchWithCurrentArgumentsMethod.Invoke(null, null); + } + + // Self destruct + AssetDatabase.DeleteAsset(Path.Combine(Path.GetDirectoryName(source), "Editor")); + } +#endif + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Editor/MeshingFeatureInstaller.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Editor/MeshingFeatureInstaller.cs.meta new file mode 100644 index 0000000..29a9fe2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Editor/MeshingFeatureInstaller.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 889289a1c4a096340aede480e53f0e7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/HTC.VIVE.OPENXR.SceneUnderstandingSample.asmdef b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/HTC.VIVE.OPENXR.SceneUnderstandingSample.asmdef new file mode 100644 index 0000000..188c37a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/HTC.VIVE.OPENXR.SceneUnderstandingSample.asmdef @@ -0,0 +1,19 @@ +{ + "name": "HTC.VIVE.OPENXR.SceneUnderstandingSample", + "rootNamespace": "", + "references": [ + "GUID:4847341ff46394e83bb78fbd0652937e", + "GUID:96aa6ba065960476598f8f643e7252b6", + "GUID:75469ad4d38634e559750d17036d5f7c", + "GUID:c34271c4bb951904aa11cacc978a4396" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/HTC.VIVE.OPENXR.SceneUnderstandingSample.asmdef.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/HTC.VIVE.OPENXR.SceneUnderstandingSample.asmdef.meta new file mode 100644 index 0000000..bd290cc --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/HTC.VIVE.OPENXR.SceneUnderstandingSample.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a94fe08d394928749966d18ef36c5e7c +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/InputActions.inputactions b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/InputActions.inputactions new file mode 100644 index 0000000..d97b36a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/InputActions.inputactions @@ -0,0 +1,98 @@ +{ + "name": "InputActions", + "maps": [ + { + "name": "LeftHand", + "id": "580a5840-224e-464f-83c2-75974c6b515b", + "actions": [ + { + "name": "TriggerPress", + "type": "Button", + "id": "abf3e2de-2bcc-4780-ab0f-39b95befd95b", + "expectedControlType": "Button", + "processors": "", + "interactions": "" + }, + { + "name": "GripPress", + "type": "Button", + "id": "d4514ab2-45f3-4137-86d5-4fcc68e45e12", + "expectedControlType": "Button", + "processors": "", + "interactions": "" + } + ], + "bindings": [ + { + "name": "", + "id": "c360e2ed-9ad6-4103-af8b-ffae3c26ca55", + "path": "{LeftHand}/triggerPressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "TriggerPress", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "1b896f30-9a63-4ed6-9cb9-2015ee000663", + "path": "{LeftHand}/gripPressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "GripPress", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "RightHand", + "id": "9e47d12d-aa53-4f65-b9c2-4dc5f6d3ec4d", + "actions": [ + { + "name": "GripPress", + "type": "Button", + "id": "f8318062-27ce-44a5-9cd1-1cc65c2423ed", + "expectedControlType": "Button", + "processors": "", + "interactions": "" + }, + { + "name": "TriggerPress", + "type": "Button", + "id": "2d4c4d7e-75d6-41b9-a8af-678783f52839", + "expectedControlType": "Button", + "processors": "", + "interactions": "" + } + ], + "bindings": [ + { + "name": "", + "id": "c35117b2-b6a1-4069-aa57-47c5a9835f10", + "path": "{RightHand}/triggerPressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "TriggerPress", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d215e5c1-c882-4a74-b856-01b22e58627b", + "path": "{RightHand}/gripPressed", + "interactions": "", + "processors": "", + "groups": "", + "action": "GripPress", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [] +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/InputActions.inputactions.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/InputActions.inputactions.meta new file mode 100644 index 0000000..8ff216a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/InputActions.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 4774c2793d02a0142baed37a01688512 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 0 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials.meta new file mode 100644 index 0000000..33306e6 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 40077ed6b8ad5db47969124eb8abcc54 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Bouncing Object.physicMaterial b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Bouncing Object.physicMaterial new file mode 100644 index 0000000..1153103 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Bouncing Object.physicMaterial @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!134 &13400000 +PhysicMaterial: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Bouncing Object + dynamicFriction: 0.6 + staticFriction: 0.6 + bounciness: 0.6 + frictionCombine: 0 + bounceCombine: 0 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Bouncing Object.physicMaterial.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Bouncing Object.physicMaterial.meta new file mode 100644 index 0000000..3350539 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Bouncing Object.physicMaterial.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 51ba229a7845f1544a4fa04f7e3f778c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 13400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Cosmos Controller.mat b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Cosmos Controller.mat new file mode 100644 index 0000000..596ae25 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Cosmos Controller.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Cosmos Controller + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _METALLICGLOSSMAP + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 05846a6377efe7b4ca1a163e941e0560, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 642f19525494c4d4880a68dad64e14b6, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Cosmos Controller.mat.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Cosmos Controller.mat.meta new file mode 100644 index 0000000..6807999 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Cosmos Controller.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7e40d5b6de9c7b24cbd0293dd20805ea +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Blue.mat b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Blue.mat new file mode 100644 index 0000000..25a0d6b --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Blue.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Light Blue + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.44716978, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Blue.mat.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Blue.mat.meta new file mode 100644 index 0000000..3fe4934 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Blue.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 733cda6d9847c07449732d0798bb39a2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Red.mat b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Red.mat new file mode 100644 index 0000000..b0b6cd6 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Red.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Light Red + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 0.5509434, b: 0.58785224, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Red.mat.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Red.mat.meta new file mode 100644 index 0000000..ca59e95 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Red.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6b8e71e9989283458383b5c1a439a9b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Yellow.mat b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Yellow.mat new file mode 100644 index 0000000..ca8d19e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Yellow.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Light Yellow + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.9895455, g: 1, b: 0.56981134, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Yellow.mat.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Yellow.mat.meta new file mode 100644 index 0000000..b5f6f94 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Light Yellow.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6c963700ce992eb479ae65352fde0b61 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Shaders.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Shaders.meta new file mode 100644 index 0000000..15d71f9 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a175a67c9b41ea74bb471dc966cfb1ad +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Shaders/OcclusionShader.shader b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Shaders/OcclusionShader.shader new file mode 100644 index 0000000..5c2010e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Shaders/OcclusionShader.shader @@ -0,0 +1,52 @@ +Shader "Custom/OcclusionShader" +{ + SubShader + { + Tags { "RenderType"="Opaque" } + Tags { "Queue"="Geometry-1" } + ZWrite On + ZTest LEqual + ColorMask 0 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f + { + float4 vertex : SV_POSITION; + + UNITY_VERTEX_OUTPUT_STEREO + }; + + v2f vert(appdata v) + { + v2f o; + + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_OUTPUT(v2f, o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + o.vertex=UnityObjectToClipPos(v.vertex); + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + return fixed4(0.0, 0.0, 0.0, 0.0); + } + ENDCG + } + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Shaders/OcclusionShader.shader.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Shaders/OcclusionShader.shader.meta new file mode 100644 index 0000000..f13eb77 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Shaders/OcclusionShader.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: c5dc16cd88a72994c8efa3274f51585d +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures.meta new file mode 100644 index 0000000..1d05d1f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5b2f239e4ce78a74d90a72e1c1d987a6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController.meta new file mode 100644 index 0000000..5298eff --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 328255fcb4d49324e90e2b64d973aad8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_albedo.TGA b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_albedo.TGA new file mode 100644 index 0000000..562d1ce --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_albedo.TGA @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5746fbb330cd3513fd02aadb08f00d0db042069ffa88cb3a279e68b244f70a0 +size 12582956 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_albedo.TGA.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_albedo.TGA.meta new file mode 100644 index 0000000..917c86a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_albedo.TGA.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 05846a6377efe7b4ca1a163e941e0560 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_specular.TGA b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_specular.TGA new file mode 100644 index 0000000..5e69541 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_specular.TGA @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65f6064787c16e7929504bf916134b1ffc35f7ccbde2a4687e2963210cb68d84 +size 12582956 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_specular.TGA.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_specular.TGA.meta new file mode 100644 index 0000000..9a87e12 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Textures/CosmosController/controller_cosmos_specular.TGA.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 642f19525494c4d4880a68dad64e14b6 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Transparent Occlusion.mat b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Transparent Occlusion.mat new file mode 100644 index 0000000..2c2fd83 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Transparent Occlusion.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Transparent Occlusion + m_Shader: {fileID: 4800000, guid: c5dc16cd88a72994c8efa3274f51585d, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Transparent Occlusion.mat.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Transparent Occlusion.mat.meta new file mode 100644 index 0000000..9fdf2a3 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Materials/Transparent Occlusion.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6ae6f0f40939f294aae5b64149c541c1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature.meta new file mode 100644 index 0000000..2b5ae8c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 335cbf161ed33564db97059a8ba91c4b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/.sample.json b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/.sample.json new file mode 100644 index 0000000..f217056 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/.sample.json @@ -0,0 +1,5 @@ +{ + "displayName": "Meshing Subsystem Extension", + "description": "Shows a teapot mesh generated from native mesh subsystem with physics baked in background.", + "createSeparatePackage": false +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Default.prefab b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Default.prefab new file mode 100644 index 0000000..820101f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Default.prefab @@ -0,0 +1,98 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8233015818774569630 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8233015818774569626} + - component: {fileID: 8233015818774569629} + - component: {fileID: 8233015818774569628} + - component: {fileID: 8233015818774569631} + m_Layer: 0 + m_Name: DynamicMeshPrefab_Default + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8233015818774569626 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8233015818774569630} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8233015818774569629 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8233015818774569630} + m_Mesh: {fileID: 0} +--- !u!23 &8233015818774569628 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8233015818774569630} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &8233015818774569631 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8233015818774569630} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: -1 + m_Mesh: {fileID: 0} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Default.prefab.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Default.prefab.meta new file mode 100644 index 0000000..bf19a8d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Default.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 66ff45e19501b9d46953d454f972a44f +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Occlusion.prefab b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Occlusion.prefab new file mode 100644 index 0000000..962c95e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Occlusion.prefab @@ -0,0 +1,98 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &5489681467619248415 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5489681467619248411} + - component: {fileID: 5489681467619248412} + - component: {fileID: 5489681467619248413} + - component: {fileID: 5489681467619248414} + m_Layer: 0 + m_Name: DynamicMeshPrefab + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5489681467619248411 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5489681467619248415} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &5489681467619248412 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5489681467619248415} + m_Mesh: {fileID: 0} +--- !u!23 &5489681467619248413 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5489681467619248415} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 6ae6f0f40939f294aae5b64149c541c1, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!64 &5489681467619248414 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5489681467619248415} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: -1 + m_Mesh: {fileID: 0} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Occlusion.prefab.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Occlusion.prefab.meta new file mode 100644 index 0000000..17c9a76 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/DynamicMeshPrefab_Occlusion.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3ebc6439fa8ba274985db624056324df +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/FallingSphere.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/FallingSphere.cs new file mode 100644 index 0000000..42ae0bf --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/FallingSphere.cs @@ -0,0 +1,30 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace UnityEngine.XR.OpenXR.Samples.MeshingFeature +{ + public class FallingSphere : MonoBehaviour + { + private Vector3 starting; + private Rigidbody rb; + + // Start is called before the first frame update + void Start() + { + rb = GetComponent(); + starting = transform.position; + } + + // Update is called once per frame + void FixedUpdate() + { + if (transform.position.y < -10) + { + rb.velocity = Vector3.zero; + rb.angularVelocity = Vector3.zero; + rb.MovePosition(starting); + } + } + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/FallingSphere.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/FallingSphere.cs.meta new file mode 100644 index 0000000..9a1ff7d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/FallingSphere.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ffaae9a29fa4521418bd21356c1f6347 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingBehaviour.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingBehaviour.cs new file mode 100644 index 0000000..d740af4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingBehaviour.cs @@ -0,0 +1,290 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.SubsystemsImplementation; +using UnityEngine.XR; +using UnityEngine.InputSystem; +using VIVE.SceneUnderstanding; + +namespace UnityEngine.XR.OpenXR.Samples.MeshingFeature +{ + public class MeshingBehaviour : MonoBehaviour + { + public GameObject emptyMeshPrefab_Default; + public GameObject emptyMeshPrefab_Occlusion; + public Material meshMat_Default; + public Material meshMat_Occlusion; + private GameObject emptyMeshPrefab; + private Material meshesMat; + public TextMesh textMesh; + public Transform target; + public bool isOcclusion = true; + private XRMeshSubsystem s_MeshSubsystem; + private List s_MeshInfos = new List(); + + private Dictionary m_MeshIdToGo = new Dictionary(); + +#region OpenXR feature + private MeshingTeapotFeature m_MeshingFeature; +#endregion + +#region Scene compute consistency + + [Header("Scene compute consistency")] + [Tooltip("Scene compute consistency can only be set before entering the play mode.")] + public XrSceneComputeConsistencyMSFT m_SceneComputeConsistency = + XrSceneComputeConsistencyMSFT.SnapshotIncompleteFast; +#endregion + +#region Scene compute bound variables + + [Header("Scene compute bounds")] + + // Sphere bound. + public bool m_EnableSphereBound; + private bool m_PreviousEnableSphereBound = false; + + // A default sphere game object. + public GameObject m_SphereBoundObject; + + // Box bound. + public bool m_EnableBoxBound; + private bool m_PreviousEnableBoxBound = false; + + // A default cube game object + // Box bound is enabled by default. + public GameObject m_BoxBoundObject; + + // Frustum bound. + public bool m_EnableFrustumBound; + private bool m_PreviousEnableFrustumBound = false; + public Camera m_FrustumBoundCamera; + public float m_FarDistance = 2.0f; +#endregion + +#region Mesh compute lod variables + [Header("Mesh compute lod")] + public XrMeshComputeLodMSFT m_MeshComputeLod = + XrMeshComputeLodMSFT.Coarse; + private XrMeshComputeLodMSFT m_PrevMeshComputeLod = + XrMeshComputeLodMSFT.Coarse; +#endregion + void Start() + { + // Set the mesh prefab to default material. + if(emptyMeshPrefab_Occlusion == null || emptyMeshPrefab_Default == null) + { + return; + } + emptyMeshPrefab = isOcclusion ? emptyMeshPrefab_Occlusion : emptyMeshPrefab_Default; + + m_MeshingFeature = OpenXRSettings.Instance.GetFeature(); + if (m_MeshingFeature == null || m_MeshingFeature.enabled == false) + { + enabled = false; + return; + } + + var meshSubsystems = new List(); + SubsystemManager.GetInstances(meshSubsystems); + if (meshSubsystems.Count == 1) + { + s_MeshSubsystem = meshSubsystems[0]; + textMesh.gameObject.SetActive(false); + } + else + { +#if UNITY_EDITOR + textMesh.text = "Failed to initialize MeshSubsystem.\nTry reloading the Unity Editor"; +#else + textMesh.text = "Failed to initialize MeshSubsystem."; +#endif + enabled = false; + } + + if (m_FrustumBoundCamera == null) + { + m_FrustumBoundCamera = Camera.main; + } + + // Set scene compute consistency at the start. + m_MeshingFeature.SetSceneComputeConsistency(m_SceneComputeConsistency); + + // Set mesh compute lod. + m_MeshingFeature.SetMeshComputeLod(m_MeshComputeLod); + } + + void Update() + { + if (s_MeshSubsystem.running && s_MeshSubsystem.TryGetMeshInfos(s_MeshInfos)) + { + foreach (var meshInfo in s_MeshInfos) + { + switch (meshInfo.ChangeState) + { + case MeshChangeState.Added: + case MeshChangeState.Updated: + if (!m_MeshIdToGo.TryGetValue(meshInfo.MeshId, out var go)) + { + go = Instantiate(emptyMeshPrefab, target, false); + m_MeshIdToGo[meshInfo.MeshId] = go; + } + + var mesh = go.GetComponent().mesh; + var col = go.GetComponent(); + + s_MeshSubsystem.GenerateMeshAsync(meshInfo.MeshId, mesh, col, MeshVertexAttributes.None, + result => + { + result.Mesh.RecalculateNormals(); + }); + break; + case MeshChangeState.Removed: + if (m_MeshIdToGo.TryGetValue(meshInfo.MeshId, out var meshGo)) + { + Destroy(meshGo); + m_MeshIdToGo.Remove(meshInfo.MeshId); + } + break; + default: + break; + } + } + } + + // Read keyboard input by the Input System package. + if (Keyboard.current.sKey.wasPressedThisFrame) + { + // Toggle the sphere bound. + m_EnableSphereBound ^= true; + } + if (Keyboard.current.bKey.wasPressedThisFrame) + { + // Toggle the box bound. + m_EnableBoxBound ^= true; + } + if (Keyboard.current.fKey.wasPressedThisFrame) + { + // Toggle the frustum bound. + m_EnableFrustumBound ^= true; + } + if (Keyboard.current.numpad1Key.wasPressedThisFrame) + { + // Set mesh lod to coarse. + m_MeshComputeLod = XrMeshComputeLodMSFT.Coarse; + } + if (Keyboard.current.numpad2Key.wasPressedThisFrame) + { + // Set mesh lod to medium. + m_MeshComputeLod = XrMeshComputeLodMSFT.Medium; + } + if (Keyboard.current.numpad3Key.wasPressedThisFrame) + { + // Set mesh lod to fine. + m_MeshComputeLod = XrMeshComputeLodMSFT.Fine; + } + if (Keyboard.current.numpad4Key.wasPressedThisFrame) + { + // Set mesh lod to unlimited. + m_MeshComputeLod = XrMeshComputeLodMSFT.Unlimited; + } + + if (m_MeshingFeature == null) return; + + // Set scene computation sphere bound. + if (m_EnableSphereBound) + { + SetSceneComputeSphereBound(); + } + else if (m_PreviousEnableSphereBound) + { + // The bound becomes disabled. Clear related data in the plugin. + m_MeshingFeature.ClearSceneComputeBounds(XrSceneBoundType.Sphere); + } + m_PreviousEnableSphereBound = m_EnableSphereBound; + + // Set scene computation box bound. + if (m_EnableBoxBound) + { + SetSceneComputeOrientedBoxBound(); + } + else if (m_PreviousEnableBoxBound) + { + // The bound becomes disabled. Clear related data in the plugin. + m_MeshingFeature.ClearSceneComputeBounds(XrSceneBoundType.OrientedBox); + } + m_PreviousEnableBoxBound = m_EnableBoxBound; + + // Set scene computation frustum bound. + if (m_EnableFrustumBound) + { + SetSceneComputeFrustumBound(); + } + else if (m_PreviousEnableFrustumBound) + { + // The bound becomes disabled. Clear related data in the plugin. + m_MeshingFeature.ClearSceneComputeBounds(XrSceneBoundType.Frustum); + } + m_PreviousEnableFrustumBound = m_EnableFrustumBound; + + // Set mesh compute lod if updated. + if (m_MeshComputeLod != m_PrevMeshComputeLod) + { + m_MeshingFeature.SetMeshComputeLod(m_MeshComputeLod); + m_PrevMeshComputeLod = m_MeshComputeLod; + } + } + + void SetSceneComputeSphereBound() + { + if (m_SphereBoundObject == null) return; + + m_MeshingFeature.SetSceneComputeSphereBound(m_SphereBoundObject.transform.position, + 0.5f * m_SphereBoundObject.transform.localScale.x); // The radius of a default sphere is 0.5f. + } + + void SetSceneComputeOrientedBoxBound() + { + if (m_BoxBoundObject == null) return; + + m_MeshingFeature.SetSceneComputeOrientedBoxBound(m_BoxBoundObject.transform, + m_BoxBoundObject.transform.localScale); // The widths of a default cube is 1.0f. + } + + void SetSceneComputeFrustumBound() + { + var camera = m_FrustumBoundCamera; + if (camera == null) return; + var halfVerticalFieldOfView = 0.5f * camera.fieldOfView * Mathf.Deg2Rad; + var halfHorizontalFieldOfView = 0.5f * Camera.VerticalToHorizontalFieldOfView( + camera.fieldOfView, camera.aspect) * Mathf.Deg2Rad; + m_MeshingFeature.SetSceneComputeFrustumBound(camera.transform, + halfVerticalFieldOfView, -1 * halfVerticalFieldOfView, + halfHorizontalFieldOfView, -1 * halfHorizontalFieldOfView, + m_FarDistance); + // camera.farClipPlane); + } + + public void SwitchMeshPrefab() + { + if(emptyMeshPrefab_Default != null && emptyMeshPrefab_Occlusion != null) + { + isOcclusion ^= true; + Debug.Log("isOcclusion: " + isOcclusion); + emptyMeshPrefab = isOcclusion ? emptyMeshPrefab_Occlusion : emptyMeshPrefab_Default; + Renderer[] allChildern = target.transform.GetComponentsInChildren(); + foreach(Renderer child in allChildern) + { + if(isOcclusion) + { + child.material = meshMat_Occlusion; + } + else + { + child.material = meshMat_Default; + } + } + } + } + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingBehaviour.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingBehaviour.cs.meta new file mode 100644 index 0000000..b880733 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingBehaviour.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 541b7945275e11c439ee3beade94bda2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingFeature.unity b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingFeature.unity new file mode 100644 index 0000000..416543a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingFeature.unity @@ -0,0 +1,2981 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &73655845 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 73655847} + - component: {fileID: 73655846} + m_Layer: 0 + m_Name: XRRig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &73655846 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 73655845} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a2483b9bd782f9449a5972b61b7d51a9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_CameraFloorOffsetObject: {fileID: 2110888437} + m_RequestedTrackingMode: 2 + m_TrackingOriginMode: 1 + m_TrackingSpace: 1 + m_CameraYOffset: 0 +--- !u!4 &73655847 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 73655845} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2110888438} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &92011933 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 92011936} + - component: {fileID: 92011935} + - component: {fileID: 92011934} + m_Layer: 0 + m_Name: Message + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!102 &92011934 +TextMesh: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 92011933} + m_Text: Meshing Teapot Feature not enabled. + m_OffsetZ: 0 + m_CharacterSize: 1 + m_LineSpacing: 1 + m_Anchor: 1 + m_Alignment: 1 + m_TabSize: 4 + m_FontSize: 200 + m_FontStyle: 0 + m_RichText: 1 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_Color: + serializedVersion: 2 + rgba: 4279703464 +--- !u!23 &92011935 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 92011933} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10100, guid: 0000000000000000e000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!4 &92011936 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 92011933} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.1691825, y: -0.7208785, z: 8.426586} + m_LocalScale: {x: 0.05, y: 0.05, z: 0.05} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &138409153 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 138409154} + - component: {fileID: 138409159} + - component: {fileID: 138409158} + - component: {fileID: 138409157} + - component: {fileID: 138409156} + - component: {fileID: 138409155} + m_Layer: 0 + m_Name: Sphere2 (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &138409154 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 138409153} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.9691825, y: 1.8791214, z: -5.473414} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &138409155 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 138409153} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &138409156 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 138409153} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &138409157 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 138409153} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &138409158 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 138409153} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &138409159 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 138409153} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &158356506 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 158356507} + - component: {fileID: 158356510} + - component: {fileID: 158356509} + - component: {fileID: 158356508} + m_Layer: 0 + m_Name: MainCamera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &158356507 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158356506} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2110888438} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &158356508 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158356506} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2fadf230d1919748a9aa21d40f74619, type: 3} + m_Name: + m_EditorClassIdentifier: + m_TrackingType: 0 + m_UpdateType: 0 + m_PositionAction: + m_Name: Position + m_Type: 0 + m_ExpectedControlType: + m_Id: 1a88dcc3-439a-47a6-b19c-431ccb28ec5e + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 2995d4bb-5d1d-4c30-b587-203521f954f5 + m_Path: /centerEyePosition + m_Interactions: + m_Processors: + m_Groups: + m_Action: Position + m_Flags: 0 + m_RotationAction: + m_Name: Rotation + m_Type: 0 + m_ExpectedControlType: + m_Id: 50592bfa-935a-4545-ae1e-5d61ecb9c779 + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: dfc13d97-a43d-47f7-9baa-aee8ec794422 + m_Path: /centerEyeRotation + m_Interactions: + m_Processors: + m_Groups: + m_Action: Rotation + m_Flags: 0 +--- !u!81 &158356509 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158356506} + m_Enabled: 1 +--- !u!20 &158356510 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 158356506} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!1 &275136526 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 275136531} + - component: {fileID: 275136530} + - component: {fileID: 275136529} + - component: {fileID: 275136528} + - component: {fileID: 275136527} + - component: {fileID: 275136532} + m_Layer: 0 + m_Name: Sphere1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!54 &275136527 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275136526} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &275136528 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275136526} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &275136529 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275136526} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &275136530 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275136526} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &275136531 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275136526} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.1691825, y: 1.2791215, z: -5.6734138} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &275136532 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275136526} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &345897533 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 345897535} + - component: {fileID: 345897534} + m_Layer: 0 + m_Name: MeshSubsystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &345897534 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 345897533} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 541b7945275e11c439ee3beade94bda2, type: 3} + m_Name: + m_EditorClassIdentifier: + emptyMeshPrefab_Default: {fileID: 8233015818774569630, guid: 66ff45e19501b9d46953d454f972a44f, type: 3} + emptyMeshPrefab_Occlusion: {fileID: 5489681467619248415, guid: 3ebc6439fa8ba274985db624056324df, type: 3} + meshMat_Default: {fileID: 10302, guid: 0000000000000000f000000000000000, type: 0} + meshMat_Occlusion: {fileID: 2100000, guid: 6ae6f0f40939f294aae5b64149c541c1, type: 2} + textMesh: {fileID: 92011934} + target: {fileID: 2084199821} + isOcclusion: 1 + m_SceneComputeConsistency: 2 + m_EnableSphereBound: 0 + m_SphereBoundObject: {fileID: 1595152625} + m_EnableBoxBound: 1 + m_BoxBoundObject: {fileID: 776905528} + m_EnableFrustumBound: 0 + m_FrustumBoundCamera: {fileID: 0} + m_FarDistance: 2 + m_MeshComputeLod: 2 +--- !u!4 &345897535 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 345897533} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 776905532} + - {fileID: 1595152629} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &776905528 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 776905532} + - component: {fileID: 776905531} + - component: {fileID: 776905530} + - component: {fileID: 776905529} + m_Layer: 0 + m_Name: Box Bound + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!65 &776905529 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 776905528} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &776905530 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 776905528} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &776905531 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 776905528} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &776905532 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 776905528} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 10, y: 10, z: 10} + m_Children: [] + m_Father: {fileID: 345897535} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &822688087 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 822688088} + - component: {fileID: 822688093} + - component: {fileID: 822688092} + - component: {fileID: 822688091} + - component: {fileID: 822688090} + - component: {fileID: 822688089} + m_Layer: 0 + m_Name: Sphere2 (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &822688088 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 822688087} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.2781825, y: 2.5191216, z: -5.995414} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 12 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &822688089 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 822688087} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &822688090 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 822688087} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &822688091 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 822688087} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &822688092 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 822688087} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &822688093 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 822688087} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &948312405 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 948312407} + - component: {fileID: 948312406} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &948312406 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948312405} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &948312407 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 948312405} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &957459849 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 957459850} + - component: {fileID: 957459855} + - component: {fileID: 957459854} + - component: {fileID: 957459853} + - component: {fileID: 957459852} + - component: {fileID: 957459851} + m_Layer: 0 + m_Name: Sphere1 (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &957459850 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 957459849} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.0641825, y: 1.7531215, z: -5.992414} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &957459851 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 957459849} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &957459852 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 957459849} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &957459853 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 957459849} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &957459854 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 957459849} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &957459855 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 957459849} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1004965811 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1004965813} + - component: {fileID: 1004965812} + m_Layer: 0 + m_Name: PassThrough + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1004965812 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1004965811} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 86cba7bb45e47c34f83cac2fac8ae085, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &1004965813 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1004965811} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.4336612, y: 1.7757361, z: 6.1987004} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1125445830 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1125445831} + - component: {fileID: 1125445836} + - component: {fileID: 1125445835} + - component: {fileID: 1125445834} + - component: {fileID: 1125445833} + - component: {fileID: 1125445832} + m_Layer: 0 + m_Name: Sphere2 (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1125445831 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1125445830} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.9691825, y: 2.4791217, z: -5.6734138} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1125445832 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1125445830} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &1125445833 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1125445830} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &1125445834 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1125445830} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1125445835 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1125445830} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1125445836 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1125445830} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1136754323 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1136754324} + - component: {fileID: 1136754329} + - component: {fileID: 1136754328} + - component: {fileID: 1136754327} + - component: {fileID: 1136754326} + - component: {fileID: 1136754325} + m_Layer: 0 + m_Name: Sphere2 (9) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1136754324 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136754323} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.1781826, y: 2.8191214, z: -5.895414} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1136754325 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136754323} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &1136754326 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136754323} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &1136754327 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136754323} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1136754328 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136754323} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1136754329 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136754323} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1422713914 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1422713915} + - component: {fileID: 1422713920} + - component: {fileID: 1422713919} + - component: {fileID: 1422713918} + - component: {fileID: 1422713917} + - component: {fileID: 1422713916} + m_Layer: 0 + m_Name: Sphere2 (11) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1422713915 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1422713914} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.1781826, y: 3.4191217, z: -6.0954137} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 15 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1422713916 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1422713914} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &1422713917 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1422713914} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &1422713918 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1422713914} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1422713919 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1422713914} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1422713920 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1422713914} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1458848453 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1458848454} + - component: {fileID: 1458848459} + - component: {fileID: 1458848458} + - component: {fileID: 1458848457} + - component: {fileID: 1458848456} + - component: {fileID: 1458848455} + m_Layer: 0 + m_Name: Sphere2 (6) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1458848454 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1458848453} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.0641825, y: 2.6531215, z: -5.7924137} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1458848455 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1458848453} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &1458848456 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1458848453} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &1458848457 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1458848453} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1458848458 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1458848453} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1458848459 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1458848453} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1476277159 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1476277160} + - component: {fileID: 1476277165} + - component: {fileID: 1476277164} + - component: {fileID: 1476277163} + - component: {fileID: 1476277162} + - component: {fileID: 1476277161} + m_Layer: 0 + m_Name: Sphere2 (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1476277160 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1476277159} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.1691825, y: 2.1791215, z: -5.473414} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1476277161 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1476277159} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &1476277162 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1476277159} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &1476277163 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1476277159} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1476277164 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1476277159} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1476277165 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1476277159} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1496522538 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1496522540} + - component: {fileID: 1496522539} + m_Layer: 0 + m_Name: Point Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1496522539 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1496522538} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 2 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 0.5 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 0.5 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1496522540 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1496522538} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0.5, y: 2.5, z: 1} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1590263906 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1590263907} + m_Layer: 0 + m_Name: SceneObjects + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1590263907 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590263906} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 2.1691825, y: 0.7208785, z: 6.573414} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 275136531} + - {fileID: 2007910546} + - {fileID: 138409154} + - {fileID: 1476277160} + - {fileID: 1125445831} + - {fileID: 92011936} + - {fileID: 957459850} + - {fileID: 1855287470} + - {fileID: 1962129062} + - {fileID: 1458848454} + - {fileID: 1879581882} + - {fileID: 1948938575} + - {fileID: 822688088} + - {fileID: 1136754324} + - {fileID: 1879849963} + - {fileID: 1422713915} + m_Father: {fileID: 0} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1595152625 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1595152629} + - component: {fileID: 1595152628} + - component: {fileID: 1595152627} + - component: {fileID: 1595152626} + m_Layer: 0 + m_Name: Sphere Bound + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!135 &1595152626 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1595152625} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1595152627 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1595152625} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1595152628 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1595152625} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1595152629 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1595152625} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0.5, z: 0.5} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 345897535} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1855287469 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1855287470} + - component: {fileID: 1855287475} + - component: {fileID: 1855287474} + - component: {fileID: 1855287473} + - component: {fileID: 1855287472} + - component: {fileID: 1855287471} + m_Layer: 0 + m_Name: Sphere2 (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1855287470 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855287469} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.9641825, y: 2.0531216, z: -5.892414} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1855287471 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855287469} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &1855287472 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855287469} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &1855287473 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855287469} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1855287474 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855287469} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1855287475 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1855287469} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1879581881 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1879581882} + - component: {fileID: 1879581887} + - component: {fileID: 1879581886} + - component: {fileID: 1879581885} + - component: {fileID: 1879581884} + - component: {fileID: 1879581883} + m_Layer: 0 + m_Name: Sphere2 (7) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1879581882 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879581881} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.8641825, y: 2.9531217, z: -5.992414} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1879581883 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879581881} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &1879581884 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879581881} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &1879581885 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879581881} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1879581886 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879581881} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1879581887 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879581881} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1879849962 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1879849963} + - component: {fileID: 1879849968} + - component: {fileID: 1879849967} + - component: {fileID: 1879849966} + - component: {fileID: 1879849965} + - component: {fileID: 1879849964} + m_Layer: 0 + m_Name: Sphere2 (10) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1879849963 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879849962} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.3781826, y: 3.1191216, z: -5.895414} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 14 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1879849964 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879849962} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &1879849965 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879849962} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &1879849966 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879849962} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1879849967 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879849962} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1879849968 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1879849962} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1948938574 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1948938575} + - component: {fileID: 1948938580} + - component: {fileID: 1948938579} + - component: {fileID: 1948938578} + - component: {fileID: 1948938577} + - component: {fileID: 1948938576} + m_Layer: 0 + m_Name: Sphere1 (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1948938575 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1948938574} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.3781826, y: 2.2191215, z: -6.0954137} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1948938576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1948938574} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &1948938577 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1948938574} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &1948938578 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1948938574} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1948938579 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1948938574} + m_Enabled: 0 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1948938580 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1948938574} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1962129061 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1962129062} + - component: {fileID: 1962129067} + - component: {fileID: 1962129066} + - component: {fileID: 1962129065} + - component: {fileID: 1962129064} + - component: {fileID: 1962129063} + m_Layer: 0 + m_Name: Sphere2 (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1962129062 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1962129061} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.8641825, y: 2.3531213, z: -5.7924137} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1962129063 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1962129061} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!54 &1962129064 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1962129061} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &1962129065 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1962129061} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1962129066 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1962129061} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1962129067 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1962129061} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2007910541 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2007910546} + - component: {fileID: 2007910545} + - component: {fileID: 2007910544} + - component: {fileID: 2007910543} + - component: {fileID: 2007910542} + - component: {fileID: 2007910547} + m_Layer: 0 + m_Name: Sphere2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!54 &2007910542 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2007910541} + serializedVersion: 2 + m_Mass: 0.2 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 1 +--- !u!135 &2007910543 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2007910541} + m_Material: {fileID: 13400000, guid: 51ba229a7845f1544a4fa04f7e3f778c, type: 2} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &2007910544 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2007910541} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 733cda6d9847c07449732d0798bb39a2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &2007910545 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2007910541} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &2007910546 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2007910541} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -2.0691826, y: 1.5791215, z: -5.573414} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 1590263907} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2007910547 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2007910541} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ffaae9a29fa4521418bd21356c1f6347, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &2084199820 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2084199821} + m_Layer: 0 + m_Name: Meshes + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2084199821 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2084199820} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2110888437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2110888438} + m_Layer: 0 + m_Name: Camera Offset + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2110888438 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2110888437} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 158356507} + m_Father: {fileID: 73655847} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &4070507782304364091 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 3439849492460785795, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781047365259, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781047365268, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: camera + value: + objectReference: {fileID: 73655845} + - target: {fileID: 4070507781047365268, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: MeshSubSystem + value: + objectReference: {fileID: 345897533} + - target: {fileID: 4070507781047365268, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_ActionReferenceGrip + value: + objectReference: {fileID: 6948011263818861791, guid: 4774c2793d02a0142baed37a01688512, type: 3} + - target: {fileID: 4070507781047365268, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_ActionReferenceTrigger + value: + objectReference: {fileID: 1469815666870366873, guid: 4774c2793d02a0142baed37a01688512, type: 3} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_RootOrder + value: 6 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382180, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507781819382182, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_ActionAsset + value: + objectReference: {fileID: -944628639613478452, guid: 4774c2793d02a0142baed37a01688512, type: 3} + - target: {fileID: 4070507781819382183, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_Name + value: Controller + objectReference: {fileID: 0} + - target: {fileID: 4070507782304364093, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_Enabled + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 4070507782448128972, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: MeshSubSystem + value: + objectReference: {fileID: 345897533} + - target: {fileID: 4070507782448128972, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_ActionReferenceGrip + value: + objectReference: {fileID: 560778686303813712, guid: 4774c2793d02a0142baed37a01688512, type: 3} + - target: {fileID: 4070507782448128972, guid: 2812476435bed9541adc96fd390419fb, type: 3} + propertyPath: m_ActionReferenceTrigger + value: + objectReference: {fileID: -7526626514696572871, guid: 4774c2793d02a0142baed37a01688512, type: 3} + m_RemovedComponents: + - {fileID: 4070507782304364093, guid: 2812476435bed9541adc96fd390419fb, type: 3} + m_SourcePrefab: {fileID: 100100000, guid: 2812476435bed9541adc96fd390419fb, type: 3} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingFeature.unity.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingFeature.unity.meta new file mode 100644 index 0000000..0b2a3cb --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingFeature.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d1889e247a55eae4d96baf9f3b786800 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingTeapotFeature.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingTeapotFeature.cs new file mode 100644 index 0000000..5020a95 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingTeapotFeature.cs @@ -0,0 +1,215 @@ +using System; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine.XR.OpenXR.Features; +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif +using VIVE.SceneUnderstanding; +namespace UnityEngine.XR.OpenXR.Samples.MeshingFeature +{ + /// + /// Example extension showing how to supply a mesh from native code with OpenXR SceneUnderstanding functions. + /// +#if UNITY_EDITOR + [OpenXRFeature(UiName = "Meshing Subsystem", + BuildTargetGroups = new[] { BuildTargetGroup.Standalone, BuildTargetGroup.WSA, BuildTargetGroup.Android }, + Company = "HTC", + Desc = "Example extension showing how to supply a mesh from native code with OpenXR SceneUnderstanding functions.", + DocumentationLink = "https://developer.vive.com/resources/openxr/openxr-pcvr/tutorials/unity/interact-real-world-openxr-scene-understanding/", + OpenxrExtensionStrings = "", + Version = "0.0.1", + FeatureId = featureId)] +#endif + public class MeshingTeapotFeature : SceneUnderstanding_OpenXR_API + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + new public const string featureId = "com.unity.openxr.feature.example.meshing"; + private static List s_MeshDescriptors = + new List(); +#region Subsystem callbacks + /// + protected override void OnSubsystemCreate () + { + CreateSubsystem(s_MeshDescriptors, "Sample Meshing"); + } + + /// + protected override void OnSubsystemStart () + { + StartSubsystem(); + } + + /// + protected override void OnSubsystemStop () + { + StopSubsystem(); + } + + /// + protected override void OnSubsystemDestroy () + { + DestroySubsystem(); + } + #endregion + + #region OpenXR callbacks + protected override void OnSessionCreate(ulong xrSession) + { + UnityEngine.Debug.Log($"OnSessionCreate({xrSession})"); + m_XrSession = xrSession; + + NativeApi.SetOpenXRVariables(m_XrInstance, m_XrSession, + Marshal.GetFunctionPointerForDelegate(m_XrEnumerateReferenceSpaces), + Marshal.GetFunctionPointerForDelegate(m_XrCreateReferenceSpace), + Marshal.GetFunctionPointerForDelegate(m_XrDestroySpace), + Marshal.GetFunctionPointerForDelegate(m_XrEnumerateSceneComputeFeaturesMSFT), + Marshal.GetFunctionPointerForDelegate(m_XrCreateSceneObserverMSFT), + Marshal.GetFunctionPointerForDelegate(m_XrDestroySceneObserverMSFT), + Marshal.GetFunctionPointerForDelegate(m_XrCreateSceneMSFT), + Marshal.GetFunctionPointerForDelegate(m_XrDestroySceneMSFT), + Marshal.GetFunctionPointerForDelegate(m_XrComputeNewSceneMSFT), + Marshal.GetFunctionPointerForDelegate(m_XrGetSceneComputeStateMSFT), + Marshal.GetFunctionPointerForDelegate(m_XrGetSceneComponentsMSFT), + Marshal.GetFunctionPointerForDelegate(m_XrLocateSceneComponentsMSFT), + Marshal.GetFunctionPointerForDelegate(m_XrGetSceneMeshBuffersMSFT)); + systemProperties.type = XrStructureType.XR_TYPE_SYSTEM_PROPERTIES; + XrSystemPassThroughPropertiesHTC SystemPassThroughPropertiesHTC; + SystemPassThroughPropertiesHTC.type = XrStructureType.XR_TYPE_SYSTEM_PASS_THROUGH_PROPERTIES_HTC; + unsafe + { + systemProperties.next = (IntPtr)(&SystemPassThroughPropertiesHTC); + } + int res = xrGetSystemProperties(ref systemProperties); + if (res != (int)XrResult.XR_SUCCESS) + { + UnityEngine.Debug.Log("Failed to get systemproperties with error code : " + res); + + } + } + protected override void OnSessionDestroy(ulong xrSession) + { + UnityEngine.Debug.Log($"OnSessionDestroy({xrSession})"); + } + #endregion + + #region OpenXR scene compute consistency + public void SetSceneComputeConsistency(XrSceneComputeConsistencyMSFT consistency) + { + NativeApi.SetSceneComputeConsistency(consistency); + } + #endregion + +#region OpenXR scene compute bounds + public void SetSceneComputeSphereBound(Vector3 center, float radius) + { + // Convert to right-handed center. + center.z *= -1; + // Debug.Log("box, pos: " + center + ", radi: " + radius); + NativeApi.SetSceneComputeSphereBound(center, radius); + } + + public void SetSceneComputeOrientedBoxBound(Transform transform, Vector3 extent) + { + // Convert to right-handed transform. + Vector4 rotation; + Vector3 position; + ConvertTransform(transform, out rotation, out position); + NativeApi.SetSceneComputeOrientedBoxBound(rotation, position, extent); + } + + /// + /// Set scene computation frustum bound. + /// + /// The fov up angle in radian. + /// The fov down angle in radian. + /// The fov right angle in radian. + /// The fov left angle in radian. + public void SetSceneComputeFrustumBound(Transform transform, float angleUp, + float angleDown, float angleRight, float angleLeft, float farDistance) + { + // Convert to right-handed transform. + Vector4 rotation; + Vector3 position; + ConvertTransform(transform, out rotation, out position); + NativeApi.SetSceneComputeFrustumBound(rotation, position, angleUp, angleDown, + angleRight, angleLeft, farDistance); + } + + /// + /// Convert a Unity left-handed tranform to right-handed world-space + /// position and rotation. + /// Output right-handed quaternion rotation + /// Output right-handed position + /// + private void ConvertTransform(Transform transform, out Vector4 rotation, out Vector3 position) + { + // Get left-handed values. + position = transform.position; + float angle; + Vector3 axis; + transform.rotation.ToAngleAxis(out angle, out axis); + // Convert left-handed values to right-handed. + position.z *= -1; + angle *= -1; + axis.z *= -1; + var rotationQuaternion = Quaternion.AngleAxis(angle, axis); + rotation = Vector4.zero; + for (var i = 0; i < 4; ++i) rotation[i] = rotationQuaternion[i]; + } + + public void ClearSceneComputeBounds(XrSceneBoundType type) + { + NativeApi.ClearSceneComputeBounds(type); + } +#endregion + +#region OpenXR mesh compute lod + public void SetMeshComputeLod(XrMeshComputeLodMSFT lod) + { + NativeApi.SetMeshComputeLod(lod); + } +#endregion + + class NativeApi + { + [DllImport("MeshingFeaturePlugin")] + public static extern void SetOpenXRVariables(ulong instance, ulong session, + IntPtr PFN_XrEnumerateReferenceSpaces, + IntPtr PFN_XrCreateReferenceSpace, + IntPtr PFN_XrDestroySpace, + IntPtr PFN_XrEnumerateSceneComputeFeaturesMSFT, + IntPtr PFN_XrCreateSceneObserverMSFT, + IntPtr PFN_XrDestroySceneObserverMSFT, + IntPtr PFN_XrCreateSceneMSFT, + IntPtr PFN_XrDestroySceneMSFT, + IntPtr PFN_XrComputeNewSceneMSFT, + IntPtr PFN_XrGetSceneComputeStateMSFT, + IntPtr PFN_XrGetSceneComponentsMSFT, + IntPtr PFN_XrLocateSceneComponentsMSFT, + IntPtr PFN_XrGetSceneMeshBuffersMSFT); + + [DllImport("MeshingFeaturePlugin")] + public static extern void SetSceneComputeConsistency(XrSceneComputeConsistencyMSFT consistency); + + [DllImport("MeshingFeaturePlugin")] + public static extern void SetSceneComputeSphereBound(Vector3 center, float radius); + + [DllImport("MeshingFeaturePlugin")] + public static extern void SetSceneComputeOrientedBoxBound(Vector4 rotation, Vector3 position, Vector3 extent); + + [DllImport("MeshingFeaturePlugin")] + public static extern void SetSceneComputeFrustumBound(Vector4 rotation, Vector3 position, + float angleUp, float angleDown, float angleRight, float angleLeft, float farDistance); + + [DllImport("MeshingFeaturePlugin")] + public static extern void ClearSceneComputeBounds(XrSceneBoundType type); + + [DllImport("MeshingFeaturePlugin")] + public static extern void SetMeshComputeLod(XrMeshComputeLodMSFT lod); + } + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingTeapotFeature.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingTeapotFeature.cs.meta new file mode 100644 index 0000000..8d22ea3 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/MeshingTeapotFeature.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 773cfc63f8eb6744cb2c69c6d6a4cbf8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/README.md b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/README.md new file mode 100644 index 0000000..ffff257 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/README.md @@ -0,0 +1,9 @@ +# Meshing Feature Sample + +Demonstrates how to author an OpenXR Feature which sets up a custom XR Meshing Subsystem. + +The [XR SDK Meshing Subsystem](https://docs.unity3d.com/2020.2/Documentation/Manual/xrsdk-meshing.html) allows for one to surface procedurally-generated meshes within Unity. Within OpenXR this functionality can be exposed by using creating an `OpenXRFeature` to manage the subsystem. This sample uses a native plugin to provide a teapot mesh through a [XRMeshingSubsystem](https://docs.unity3d.com/2020.2/Documentation/ScriptReference/XR.XRMeshSubsystem.html) that is managed by an OpenXR feature. + +See the [XR SDK Meshing Subsystem](https://docs.unity3d.com/2020.2/Documentation/Manual/xrsdk-meshing.html) for more information about the meshing subsystem. + +See the [Unity OpenXR Documentation](https://docs.unity3d.com/Packages/com.unity.xr.openxr@latest) for more information on developing a custom feature. diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/README.md.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/README.md.meta new file mode 100644 index 0000000..cdf2023 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Meshing Subsystem Feature/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 10e59aeaf5edbf141ba393c666e48031 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/IUnityInterface.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/IUnityInterface.h new file mode 100644 index 0000000..ab713ec --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/IUnityInterface.h @@ -0,0 +1,206 @@ +// Unity Native Plugin API copyright © 2015 Unity Technologies ApS +// +// Licensed under the Unity Companion License for Unity - dependent projects--see[Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). +// +// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions. + +#pragma once + +// Unity native plugin API +// Compatible with C99 + +#if defined(__CYGWIN32__) + #define UNITY_INTERFACE_API __stdcall + #define UNITY_INTERFACE_EXPORT __declspec(dllexport) +#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(_WIN64) || defined(WINAPI_FAMILY) + #define UNITY_INTERFACE_API __stdcall + #define UNITY_INTERFACE_EXPORT __declspec(dllexport) +#elif defined(__MACH__) || defined(__ANDROID__) || defined(__linux__) || defined(LUMIN) + #define UNITY_INTERFACE_API + #define UNITY_INTERFACE_EXPORT __attribute__ ((visibility ("default"))) +#else + #define UNITY_INTERFACE_API + #define UNITY_INTERFACE_EXPORT +#endif + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// IUnityInterface is a registry of interfaces we choose to expose to plugins. +// +// USAGE: +// --------- +// To retrieve an interface a user can do the following from a plugin, assuming they have the header file for the interface: +// +// IMyInterface * ptr = registry->Get(); +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Unity Interface GUID +// Ensures global uniqueness. +// +// Template specialization is used to produce a means of looking up a GUID from its interface type at compile time. +// The net result should compile down to passing around the GUID. +// +// UNITY_REGISTER_INTERFACE_GUID should be placed in the header file of any interface definition outside of all namespaces. +// The interface structure and the registration GUID are all that is required to expose the interface to other systems. +struct UnityInterfaceGUID +{ +#ifdef __cplusplus + UnityInterfaceGUID(unsigned long long high, unsigned long long low) + : m_GUIDHigh(high) + , m_GUIDLow(low) + { + } + + UnityInterfaceGUID(const UnityInterfaceGUID& other) + { + m_GUIDHigh = other.m_GUIDHigh; + m_GUIDLow = other.m_GUIDLow; + } + + UnityInterfaceGUID& operator=(const UnityInterfaceGUID& other) + { + m_GUIDHigh = other.m_GUIDHigh; + m_GUIDLow = other.m_GUIDLow; + return *this; + } + + bool Equals(const UnityInterfaceGUID& other) const { return m_GUIDHigh == other.m_GUIDHigh && m_GUIDLow == other.m_GUIDLow; } + bool LessThan(const UnityInterfaceGUID& other) const { return m_GUIDHigh < other.m_GUIDHigh || (m_GUIDHigh == other.m_GUIDHigh && m_GUIDLow < other.m_GUIDLow); } +#endif + unsigned long long m_GUIDHigh; + unsigned long long m_GUIDLow; +}; +#ifdef __cplusplus +inline bool operator==(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return left.Equals(right); } +inline bool operator!=(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return !left.Equals(right); } +inline bool operator<(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return left.LessThan(right); } +inline bool operator>(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return right.LessThan(left); } +inline bool operator>=(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return !operator<(left, right); } +inline bool operator<=(const UnityInterfaceGUID& left, const UnityInterfaceGUID& right) { return !operator>(left, right); } +#else +typedef struct UnityInterfaceGUID UnityInterfaceGUID; +#endif + + +#ifdef __cplusplus + #define UNITY_DECLARE_INTERFACE(NAME) \ + struct NAME : IUnityInterface + +// Generic version of GetUnityInterfaceGUID to allow us to specialize it +// per interface below. The generic version has no actual implementation +// on purpose. +// +// If you get errors about return values related to this method then +// you have forgotten to include UNITY_REGISTER_INTERFACE_GUID with +// your interface, or it is not visible at some point when you are +// trying to retrieve or add an interface. +template +inline const UnityInterfaceGUID GetUnityInterfaceGUID(); + +// This is the macro you provide in your public interface header +// outside of a namespace to allow us to map between type and GUID +// without the user having to worry about it when attempting to +// add or retrieve and interface from the registry. + #define UNITY_REGISTER_INTERFACE_GUID(HASHH, HASHL, TYPE) \ + template<> \ + inline const UnityInterfaceGUID GetUnityInterfaceGUID() \ + { \ + return UnityInterfaceGUID(HASHH,HASHL); \ + } + +// Same as UNITY_REGISTER_INTERFACE_GUID but allows the interface to live in +// a particular namespace. As long as the namespace is visible at the time you call +// GetUnityInterfaceGUID< INTERFACETYPE >() or you explicitly qualify it in the template +// calls this will work fine, only the macro here needs to have the additional parameter + #define UNITY_REGISTER_INTERFACE_GUID_IN_NAMESPACE(HASHH, HASHL, TYPE, NAMESPACE) \ + const UnityInterfaceGUID TYPE##_GUID(HASHH, HASHL); \ + template<> \ + inline const UnityInterfaceGUID GetUnityInterfaceGUID< NAMESPACE :: TYPE >() \ + { \ + return UnityInterfaceGUID(HASHH,HASHL); \ + } + +// These macros allow for C compatibility in user code. + #define UNITY_GET_INTERFACE_GUID(TYPE) GetUnityInterfaceGUID< TYPE >() + + +#else + #define UNITY_DECLARE_INTERFACE(NAME) \ + typedef struct NAME NAME; \ + struct NAME + +// NOTE: This has the downside that one some compilers it will not get stripped from all compilation units that +// can see a header containing this constant. However, it's only for C compatibility and thus should have +// minimal impact. + #define UNITY_REGISTER_INTERFACE_GUID(HASHH, HASHL, TYPE) \ + const UnityInterfaceGUID TYPE##_GUID = {HASHH, HASHL}; + +// In general namespaces are going to be a problem for C code any interfaces we expose in a namespace are +// not going to be usable from C. + #define UNITY_REGISTER_INTERFACE_GUID_IN_NAMESPACE(HASHH, HASHL, TYPE, NAMESPACE) + +// These macros allow for C compatibility in user code. + #define UNITY_GET_INTERFACE_GUID(TYPE) TYPE##_GUID +#endif + +// Using this in user code rather than INTERFACES->Get() will be C compatible for those places in plugins where +// this may be needed. Unity code itself does not need this. +#define UNITY_GET_INTERFACE(INTERFACES, TYPE) (TYPE*)INTERFACES->GetInterfaceSplit (UNITY_GET_INTERFACE_GUID(TYPE).m_GUIDHigh, UNITY_GET_INTERFACE_GUID(TYPE).m_GUIDLow); + + +#ifdef __cplusplus +struct IUnityInterface +{ +}; +#else +typedef void IUnityInterface; +#endif + + +typedef struct IUnityInterfaces +{ + // Returns an interface matching the guid. + // Returns nullptr if the given interface is unavailable in the active Unity runtime. + IUnityInterface* (UNITY_INTERFACE_API * GetInterface)(UnityInterfaceGUID guid); + + // Registers a new interface. + void(UNITY_INTERFACE_API * RegisterInterface)(UnityInterfaceGUID guid, IUnityInterface * ptr); + + // Split APIs for C + IUnityInterface* (UNITY_INTERFACE_API * GetInterfaceSplit)(unsigned long long guidHigh, unsigned long long guidLow); + void(UNITY_INTERFACE_API * RegisterInterfaceSplit)(unsigned long long guidHigh, unsigned long long guidLow, IUnityInterface * ptr); + +#ifdef __cplusplus + // Helper for GetInterface. + template + INTERFACE* Get() + { + return static_cast(GetInterface(GetUnityInterfaceGUID())); + } + + // Helper for RegisterInterface. + template + void Register(IUnityInterface* ptr) + { + RegisterInterface(GetUnityInterfaceGUID(), ptr); + } + +#endif +} IUnityInterfaces; + + +#ifdef __cplusplus +extern "C" { +#endif + +// If exported by a plugin, this function will be called when the plugin is loaded. +void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces); +// If exported by a plugin, this function will be called when the plugin is about to be unloaded. +void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload(); + +#ifdef __cplusplus +} +#endif + +struct RenderSurfaceBase; +typedef struct RenderSurfaceBase* UnityRenderBuffer; +typedef unsigned int UnityTextureID; diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/IUnityXRMeshing.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/IUnityXRMeshing.h new file mode 100644 index 0000000..7ec6a9e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/IUnityXRMeshing.h @@ -0,0 +1,382 @@ +// Unity Native Plugin API copyright © 2019 Unity Technologies ApS +// +// Licensed under the Unity Companion License for Unity - dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). +// +// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions. + +#pragma once +#if UNITY +# include "Modules/XR/ProviderInterface/UnityXRTypes.h" +# include "Modules/XR/ProviderInterface/UnityXRSubsystemTypes.h" +#else +# include "UnityXRTypes.h" +# include "UnityXRSubsystemTypes.h" +#endif + +#include +#include + +/// @file IUnityXRMeshing.h +/// @brief XR interface for mesh generation and allocation of related data structures. +/// @see IUnityXRMeshInterface + +/// The format used for an index buffer +typedef enum UnityXRIndexFormat +{ + kUnityXRIndexFormat16Bit, ///< 16 bit indices, e.g., uint16_t + kUnityXRIndexFormat32Bit ///< 32 bit indices, e.g., uint32_t +} UnityXRIndexFormat; + +/// The type of mesh data, e.g., points, triangles, quads, etc. +/// This affects how the vertex and index data are interpreted. +typedef enum UnityXRMeshTopology +{ + /// The mesh data represents triangles, with 3 indices per triangle. + kUnityXRMeshTopologyTriangles, + + /// The mesh data represents a triangle strip. There are 3 indices + /// for the first triangle, then every point after that is another triangle. + kUnityXRMeshTopologyTriangleStrip, + + /// The mesh data represents quads, with 4 indices per quad. + kUnityXRMeshTopologyQuads, + + /// The mesh data represents lines, with 2 indices per line. + kUnityXRMeshTopologyLines, + + /// The mesh data represents a line strip. The are 2 indices + /// for the first line, then every index after that is another line. + kUnityXRMeshTopologyLineStrip, + + /// The mesh data represents individual points, with 1 index per point. + kUnityXRMeshTopologyPoints +} UnityXRMeshTopology; + +/// Flags representing vertex attributes +typedef enum UnityXRMeshVertexAttributeFlags +{ + /// The vertex contains normal data + kUnityXRMeshVertexAttributeFlagsNormals = 1 << 0, + + /// The vertex contains tangent data + kUnityXRMeshVertexAttributeFlagsTangents = 1 << 1, + + /// The vertex contains uv data + kUnityXRMeshVertexAttributeFlagsUvs = 1 << 2, + + /// The vertex contains color data + kUnityXRMeshVertexAttributeFlagsColors = 1 << 3 +} UnityXRMeshVertexAttributeFlags; + +/// Describes a single mesh, with buffers pointing to each vertex attribute. +/// Note: Unity uses a left-handed coordinate system with clockwise triangle winding. +/// +X is right +/// +Y is up +/// +Z is forward +typedef struct UnityXRMeshDescriptor +{ + /// Pointer to positions buffer. May not be null. + UnityXRVector3* positions; + + /// Pointer to normals buffer. May be null. + UnityXRVector3* normals; + + /// Pointer to tangents buffer. May be null. + UnityXRVector4* tangents; + + /// Pointer to uvs buffer. May be null. + UnityXRVector2* uvs; + + /// Pointer to colors buffer. May be null. + UnityXRColorRGBA32* colors; + + /// Index buffers + union + { + uint16_t* indices16; ///< Used if @a indexFormat is @a kUnityXRIndexFormat16Bit + uint32_t* indices32; ///< Used if @a indexFormat is @a kUnityXRIndexFormat32Bit + }; + + /// The number of vertices. Each non-null buffer above must + /// contain this number of elements. + size_t vertexCount; + + /// The number of indices in the mesh. + size_t indexCount; + + /// Which index format should be used, 16 or 32 bit. + UnityXRIndexFormat indexFormat; + + /// The primitive type of the mesh data (e.g., points, lines, triangles, quads) + UnityXRMeshTopology topology; +} UnityXRMeshDescriptor; + +/// Interface for allocating or setting mesh-related data +typedef struct UnityXRMeshDataAllocator UnityXRMeshDataAllocator; + +/// A unique id assignable to a 'trackable', e.g. a plane or +/// point cloud point. Although this id is 128 bits, it may +/// not necessarily be globally unique; it just needs to be +/// unique to a particular XREnvironment session. +typedef struct UnityXRMeshId +{ + /// 128-bit id data + uint64_t idPart[2]; +} UnityXRMeshId; + +#ifdef __cplusplus +inline bool operator==(const UnityXRMeshId& a, const UnityXRMeshId& b) +{ + return + (a.idPart[0] == b.idPart[0]) && + (a.idPart[1] == b.idPart[1]); +} + +inline bool operator!=(const UnityXRMeshId& a, const UnityXRMeshId& b) +{ + return + (a.idPart[0] != b.idPart[0]) || + (a.idPart[1] != b.idPart[1]); +} + +/// A comparator for UnityXRMeshId suitable for algorithms or containers that +/// require ordered UnityXRMeshIds, e.g. std::map +struct MeshIdLessThanComparator +{ + bool operator()(const UnityXRMeshId& lhs, const UnityXRMeshId& rhs) const + { + if (lhs.idPart[0] == rhs.idPart[0]) + { + return lhs.idPart[1] < rhs.idPart[1]; + } + + return lhs.idPart[0] < rhs.idPart[0]; + } +}; +#endif // __cplusplus + +/// Information related to a mesh +typedef struct UnityXRMeshInfo +{ + /// A session-unique identifier for the mesh. + UnityXRMeshId meshId; + + /// True if the mesh has been updated (e.g., since the last query). + bool updated; + + /// A hint for the system that determines when it should update + /// the corresponding Unity mesh. + int priorityHint; +} UnityXRMeshInfo; + +/// An allocator for the @a UnityXRMeshInfo type. +typedef struct UnityXRMeshInfoAllocator UnityXRMeshInfoAllocator; + +/// Enum describing the type of the bounding volume that will be passed +/// into @a SetBoundingVolume. +typedef enum UnityXRBoundingVolumeType +{ + /// Axis Aligned Bounding Box bounding volume + kUnityXRBoundingVolumeAABB, +} UnityXRBoundingVolumeType; + +/// Definition for an Axis Aligned Bounding Box (AABB). +/// This type of volume is aligned with the axis of the +/// current coordinate space. The definition of the +/// dimensions (m, cm, ft, etc.) is left up to the provider. +typedef struct UnityXRAABBBoundingVolume +{ + /// The origin or center point for the AABB + /// In the current coordinate space. + UnityXRVector3 origin; + + /// The extents of the AABB in each major axis + /// in the current coordinate space. + UnityXRVector3 extents; +} UnityXRAABBBoundingVolume; + +/// Generic definition for a bounding volume passed to the +/// @a SetBoundingVolume api. +typedef struct UnityXRBoundingVolume +{ + /// The type of the bounding volume described by + /// an instance of this struct. + /// See @a UnityXRBoundingVolumeType + UnityXRBoundingVolumeType type; + + /// The actual bounding volume definition for + /// an instance of this struct. The specific field + /// to be used will be determined by what is set in the + /// @a type field. + union + { + /// See @a UnityXRAABBBoundingVolume + UnityXRAABBBoundingVolume aabb; + }; +} UnityXRBoundingVolume; + +/// Implement this interface for your mesh provider. A mesh provider will typically +/// provide multiple meshes, addressable by @a UnityXRMeshId. +typedef struct SUBSYSTEM_PROVIDER UnityXRMeshProvider +{ + /// Plugin-specific data pointer. Every function in this structure will + /// be passed this data by the Unity runtime. The plugin should allocate + /// an appropriate data container for any information that is needed when + /// a callback function is called. + void* userData; + + /// Invoked by Unity to retrieve information about every tracked mesh. + /// + /// @param handle Handle obtained from UnityLifecycleProvider callbacks. + /// @param userData Value of userData field when provider was registered. + /// @param allocator Use this allocator to get a buffer of @a UnityXRMeshInfo. + /// This method should populate the buffer. + /// @return A @a UnitySubsystemErrorCode indicating success or failure. + UnitySubsystemErrorCode(UNITY_INTERFACE_API * GetMeshInfos)( + UnitySubsystemHandle handle, void* userData, UnityXRMeshInfoAllocator * allocator); + + /// Invoked from any thread by Unity to acquire a particular mesh by id. + /// This method should fill out a @a UnityXRMeshDescriptor using the provided + /// @a allocator. If the plugin owns the mesh memory, it should not mutate + /// the data until @a ReleaseMesh is called (see below). + /// + /// @param handle Handle obtained from UnityLifecycleProvider callbacks. + /// @param userData Value of userData field when provider was registered. + /// @param meshId The session-unique identifier associated with this mesh. + /// @param allocator Used to either allocate a @a UnityXRMeshDescriptor from Unity + /// or provide one owned by the plugin. + /// @return A @a UnitySubsystemErrorCode indicating success or failure. + UnitySubsystemErrorCode(UNITY_INTERFACE_API * AcquireMesh)( + UnitySubsystemHandle handle, + void* userData, + const UnityXRMeshId * meshId, + UnityXRMeshDataAllocator * allocator); + + /// Invoked by Unity on the main thread to release a mesh by id. + /// This method should perform any required cleanup for the mesh. + /// + /// @param handle Handle obtained from UnityLifecycleProvider callbacks. + /// @param userData Value of userData field when provider was registered. + /// @param meshId The session-unique identifier associated with this mesh. + /// @param mesh If the plugin owns the memory, then this is the same mesh + /// descriptor provided by the plugin in @a AcquireMesh. Otherwise, if Unity + /// owns the memory, then @a mesh will be null. + /// @param pluginData A pointer provided by the provider during @a AcquireMesh. + /// @return A @a UnitySubsystemErrorCode indicating success or failure. + UnitySubsystemErrorCode(UNITY_INTERFACE_API * ReleaseMesh)( + UnitySubsystemHandle handle, + void* userData, + const UnityXRMeshId * meshId, + const UnityXRMeshDescriptor * mesh, + void* pluginData); + + /// Invoked by Unity on the main thread to request a change in the density + /// of the generated meshes. Density level will be given as a value in the + /// range [0.0-1.0] and the provider will determine how best to map that + /// value to their implementation. + /// + /// Setting this value does not guarantee an immediate change in the density + /// of any currently created mesh and may only change the density for new or + /// updated meshes. + /// + /// @param handle Handle obtained from UnityLifecycleProvider callbacks. + /// @param userData Value of userData field when provider was registered. + /// @param density The requested density of generated meshes. Defined as a + /// float in the range [0.0-1.0] + /// @return A @a UnitySubsystemErrorCode indicating success or failure. + /// @a kUnitySubsystemErrorCodeSuccess Returned if everything is ok. + /// @a kUnitySubsystemErrorCodeInvalidArguments Returned if the density level + /// falls outside the expected range. + /// @a kUnitySubsystemErrorCodeNotSupported Returned if the provider does not + /// support this API in their implementation. + /// @a kUnitySubsystemErrorCodeFailure Returned for ny other error or issue + /// not defined above. + UnitySubsystemErrorCode(UNITY_INTERFACE_API * SetMeshDensity)( + UnitySubsystemHandle handle, + void* userData, + float density); + + + /// Set the bounding volume to be used to restrict the space in which meshes will + /// be generated and tracked. + /// + /// @param handle Handle obtained from UnityLifecycleProvider callbacks. + /// @param userData Value of userData field when provider was registered. + /// @param boundingVolume The bounding volume definition to use. + /// @return A @a UnitySubsystemErrorCode indicating success or failure. + /// @a kUnitySubsystemErrorCodeSuccess Returned if everything is ok. + /// @a kUnitySubsystemErrorCodeInvalidArguments Returned it the bounding + /// volume is null or the definition is incorrect. + /// @a kUnitySubsystemErrorCodeNotSupported Returned if the provider does not + /// support this API. + /// @a kUnitySubsystemErrorCodeNotSupported Returned if the provider does not + /// support the type of bounding volume being requested. + /// @a kUnitySubsystemErrorCodeFailure Returned for ny other error or issue + /// not defined above. + UnitySubsystemErrorCode(UNITY_INTERFACE_API * SetBoundingVolume)( + UnitySubsystemHandle handle, + void* userData, + const UnityXRBoundingVolume* boundingVolume); +} UnityXRMeshProvider; + + +/// @brief XR interface for mesh generation and allocation of related data structures. +UNITY_DECLARE_INTERFACE(SUBSYSTEM_INTERFACE IUnityXRMeshInterface) +{ + /// Allocates @a count @a UnityXRMeshInfo. Unity will periodically invoke your + /// plugin's @a GetMeshInfos function. Your plugin should then call + /// this function to allocate an array of @a UnityXRMeshInfo and populate them. + /// + /// @param count The number of meshes currently tracked. + /// @return An array of @a UnityXRMeshInfo which the caller should populate with mesh info. + UnityXRMeshInfo* (UNITY_INTERFACE_API * MeshInfoAllocator_Allocate)( + UnityXRMeshInfoAllocator * allocator, size_t count); + + /// Allocates mesh data according to the attributes specified in @a attributes. + /// Use this method if you want Unity to manage the mesh memory. + /// + /// @param vertexCount The number of vertices to allocate. + /// @param triangleCount The number of triangles to allocate. + /// @param indexFormat The @a UnityXRIndexFormat indicating 16 or 32 bit indices + /// @param attributes The vertex attributes for which to allocate buffers. + UnityXRMeshDescriptor* (UNITY_INTERFACE_API * MeshDataAllocator_AllocateMesh)( + UnityXRMeshDataAllocator * allocator, + size_t vertexCount, + size_t indexCount, + UnityXRIndexFormat indexFormat, + UnityXRMeshVertexAttributeFlags attributes, + UnityXRMeshTopology topology); + + /// Sets the mesh descriptor to use. Use this method if the plugin manages the memory. + /// The buffers pointed to by @a mesh must exist until Unity invokes @a ReleaseMesh. + /// + /// @param meshDescriptor The mesh descriptor for a mesh. Unused vertex attributes should + /// be null. @a positions must be non null. + void(UNITY_INTERFACE_API * MeshDataAllocator_SetMesh)( + UnityXRMeshDataAllocator * allocator, const UnityXRMeshDescriptor * meshDescriptor); + + /// (Optional) Set user data associated with this mesh. The userData pointer + /// will be passed back to the provider's @a ReleaseMesh method. + /// Use this to store additional data required to release the mesh. + /// + /// @param userData A pointer which will be passed to ReleaseMesh + void(UNITY_INTERFACE_API * MeshDataAllocator_SetUserData)( + UnityXRMeshDataAllocator * allocator, void* userData); + + /// Registers a mesh provider for your plugin to communicate mesh data back to Unity. + /// @param meshProvider The @a UnityXRMeshProvider which will be invoked by Unity to + /// retrieve mesh data. + UnitySubsystemErrorCode(UNITY_INTERFACE_API * SUBSYSTEM_REGISTER_PROVIDER(UnityXRMeshProvider) RegisterMeshProvider)( + UnitySubsystemHandle handle, const UnityXRMeshProvider * meshProvider); + + /// Entry-point for getting callbacks when the mesh subsystem is initialized / started / stopped / shutdown. + /// + /// @param[in] pluginName Name of the plugin which was registered in your xr.json + /// @param[in] id Id of the subsystem that was registered in your xr.json + /// @param[in] provider Callbacks to register. + /// @return Status of function execution. + UnitySubsystemErrorCode(UNITY_INTERFACE_API * RegisterLifecycleProvider)( + const char* pluginName, const char* id, const UnityLifecycleProvider * provider); +}; + +UNITY_REGISTER_INTERFACE_GUID(0x3007fd5885a346efULL, 0x9eeb2c84aa0a9dd9ULL, IUnityXRMeshInterface) diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnitySubsystemTypes.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnitySubsystemTypes.h new file mode 100644 index 0000000..560a5a2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnitySubsystemTypes.h @@ -0,0 +1,89 @@ +// Unity Native Plugin API copyright © 2019 Unity Technologies ApS +// +// Licensed under the Unity Companion License for Unity - dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). +// +// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions. + +#pragma once +#if UNITY +#include "Runtime/PluginInterface/Headers/IUnityInterface.h" +#else +#include "IUnityInterface.h" +#endif + +#include "stddef.h" + +/// Error codes for Subsystem operations +typedef enum UnitySubsystemErrorCode +{ + /// Indicates a successful operation + kUnitySubsystemErrorCodeSuccess, + + /// Indicates the operation failed + kUnitySubsystemErrorCodeFailure, + + /// Indicates invalid arguments were passed to the method + kUnitySubsystemErrorCodeInvalidArguments, + + /// Indicates this feature is not supported + kUnitySubsystemErrorCodeNotSupported, + + // A request to allocate memory by a subsystem has failed or can not be completed. + kUnitySubsystemErrorCodeOutOfMemory +} UnitySubsystemErrorCode; + +/// An UnitySubsystemHandle is an opaque type that's passed between the plugin and Unity. (C-API) +typedef void* UnitySubsystemHandle; + +/// Event handler implemented by the plugin for subsystem specific lifecycle events (C-API). +typedef struct UnityLifecycleProvider +{ + /// Plugin-specific data pointer. Every function in this structure will + /// be passed this data by the Unity runtime. The plugin should allocate + /// an appropriate data container for any information that is needed when + /// a callback function is called. + void* userData; + + /// Initialize the subsystem. + /// + /// @param handle Handle for the current subsystem which can be passed to methods related to that subsystem. + /// @param data Value of userData field when provider was registered. + /// @return Status of function execution. + UnitySubsystemErrorCode(UNITY_INTERFACE_API * Initialize)(UnitySubsystemHandle handle, void* data); + + /// Start the subsystem. + /// + /// @param handle Handle for the current subsystem which can be passed to methods related to that subsystem. + /// @param data Value of userData field when provider was registered. + /// @return Status of function execution. + UnitySubsystemErrorCode(UNITY_INTERFACE_API * Start)(UnitySubsystemHandle handle, void* data); + + /// Stop the subsystem. + /// + /// @param handle Handle for the current subsystem which can be passed to methods related to that subsystem. + /// @param data Value of userData field when provider was registered. + void(UNITY_INTERFACE_API * Stop)(UnitySubsystemHandle handle, void* data); + + /// Shutdown the subsystem. + /// + /// @param handle Handle for the current subsystem which can be passed to methods related to that subsystem. + /// @param data Value of userData field when provider was registered. + void(UNITY_INTERFACE_API * Shutdown)(UnitySubsystemHandle handle, void* data); +} UnityLifecycleProvider; + +// Macros and defines for back-compatibility code-gen (#defined to no-op when code-gen not running) +#if SUBSYSTEM_CODE_GEN +#define SUBSYSTEM_PROVIDER __attribute__((annotate("provider"))) +#define SUBSYSTEM_INTERFACE __attribute__((annotate("interface"))) +#define SUBSYSTEM_ADAPT_FROM(FUNC_NAME) __attribute__((annotate("adapt_from_" #FUNC_NAME))) +#define SUBSYSTEM_REGISTER_PROVIDER(PROVIDER) __attribute__((annotate("register_provider_" #PROVIDER))) +#define SUBSYSTEM_ADAPT_IN_PROVIDER_REGISTRATION __attribute__((annotate("in_provider_registration"))) +#define UNITY_DECLARE_INTERFACE(NAME) struct NAME +#define UNITY_INTERFACE_API +#else +#define SUBSYSTEM_PROVIDER +#define SUBSYSTEM_INTERFACE +#define SUBSYSTEM_ADAPT_FROM(FUNC_NAME) +#define SUBSYSTEM_REGISTER_PROVIDER(PROVIDER) +#define SUBSYSTEM_ADAPT_IN_PROVIDER_REGISTRATION +#endif diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnityTypes.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnityTypes.h new file mode 100644 index 0000000..120b7bc --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnityTypes.h @@ -0,0 +1,17 @@ +// Unity Native Plugin API copyright © 2019 Unity Technologies ApS +// +// Licensed under the Unity Companion License for Unity - dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). +// +// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions. + +#pragma once +#include + +/// @cond undoc +#ifndef __cplusplus +#include +#endif +/// @endcond + +/// The maximum length of a string, used in some structs with the subsystem headers +enum { kUnitySubsystemsStringSize = 128 }; diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnityXRSubsystemTypes.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnityXRSubsystemTypes.h new file mode 100644 index 0000000..ba73ed2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnityXRSubsystemTypes.h @@ -0,0 +1,15 @@ +// Unity Native Plugin API copyright © 2019 Unity Technologies ApS +// +// Licensed under the Unity Companion License for Unity - dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). +// +// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions. + +#pragma once +#if UNITY +#include "Modules/Subsystems/ProviderInterface/UnitySubsystemTypes.h" +#include "Runtime/PluginInterface/Headers/IUnityInterface.h" +#else +#include "UnitySubsystemTypes.h" +#include "IUnityInterface.h" +#endif +#include "stddef.h" diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnityXRTypes.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnityXRTypes.h new file mode 100644 index 0000000..71ef5d6 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/XR/UnityXRTypes.h @@ -0,0 +1,146 @@ +// Unity Native Plugin API copyright © 2019 Unity Technologies ApS +// +// Licensed under the Unity Companion License for Unity - dependent projects--see [Unity Companion License](http://www.unity3d.com/legal/licenses/Unity_Companion_License). +// +// Unless expressly provided otherwise, the Software under this license is made available strictly on an “AS IS” BASIS WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.Please review the license for details on these and other terms and conditions. + +#pragma once + +#if UNITY +#include "Modules/Subsystems/ProviderInterface/UnityTypes.h" +#else +#include "UnityTypes.h" +#endif + +/// The maximum length of a string, used in some structs with the XR headers +enum { kUnityXRStringSize = kUnitySubsystemsStringSize }; + +/// Simple 2-Element Float Vector +typedef struct UnityXRVector2 +{ + /// X component of the vector. + float x; + + /// Y component of the vector. + float y; +} UnityXRVector2; + +/// Simple 3-Element float vector +typedef struct UnityXRVector3 +{ + /// X component of the vector. + float x; + + /// Y component of the vector. + float y; + + /// Z component of the vector. + float z; +} UnityXRVector3; + +/// Simple 4 Element Quaternion with indices ordered x, y, z, and w in order +typedef struct UnityXRVector4 +{ + /// X component of the vector. + float x; + + /// Y component of the vector. + float y; + + /// Z component of the vector. + float z; + + /// W component of the vector. + float w; +} UnityXRVector4; + +/// A simple struct representing a point in space with position and orientation +typedef struct UnityXRPose +{ + /// Position of the pose. + UnityXRVector3 position; + + /// Rotation of the pose, stored as a quaternion. + UnityXRVector4 rotation; +} UnityXRPose; + +/// A 4x4 column-major matrix +typedef struct UnityXRMatrix4x4 +{ + ///. The columns of the matrix + UnityXRVector4 columns[4]; +} UnityXRMatrix4x4; + +/// Multiple ways of representing a projection. +typedef enum UnityXRProjectionType +{ + /// Projection represented as tangents of half angles from center. + kUnityXRProjectionTypeHalfAngles, + + /// Projection represented as a 4x4 matrix. + kUnityXRProjectionTypeMatrix +} UnityXRProjectionType; + +/// Projection as tangent of half angles on near plane. +typedef struct UnityXRProjectionHalfAngles +{ + /// Tangent of the half angle from center to left clipping plane. (should be negative) + float left; + /// Tangent of the half angle from center to right clipping plane. (should be positive) + float right; + /// Tangent of the half angle from center to top clipping plane. (should be positive) + float top; + /// Tangent of the half angle from center to bottom clipping plane. (should be negative) + float bottom; +} UnityXRProjectionHalfAngles; + +/// Container for the different methods of representing a projection matrix. +typedef struct UnityXRProjection +{ + /// Choose the way this projection is represented. + UnityXRProjectionType type; + + union + { + /// Valid if type is kUnityXRProjectionTypeHalfAngles. + UnityXRProjectionHalfAngles halfAngles; + + /// Valid if type is kUnityXRProjectionTypeMatrix. + UnityXRMatrix4x4 matrix; + } data; ///< Contains all supported ways of representing a projection matrix. +} UnityXRProjection; + +/// A 2D rectangle defined by X and Y position, width and height. +typedef struct UnityXRRectf +{ + /// X position of the rectangle. + float x; + + /// Y position of the rectangle. + float y; + + /// Width of the rectangle. + float width; + + /// Height of the rectangle. + float height; +} UnityXRRectf; + +/// An RGBA color +typedef struct UnityXRColorRGBA32 +{ + /// The red channel + uint8_t red; + + /// The green channel + uint8_t green; + + /// The blue channel + uint8_t blue; + + /// The alpha channel + uint8_t alpha; +} UnityXRColorRGBA32; + +/// Represents milliseconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. +typedef int64_t UnityXRTimeStamp; diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/meshing_provider.cpp b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/meshing_provider.cpp new file mode 100644 index 0000000..81a5444 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/meshing_provider.cpp @@ -0,0 +1,594 @@ +#include +#include "IUnityInterface.h" +#include "XR/IUnityXRMeshing.h" +#include +#include +#include +#include +#include +#include +static IUnityXRMeshInterface* s_Meshing = nullptr; +static XrInstance s_XrInstance = nullptr; +static XrSession s_XrSession = nullptr; + +// XrSpace related function pointers +static PFN_xrEnumerateReferenceSpaces s_xrEnumerateReferenceSpaces = nullptr; +static PFN_xrCreateReferenceSpace s_xrCreateReferenceSpace = nullptr; +static PFN_xrDestroySpace s_xrDestroySpace = nullptr; + +// XR_MSFT_scene_understanding function pointers +static PFN_xrEnumerateSceneComputeFeaturesMSFT s_xrEnumerateSceneComputeFeaturesMSFT = nullptr; +static PFN_xrCreateSceneObserverMSFT s_xrCreateSceneObserverMSFT = nullptr; +static PFN_xrDestroySceneObserverMSFT s_xrDestroySceneObserverMSFT = nullptr; +static PFN_xrCreateSceneMSFT s_xrCreateSceneMSFT = nullptr; +static PFN_xrDestroySceneMSFT s_xrDestroySceneMSFT = nullptr; +static PFN_xrComputeNewSceneMSFT s_xrComputeNewSceneMSFT = nullptr; +static PFN_xrGetSceneComputeStateMSFT s_xrGetSceneComputeStateMSFT = nullptr; +static PFN_xrGetSceneComponentsMSFT s_xrGetSceneComponentsMSFT = nullptr; +static PFN_xrLocateSceneComponentsMSFT s_xrLocateSceneComponentsMSFT = nullptr; +static PFN_xrGetSceneMeshBuffersMSFT s_xrGetSceneMeshBuffersMSFT = nullptr; + +static XrReferenceSpaceType s_ReferenceSpaceType = XrReferenceSpaceType::XR_REFERENCE_SPACE_TYPE_STAGE; +static XrSpace s_XrSpace = nullptr; + +static XrSceneObserverMSFT s_SceneObserver = nullptr; +static bool s_OpenXRReady = false; + +static XrSceneComputeConsistencyMSFT s_SceneComputeConsistency = XrSceneComputeConsistencyMSFT::XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_INCOMPLETE_FAST_MSFT; + +// User specified scene computation boundaries. + +static std::vector s_SceneSphereBounds; +static std::vector s_SceneOrientedBoxBounds; +static std::vector s_SceneFrustumBounds; + +static XrMeshComputeLodMSFT s_MeshComputeLod = XrMeshComputeLodMSFT::XR_MESH_COMPUTE_LOD_COARSE_MSFT; + +void Log(const std::string& line) +{ + std::ofstream file("meshing_plugin.log", std::ios::app); + if (!file.is_open()) return; + file << line << "\n"; +} + +void CheckResult(XrResult result, const std::string& funcName) +{ + if (result != XrResult::XR_SUCCESS) + { + Log(funcName + " failure: " + std::to_string(result)); + } +} +/** + * Make an XRSceneMSFT can be managed by shared pointers. + * The containing XRSceneMSFT is destroyed in the destructor + * by an OpenXR function, xrDestroySceneMSFT. + */ +class SharedOpenXRScene +{ +public: + /** + * @param[in] scene A valid scene, which is created by xrCreateSceneMSFT. + */ + SharedOpenXRScene(XrSceneMSFT scene) : m_Scene(scene) {} + ~SharedOpenXRScene() + { + if (s_xrDestroySceneMSFT != nullptr && s_SceneObserver != nullptr) + { + CheckResult(s_xrDestroySceneMSFT(m_Scene), "xrDestroySceneMSFT"); + } + } + + XrSceneMSFT GetScene() const { return m_Scene; }; + +private: + XrSceneMSFT m_Scene; +}; + +/** + * Store mesh data belonging to a UnityXRMeshId. + */ +class MeshData +{ +public: + MeshData() : m_UpdateTime(0) {} + + UnityXRMeshInfo m_UnityXRMeshInfo; + + /** + * Point to a shared OpenXR scene. + * When there is no mesh data pointing to a scene, + * the scene will be destroyed by an OpenXR function (xrDestroySceneMSFT). + */ + std::shared_ptr m_SharedOpenXRScene; + + XrSceneMeshMSFT m_OpenXRSceneMesh; + + long long m_UpdateTime; +}; + +static std::map s_MeshDataByMeshId; + +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API +UnityPluginLoad(IUnityInterfaces* interfaces) +{ + s_Meshing = interfaces->Get(); + if (s_Meshing == nullptr) + return; + + UnityLifecycleProvider meshingLifecycleHandler{}; + meshingLifecycleHandler.Initialize = [](UnitySubsystemHandle handle, void* userData) -> UnitySubsystemErrorCode { + // Reset scene computation bounds. + // Use an axis-aligned bounding box by default. + s_SceneSphereBounds.clear(); + s_SceneOrientedBoxBounds.clear(); + s_SceneFrustumBounds.clear(); + + s_MeshDataByMeshId.clear(); + + UnityXRMeshProvider meshProvider{}; + meshProvider.GetMeshInfos = [](UnitySubsystemHandle handle, void* userData, UnityXRMeshInfoAllocator* allocator) -> UnitySubsystemErrorCode { + if (s_SceneObserver == nullptr) return kUnitySubsystemErrorCodeFailure; + + // Set existing mesh infos as not updated. + for (auto&& pair : s_MeshDataByMeshId) + { + pair.second.m_UnityXRMeshInfo.updated = false; + } + + bool canComputeNewScene = false; + + // Check the scene compute state. + XrSceneComputeStateMSFT computeState; + CheckResult(s_xrGetSceneComputeStateMSFT(s_SceneObserver, &computeState), "xrGetSceneComputeStateMSFT"); + switch (computeState) + { + case XrSceneComputeStateMSFT::XR_SCENE_COMPUTE_STATE_NONE_MSFT: + { + // Compute a new scene at the end of the function. + canComputeNewScene = true; + break; + } + case XrSceneComputeStateMSFT::XR_SCENE_COMPUTE_STATE_UPDATING_MSFT: + // Wait for scene computation. + canComputeNewScene = false; + break; + case XrSceneComputeStateMSFT::XR_SCENE_COMPUTE_STATE_COMPLETED_MSFT: + { + // Compute a new scene at the end of the function. + canComputeNewScene = true; + + // Create a scene of the computation result. + XrSceneCreateInfoMSFT sceneCreateInfo; + sceneCreateInfo.type = XrStructureType::XR_TYPE_SCENE_CREATE_INFO_MSFT; + sceneCreateInfo.next = NULL; + XrSceneMSFT scene; + CheckResult(s_xrCreateSceneMSFT(s_SceneObserver, &sceneCreateInfo, &scene), "xrCreateSceneMSFT"); + + // Create a shared scene to be stored in mesh data. + auto sharedScene = std::make_shared(scene); + + // Stage 1: Get scene visual mesh components. + + XrSceneComponentsGetInfoMSFT sceneComponentsGetInfo; + sceneComponentsGetInfo.type = XrStructureType::XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT; + sceneComponentsGetInfo.next = NULL; + sceneComponentsGetInfo.componentType = XrSceneComponentTypeMSFT::XR_SCENE_COMPONENT_TYPE_VISUAL_MESH_MSFT; + // First get the buffer capacity. + XrSceneComponentsMSFT sceneComponents; + sceneComponents.type = XrStructureType::XR_TYPE_SCENE_COMPONENTS_MSFT; + sceneComponents.next = NULL; + sceneComponents.componentCapacityInput = 0; + sceneComponents.components = NULL; + CheckResult(s_xrGetSceneComponentsMSFT(scene, &sceneComponentsGetInfo, &sceneComponents), "xrGetSceneComponentsMSFT"); + // Create scene components by the provided capacity. + std::vector sceneComponentsVector(sceneComponents.componentCountOutput); + sceneComponents.componentCapacityInput = sceneComponents.componentCountOutput; + sceneComponents.components = sceneComponentsVector.data(); + // Also add an instance in the structure chain for getting scene visual mesh components. + std::vector sceneMeshesVector(sceneComponents.componentCountOutput); + XrSceneMeshesMSFT sceneMeshes; + sceneMeshes.type = XrStructureType::XR_TYPE_SCENE_MESHES_MSFT; + sceneMeshes.next = NULL; + sceneMeshes.sceneMeshCount = sceneComponents.componentCountOutput; + sceneMeshes.sceneMeshes = sceneMeshesVector.data(); + sceneComponents.next = &sceneMeshes; + // Call xrGetSceneComponentsMSFT() again to fill out the scene components and scene visual mesh components. + CheckResult(s_xrGetSceneComponentsMSFT(scene, &sceneComponentsGetInfo, &sceneComponents), "xrGetSceneComponentsMSFT"); + + // Fill out mesh info from the scene visual mesh components. + for (size_t componentIndex = 0; componentIndex < sceneComponents.componentCountOutput; ++componentIndex) + { + auto& sceneComponent = sceneComponentsVector[componentIndex]; + auto& sceneMesh = sceneMeshesVector[componentIndex]; + + // Create a Unity mesh id by the OpenXR component id. + // If OpenXR scene components of different time have the same component id, + // they represent the same physical object. Thus use component id + // as Unity mesh id. + UnityXRMeshId meshId; + memcpy(&meshId, &sceneComponent.id, sizeof(UnityXRMeshId)); + + // Prepare to store mesh data of the mesh id. + // The mesh data can be an existing one from the previous scene, + // or a new one of the current scene. + auto& meshData = s_MeshDataByMeshId[meshId]; + + // Set the mesh info of the mesh id. + // If the current update time is larger than the stored value, + // set the mesh as updated. + auto& meshInfo = meshData.m_UnityXRMeshInfo; + meshInfo.meshId = meshId; + meshInfo.updated = sceneComponent.updateTime > meshData.m_UpdateTime; + meshInfo.priorityHint = 0; + + // Store the shared scene in order to manage the destruction of scene. + meshData.m_SharedOpenXRScene = sharedScene; + + // Store the OpenXR scene mesh. + meshData.m_OpenXRSceneMesh = sceneMesh; + + // Store the update time. + meshData.m_UpdateTime = sceneComponent.updateTime; + } + + // After setting data of the current scene, remove mesh data + // not belonging to the current scene. + for (auto iterator = s_MeshDataByMeshId.cbegin(); iterator != s_MeshDataByMeshId.cend();) + { + if (iterator->second.m_SharedOpenXRScene != sharedScene) + { + // The mesh data does not exist in the current scene. + // Erase it from the container, and get the iterator + // after the erased position. + iterator = s_MeshDataByMeshId.erase(iterator); + } + else + { + // The mesh data exist in the current scene. + // Do nothing and increment the iterator. + ++iterator; + } + } + } + break; + case XrSceneComputeStateMSFT::XR_SCENE_COMPUTE_STATE_COMPLETED_WITH_ERROR_MSFT: + Log("Scene computation failed"); + // Compute a new scene at the end of the function. + canComputeNewScene = true; + break; + default: + Log("Invalid scene compute state: " + std::to_string(computeState)); + // Compute a new scene at the end of the function. + canComputeNewScene = true; + break; + } + + if (canComputeNewScene) + { + // Compute a new scene. + XrVisualMeshComputeLodInfoMSFT visualMeshComputeLodInfo; + visualMeshComputeLodInfo.type = XrStructureType::XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT; + visualMeshComputeLodInfo.next = NULL; + visualMeshComputeLodInfo.lod = s_MeshComputeLod; + std::vector sceneComputeFeatures = {XrSceneComputeFeatureMSFT::XR_SCENE_COMPUTE_FEATURE_VISUAL_MESH_MSFT}; + XrNewSceneComputeInfoMSFT newSceneComputeInfo; + newSceneComputeInfo.type = XrStructureType::XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT; + newSceneComputeInfo.next = &visualMeshComputeLodInfo; + newSceneComputeInfo.requestedFeatureCount = (uint32_t) sceneComputeFeatures.size(); + newSceneComputeInfo.requestedFeatures = sceneComputeFeatures.data(); + newSceneComputeInfo.consistency = s_SceneComputeConsistency; + newSceneComputeInfo.bounds.sphereCount = (uint32_t) s_SceneSphereBounds.size(); + newSceneComputeInfo.bounds.spheres = s_SceneSphereBounds.data(); + newSceneComputeInfo.bounds.boxCount = (uint32_t) s_SceneOrientedBoxBounds.size(); + newSceneComputeInfo.bounds.boxes = s_SceneOrientedBoxBounds.data(); + newSceneComputeInfo.bounds.frustumCount = (uint32_t) s_SceneFrustumBounds.size(); + newSceneComputeInfo.bounds.frustums = s_SceneFrustumBounds.data(); + CheckResult(s_xrComputeNewSceneMSFT(s_SceneObserver, &newSceneComputeInfo), "xrComputeNewSceneMSFT"); + } + + // Allocate an output array and copy mesh infos to it. + auto pMeshInfos = s_Meshing->MeshInfoAllocator_Allocate(allocator, s_MeshDataByMeshId.size()); + size_t meshInfoIndex = 0; + for (auto&& pair : s_MeshDataByMeshId) + { + pMeshInfos[meshInfoIndex] = pair.second.m_UnityXRMeshInfo; + ++meshInfoIndex; + } + + return kUnitySubsystemErrorCodeSuccess; + }; + meshProvider.AcquireMesh = [](UnitySubsystemHandle handle, void* userData, const UnityXRMeshId* meshId, UnityXRMeshDataAllocator* allocator) -> UnitySubsystemErrorCode { + // Get mesh data from the input mesh id. + MeshData* pMeshData = nullptr; + try + { + pMeshData = &s_MeshDataByMeshId.at(*meshId); + } + catch(const std::exception& e) + { + Log("Mesh id not found: " + std::string(e.what())); + return UnitySubsystemErrorCode::kUnitySubsystemErrorCodeFailure; + } + + // Check if the shared OpenXR scene is not null. + if (pMeshData->m_SharedOpenXRScene == nullptr) + { + // Mesh data with null shared scene implies that a mesh + // of the mesh data has been acquired before. + return UnitySubsystemErrorCode::kUnitySubsystemErrorCodeFailure; + } + + // Stage 2: Get mesh buffers of the first scene visual mesh component. + + XrSceneMeshBuffersGetInfoMSFT sceneMeshBuffersGetInfo; + sceneMeshBuffersGetInfo.type = XrStructureType::XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT; + sceneMeshBuffersGetInfo.next = NULL; + sceneMeshBuffersGetInfo.meshBufferId = pMeshData->m_OpenXRSceneMesh.meshBufferId; + // Create buffers on the structure chain of XrSceneMeshBuffersMSFT. + // Set input capacity to zero to get buffer capacity. + XrSceneMeshBuffersMSFT sceneMeshBuffers; + sceneMeshBuffers.type = XrStructureType::XR_TYPE_SCENE_MESH_BUFFERS_MSFT; + XrSceneMeshVertexBufferMSFT sceneMeshVerticesBuffer; + sceneMeshVerticesBuffer.type = XrStructureType::XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT; + sceneMeshVerticesBuffer.vertexCapacityInput = 0; + sceneMeshVerticesBuffer.vertices = NULL; + XrSceneMeshIndicesUint32MSFT sceneMeshIndicesUint32Buffer; + sceneMeshIndicesUint32Buffer.type = XrStructureType::XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT; + sceneMeshIndicesUint32Buffer.indexCapacityInput = 0; + sceneMeshIndicesUint32Buffer.indices = NULL; + // Chain the structure instances. + sceneMeshBuffers.next = &sceneMeshVerticesBuffer; + sceneMeshVerticesBuffer.next = &sceneMeshIndicesUint32Buffer; + sceneMeshIndicesUint32Buffer.next = NULL; + // Call xrGetSceneMeshBuffersMSFT() to get buffer capacity. + CheckResult(s_xrGetSceneMeshBuffersMSFT(pMeshData->m_SharedOpenXRScene->GetScene(), + &sceneMeshBuffersGetInfo, &sceneMeshBuffers), "xrGetSceneMeshBuffersMSFT"); + // Create buffers by the capacity. + std::vector vertices(sceneMeshVerticesBuffer.vertexCountOutput); + std::vector indices(sceneMeshIndicesUint32Buffer.indexCountOutput); + sceneMeshVerticesBuffer.vertexCapacityInput = sceneMeshVerticesBuffer.vertexCountOutput; + sceneMeshVerticesBuffer.vertices = vertices.data(); + sceneMeshIndicesUint32Buffer.indexCapacityInput = sceneMeshIndicesUint32Buffer.indexCountOutput; + sceneMeshIndicesUint32Buffer.indices = indices.data(); + // Call xrGetSceneMeshBuffersMSFT() again to fill out buffers. + CheckResult(s_xrGetSceneMeshBuffersMSFT(pMeshData->m_SharedOpenXRScene->GetScene(), + &sceneMeshBuffersGetInfo, &sceneMeshBuffers), "xrGetSceneMeshBuffersMSFT"); + + // After getting OpenXR mesh buffers, reset the shared pointer to the scene + // to release the scene. The scene will be destroyed when no shared pointers + // pointing to it. + pMeshData->m_SharedOpenXRScene = nullptr; + + // Test + // sceneMeshVerticesBuffer.vertices[0] = {0, 0, 0}; + // sceneMeshVerticesBuffer.vertices[1] = {0, 0, 1}; + // sceneMeshVerticesBuffer.vertices[2] = {1, 0, 0}; + // sceneMeshIndicesUint32Buffer.indices[0] = 0; + // sceneMeshIndicesUint32Buffer.indices[1] = 1; + // sceneMeshIndicesUint32Buffer.indices[2] = 2; + + // Now the buffers are filled with mesh data. + // Copy data to the Unity XR mesh descriptor. + auto& verticesCount = sceneMeshVerticesBuffer.vertexCountOutput; + auto& indicesCount = sceneMeshIndicesUint32Buffer.indexCountOutput; + auto* meshDesc = s_Meshing->MeshDataAllocator_AllocateMesh(allocator, + verticesCount, indicesCount, kUnityXRIndexFormat32Bit, + (UnityXRMeshVertexAttributeFlags) 0,kUnityXRMeshTopologyTriangles); + memcpy(meshDesc->positions, sceneMeshVerticesBuffer.vertices, verticesCount * sizeof(float) * 3); + memcpy(meshDesc->indices32, sceneMeshIndicesUint32Buffer.indices, indicesCount * sizeof(uint32_t)); + + // Convert meshes from right-handed to left-handed. + for (size_t i = 0; i < verticesCount; ++i) + { + // Multiply the z value by -1. + meshDesc->positions[i].z *= -1.0f; + } + for (size_t i = 0; i < indicesCount; i += 3) + { + // Swap the second and the third index in a triangle. + std::swap(meshDesc->indices32[i + 1], meshDesc->indices32[i + 2]); + } + + // int numVerts = sizeof(positionsTeapot) / sizeof(float) / 3; + // int numIndices = sizeof(indicesTeapot) / sizeof(uint16_t); + // auto* meshDesc = s_Meshing->MeshDataAllocator_AllocateMesh(allocator, numVerts, numIndices, kUnityXRIndexFormat16Bit, (UnityXRMeshVertexAttributeFlags)(kUnityXRMeshVertexAttributeFlagsNormals | kUnityXRMeshVertexAttributeFlagsUvs), kUnityXRMeshTopologyTriangles); + // memcpy(meshDesc->positions, positionsTeapot, numVerts * sizeof(float) * 3); + // memcpy(meshDesc->normals, normalsTeapot, numVerts * sizeof(float) * 3); + // memcpy(meshDesc->uvs, uvsTeapot, (numVerts * 2) * sizeof(float)); + // memcpy(meshDesc->indices16, indicesTeapot, numIndices * sizeof(uint16_t)); + return kUnitySubsystemErrorCodeSuccess; + }; + meshProvider.ReleaseMesh = [](UnitySubsystemHandle handle, void* userData, const UnityXRMeshId* meshId, const UnityXRMeshDescriptor* mesh, void* pluginData) -> UnitySubsystemErrorCode { + return kUnitySubsystemErrorCodeSuccess; + }; + meshProvider.SetMeshDensity = [](UnitySubsystemHandle handle, void* userData, float density) -> UnitySubsystemErrorCode { + return kUnitySubsystemErrorCodeSuccess; + }; + meshProvider.SetBoundingVolume = [](UnitySubsystemHandle handle, void* userData, const UnityXRBoundingVolume* boundingVolume) -> UnitySubsystemErrorCode { + return kUnitySubsystemErrorCodeSuccess; + }; + s_Meshing->RegisterMeshProvider(handle, &meshProvider); + return kUnitySubsystemErrorCodeSuccess; + }; + meshingLifecycleHandler.Start = [](UnitySubsystemHandle handle, void* userData) -> UnitySubsystemErrorCode { + // Create a scene observer. + XrSceneObserverCreateInfoMSFT sceneObserverCreateInfo; + sceneObserverCreateInfo.type = XrStructureType::XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT; + sceneObserverCreateInfo.next = NULL; + CheckResult(s_xrCreateSceneObserverMSFT(s_XrSession, &sceneObserverCreateInfo, &s_SceneObserver), "xrCreateSceneObserverMSFT"); + + return kUnitySubsystemErrorCodeSuccess; + }; + meshingLifecycleHandler.Stop = [](UnitySubsystemHandle handle, void* userData) -> void { + // Clear mesh data. + // All pointed shared OpenXR scenes are also destroyed. + s_MeshDataByMeshId.clear(); + + // Destroy the scene observer. + CheckResult(s_xrDestroySceneObserverMSFT(s_SceneObserver), "xrDestroySceneObserverMSFT"); + }; + meshingLifecycleHandler.Shutdown = [](UnitySubsystemHandle handle, void* userData) -> void { + s_OpenXRReady = false; + + // Destroy the reference space. + CheckResult(s_xrDestroySpace(s_XrSpace), "xrDestroySpace"); + }; + + s_Meshing->RegisterLifecycleProvider("OpenXR Extension Sample", "Sample Meshing", &meshingLifecycleHandler); +} + +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API +UnityPluginUnload() +{ +} + +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API +SetOpenXRVariables(unsigned long long instance, unsigned long long session, + void* xrEnumerateReferenceSpaces, + void* xrCreateReferenceSpace, + void* xrDestroySpace, + void* xrEnumerateSceneComputeFeaturesMSFTptr, + void* xrCreateSceneObserverMSFTptr, + void* xrDestroySceneObserverMSFTptr, + void* xrCreateSceneMSFTptr, + void* xrDestroySceneMSFTptr, + void* xrComputeNewSceneMSFTptr, + void* xrGetSceneComputeStateMSFTptr, + void* xrGetSceneComponentsMSFTptr, + void* xrLocateSceneComponentsMSFTptr, + void* xrGetSceneMeshBuffersMSFTptr) +{ + s_XrInstance = (XrInstance)instance; + s_XrSession = (XrSession)session; + + s_xrEnumerateReferenceSpaces = (PFN_xrEnumerateReferenceSpaces)xrEnumerateReferenceSpaces; + s_xrCreateReferenceSpace = (PFN_xrCreateReferenceSpace)xrCreateReferenceSpace; + s_xrDestroySpace = (PFN_xrDestroySpace)xrDestroySpace; + s_xrEnumerateSceneComputeFeaturesMSFT = (PFN_xrEnumerateSceneComputeFeaturesMSFT)xrEnumerateSceneComputeFeaturesMSFTptr; + s_xrCreateSceneObserverMSFT = (PFN_xrCreateSceneObserverMSFT)xrCreateSceneObserverMSFTptr; + s_xrDestroySceneObserverMSFT = (PFN_xrDestroySceneObserverMSFT)xrDestroySceneObserverMSFTptr; + s_xrCreateSceneMSFT = (PFN_xrCreateSceneMSFT)xrCreateSceneMSFTptr; + s_xrDestroySceneMSFT = (PFN_xrDestroySceneMSFT)xrDestroySceneMSFTptr; + s_xrComputeNewSceneMSFT = (PFN_xrComputeNewSceneMSFT)xrComputeNewSceneMSFTptr; + s_xrGetSceneComputeStateMSFT = (PFN_xrGetSceneComputeStateMSFT)xrGetSceneComputeStateMSFTptr; + s_xrGetSceneComponentsMSFT = (PFN_xrGetSceneComponentsMSFT)xrGetSceneComponentsMSFTptr; + s_xrLocateSceneComponentsMSFT = (PFN_xrLocateSceneComponentsMSFT)xrLocateSceneComponentsMSFTptr; + s_xrGetSceneMeshBuffersMSFT = (PFN_xrGetSceneMeshBuffersMSFT)xrGetSceneMeshBuffersMSFTptr; + s_XrInstance = (XrInstance) instance; + s_XrSession = (XrSession) session; + + // Enumerate supported reference space types. + std::vector supportedReferenceSpaceTypes; + uint32_t supportedReferenceSpaceTypeCount = 0; + CheckResult(s_xrEnumerateReferenceSpaces(s_XrSession, 0, &supportedReferenceSpaceTypeCount, + supportedReferenceSpaceTypes.data()), "xrEnumerateReferenceSpaces"); + supportedReferenceSpaceTypes.resize(supportedReferenceSpaceTypeCount); + CheckResult(s_xrEnumerateReferenceSpaces(s_XrSession, (uint32_t) supportedReferenceSpaceTypes.size(), &supportedReferenceSpaceTypeCount, + supportedReferenceSpaceTypes.data()), "xrEnumerateReferenceSpaces"); + // Get a supported reference space type. Prefer the stage space type. + for (auto&& type : supportedReferenceSpaceTypes) + { + s_ReferenceSpaceType = type; + if (type == XrReferenceSpaceType::XR_REFERENCE_SPACE_TYPE_STAGE) + { + break; + } + } + // Create a reference space. + XrReferenceSpaceCreateInfo referenceSpaceCreateInfo; + referenceSpaceCreateInfo.type = XrStructureType::XR_TYPE_REFERENCE_SPACE_CREATE_INFO; + referenceSpaceCreateInfo.next = NULL; + referenceSpaceCreateInfo.referenceSpaceType = s_ReferenceSpaceType; + referenceSpaceCreateInfo.poseInReferenceSpace.orientation = {0, 0, 0, 1}; + referenceSpaceCreateInfo.poseInReferenceSpace.position = {0, 0, 0}; + CheckResult(s_xrCreateReferenceSpace(s_XrSession, &referenceSpaceCreateInfo, &s_XrSpace), "xrCreateReferenceSpace"); + s_OpenXRReady = true; +} + +/** + * Set a scene compute sphere bound in a right-handed world space. + * Existing sphere bound will be replaced. + */ +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API +SetSceneComputeSphereBound(XrVector3f center, float radius) +{ + s_SceneSphereBounds.resize(1); + auto& bound = s_SceneSphereBounds[0]; + bound.center = center; + bound.radius = radius; +} + +/** + * Set a scene compute oriented box bound in a right-handed world space. + * Existing oriented box bound will be replaced. + */ +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API +SetSceneComputeOrientedBoxBound(XrQuaternionf orientation, XrVector3f position, XrVector3f extents) +{ + s_SceneOrientedBoxBounds.resize(1); + auto& bound = s_SceneOrientedBoxBounds[0]; + bound.pose.orientation = orientation; + bound.pose.position = position; + bound.extents = extents; +} + +/** + * Set a scene compute oriented box bound in a right-handed world space. + * Existing frustum bound will be replaced. + */ +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API +SetSceneComputeFrustumBound(XrQuaternionf orientation, XrVector3f position, + float angleUp, float angleDown, float angleRight, float angleLeft, float farDistance) +{ + s_SceneFrustumBounds.resize(1); + auto& bound = s_SceneFrustumBounds[0]; + bound.pose.orientation = orientation; + bound.pose.position = position; + bound.fov.angleUp = angleUp; + bound.fov.angleDown = angleDown; + bound.fov.angleRight = angleRight; + bound.fov.angleLeft = angleLeft; + bound.farDistance = farDistance; +} + +enum XrSceneBoundType +{ + XR_SCENE_BOUND_SPHERE_TYPE = 1, + XR_SCENE_BOUND_ORIENTED_BOX_TYPE = 2, + XR_SCENE_BOUND_FRUSTUM_TYPE = 3, + XR_SCENE_BOUND_MAX = 4 +}; + +/** + * Clear scene compute bounds of a specified type. + */ +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API +ClearSceneComputeBounds(XrSceneBoundType type) +{ + switch (type) + { + case XrSceneBoundType::XR_SCENE_BOUND_SPHERE_TYPE: + s_SceneSphereBounds.clear(); + break; + case XrSceneBoundType::XR_SCENE_BOUND_ORIENTED_BOX_TYPE: + s_SceneOrientedBoxBounds.clear(); + break; + case XrSceneBoundType::XR_SCENE_BOUND_FRUSTUM_TYPE: + s_SceneFrustumBounds.clear(); + break; + default: + break; + } +} + +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API +SetSceneComputeConsistency(XrSceneComputeConsistencyMSFT consistency) +{ + s_SceneComputeConsistency = consistency; +} + +extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API +SetMeshComputeLod(XrMeshComputeLodMSFT lod) +{ + s_MeshComputeLod = lod; +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/extra_algorithms.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/extra_algorithms.h new file mode 100644 index 0000000..cebab54 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/extra_algorithms.h @@ -0,0 +1,47 @@ +// Copyright (c) 2017-2021, The Khronos Group Inc. +// Copyright (c) 2017-2019 Valve Corporation +// Copyright (c) 2017-2019 LunarG, Inc. +// Copyright (c) 2019 Collabora, Ltd. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +// +// Initial Author: Ryan Pavlik +// + +/*! + * @file + * + * Additional functions along the lines of the standard library algorithms. + */ + +#pragma once + +#include +#include + +/// Like std::remove_if, except it works on associative containers and it actually removes this. +/// +/// The iterator stuff in here is subtle - .erase() invalidates only that iterator, but it returns a non-invalidated iterator to the +/// next valid element which we can use instead of incrementing. +template +static inline void map_erase_if(T &container, Pred &&predicate) { + for (auto it = container.begin(); it != container.end();) { + if (predicate(*it)) { + it = container.erase(it); + } else { + ++it; + } + } +} + +/*! + * Moves all elements matching the predicate to the end of the vector then erases them. + * + * Combines the two parts of the erase-remove idiom to simplify things and avoid accidentally using the wrong erase overload. + */ +template +static inline void vector_remove_if_and_erase(std::vector &vec, Pred &&predicate) { + auto b = vec.begin(); + auto e = vec.end(); + vec.erase(std::remove_if(b, e, std::forward(predicate)), e); +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/filesystem_utils.cpp b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/filesystem_utils.cpp new file mode 100644 index 0000000..3b0685d --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/filesystem_utils.cpp @@ -0,0 +1,355 @@ +// Copyright (c) 2017 The Khronos Group Inc. +// Copyright (c) 2017 Valve Corporation +// Copyright (c) 2017 LunarG, Inc. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +// +// Initial Authors: Mark Young +// Nat Brown +// + +#include "filesystem_utils.hpp" + +#include "platform_utils.hpp" + +#include +#include + +#if defined DISABLE_STD_FILESYSTEM +#define USE_EXPERIMENTAL_FS 0 +#define USE_FINAL_FS 0 + +#else +// If the C++ macro is set to the version containing C++17, it must support +// the final C++17 package +#if __cplusplus >= 201703L +#define USE_EXPERIMENTAL_FS 0 +#define USE_FINAL_FS 1 + +#elif defined(_MSC_VER) && _MSC_VER >= 1900 + +#if defined(_HAS_CXX17) && _HAS_CXX17 +// When MSC supports c++17 use package. +#define USE_EXPERIMENTAL_FS 0 +#define USE_FINAL_FS 1 +#endif // !_HAS_CXX17 + +// Right now, GCC still only supports the experimental filesystem items starting in GCC 6 +#elif (__GNUC__ >= 6) +#define USE_EXPERIMENTAL_FS 1 +#define USE_FINAL_FS 0 + +// If Clang, check for feature support +#elif defined(__clang__) && (__cpp_lib_filesystem || __cpp_lib_experimental_filesystem) +#if __cpp_lib_filesystem +#define USE_EXPERIMENTAL_FS 0 +#define USE_FINAL_FS 1 +#else +#define USE_EXPERIMENTAL_FS 1 +#define USE_FINAL_FS 0 +#endif + +// If all above fails, fall back to standard C++ and OS-specific items +#else +#define USE_EXPERIMENTAL_FS 0 +#define USE_FINAL_FS 0 +#endif +#endif + +#if USE_FINAL_FS == 1 +#include +#define FS_PREFIX std::filesystem +#elif USE_EXPERIMENTAL_FS == 1 +#include +#define FS_PREFIX std::experimental::filesystem +#elif defined(XR_USE_PLATFORM_WIN32) +// Windows fallback includes +#include +#include +#else +// Linux/Apple fallback includes +#include +#include +#include +#include +#include +#endif + +#if defined(XR_USE_PLATFORM_WIN32) +#define PATH_SEPARATOR ';' +#define DIRECTORY_SYMBOL '\\' +#define ALTERNATE_DIRECTORY_SYMBOL '/' +#else +#define PATH_SEPARATOR ':' +#define DIRECTORY_SYMBOL '/' +#endif + +#if (USE_FINAL_FS == 1) || (USE_EXPERIMENTAL_FS == 1) +// We can use one of the C++ filesystem packages + +bool FileSysUtilsIsRegularFile(const std::string& path) { return FS_PREFIX::is_regular_file(path); } + +bool FileSysUtilsIsDirectory(const std::string& path) { return FS_PREFIX::is_directory(path); } + +bool FileSysUtilsPathExists(const std::string& path) { return FS_PREFIX::exists(path); } + +bool FileSysUtilsIsAbsolutePath(const std::string& path) { + FS_PREFIX::path file_path(path); + return file_path.is_absolute(); +} + +bool FileSysUtilsGetCurrentPath(std::string& path) { + FS_PREFIX::path cur_path = FS_PREFIX::current_path(); + path = cur_path.string(); + return true; +} + +bool FileSysUtilsGetParentPath(const std::string& file_path, std::string& parent_path) { + FS_PREFIX::path path_var(file_path); + parent_path = path_var.parent_path().string(); + return true; +} + +bool FileSysUtilsGetAbsolutePath(const std::string& path, std::string& absolute) { + absolute = FS_PREFIX::absolute(path).string(); + return true; +} + +bool FileSysUtilsGetCanonicalPath(const std::string& path, std::string& canonical) { +#if defined(XR_USE_PLATFORM_WIN32) + // std::filesystem::canonical fails on UWP and must be avoided. Further, PathCchCanonicalize is not available on Windows 7 and + // PathCanonicalizeW is not available on UWP. However, symbolic links are not important on Windows since the loader uses the + // registry for indirection instead, and so this function can be a no-op on Windows. + canonical = path; +#else + canonical = FS_PREFIX::canonical(path).string(); +#endif + return true; +} + +bool FileSysUtilsCombinePaths(const std::string& parent, const std::string& child, std::string& combined) { + FS_PREFIX::path parent_path(parent); + FS_PREFIX::path child_path(child); + FS_PREFIX::path full_path = parent_path / child_path; + combined = full_path.string(); + return true; +} + +bool FileSysUtilsParsePathList(std::string& path_list, std::vector& paths) { + std::string::size_type start = 0; + std::string::size_type location = path_list.find(PATH_SEPARATOR); + while (location != std::string::npos) { + paths.push_back(path_list.substr(start, location)); + start = location + 1; + location = path_list.find(PATH_SEPARATOR, start); + } + paths.push_back(path_list.substr(start, location)); + return true; +} + +bool FileSysUtilsFindFilesInPath(const std::string& path, std::vector& files) { + for (auto& dir_iter : FS_PREFIX::directory_iterator(path)) { + files.push_back(dir_iter.path().filename().string()); + } + return true; +} + +#elif defined(XR_OS_WINDOWS) + +// For pre C++17 compiler that doesn't support experimental filesystem + +bool FileSysUtilsIsRegularFile(const std::string& path) { + const DWORD attr = GetFileAttributesW(utf8_to_wide(path).c_str()); + return attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY); +} + +bool FileSysUtilsIsDirectory(const std::string& path) { + const DWORD attr = GetFileAttributesW(utf8_to_wide(path).c_str()); + return attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY); +} + +bool FileSysUtilsPathExists(const std::string& path) { + return (GetFileAttributesW(utf8_to_wide(path).c_str()) != INVALID_FILE_ATTRIBUTES); +} + +bool FileSysUtilsIsAbsolutePath(const std::string& path) { + bool pathStartsWithDir = (path.size() >= 1) && ((path[0] == DIRECTORY_SYMBOL) || (path[0] == ALTERNATE_DIRECTORY_SYMBOL)); + + bool pathStartsWithDrive = + (path.size() >= 3) && (path[1] == ':' && (path[2] == DIRECTORY_SYMBOL || path[2] == ALTERNATE_DIRECTORY_SYMBOL)); + + return pathStartsWithDir || pathStartsWithDrive; +} + +bool FileSysUtilsGetCurrentPath(std::string& path) { + wchar_t tmp_path[MAX_PATH]; + if (nullptr != _wgetcwd(tmp_path, MAX_PATH - 1)) { + path = wide_to_utf8(tmp_path); + return true; + } + return false; +} + +bool FileSysUtilsGetParentPath(const std::string& file_path, std::string& parent_path) { + std::string full_path; + if (FileSysUtilsGetAbsolutePath(file_path, full_path)) { + std::string::size_type lastSeparator = full_path.find_last_of(DIRECTORY_SYMBOL); + parent_path = (lastSeparator == 0) ? full_path : full_path.substr(0, lastSeparator); + return true; + } + return false; +} + +bool FileSysUtilsGetAbsolutePath(const std::string& path, std::string& absolute) { + wchar_t tmp_path[MAX_PATH]; + if (0 != GetFullPathNameW(utf8_to_wide(path).c_str(), MAX_PATH, tmp_path, NULL)) { + absolute = wide_to_utf8(tmp_path); + return true; + } + return false; +} + +bool FileSysUtilsGetCanonicalPath(const std::string& path, std::string& absolute) { + // PathCchCanonicalize is not available on Windows 7 and PathCanonicalizeW is not available on UWP. However, symbolic links are + // not important on Windows since the loader uses the registry for indirection instead, and so this function can be a no-op on + // Windows. + absolute = path; + return true; +} + +bool FileSysUtilsCombinePaths(const std::string& parent, const std::string& child, std::string& combined) { + std::string::size_type parent_len = parent.length(); + if (0 == parent_len || "." == parent || ".\\" == parent || "./" == parent) { + combined = child; + return true; + } + char last_char = parent[parent_len - 1]; + if ((last_char == DIRECTORY_SYMBOL) || (last_char == ALTERNATE_DIRECTORY_SYMBOL)) { + parent_len--; + } + combined = parent.substr(0, parent_len) + DIRECTORY_SYMBOL + child; + return true; +} + +bool FileSysUtilsParsePathList(std::string& path_list, std::vector& paths) { + std::string::size_type start = 0; + std::string::size_type location = path_list.find(PATH_SEPARATOR); + while (location != std::string::npos) { + paths.push_back(path_list.substr(start, location)); + start = location + 1; + location = path_list.find(PATH_SEPARATOR, start); + } + paths.push_back(path_list.substr(start, location)); + return true; +} + +bool FileSysUtilsFindFilesInPath(const std::string& path, std::vector& files) { + std::string searchPath; + FileSysUtilsCombinePaths(path, "*", searchPath); + + WIN32_FIND_DATAW file_data; + HANDLE file_handle = FindFirstFileW(utf8_to_wide(searchPath).c_str(), &file_data); + if (file_handle != INVALID_HANDLE_VALUE) { + do { + if (!(file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { + files.push_back(wide_to_utf8(file_data.cFileName)); + } + } while (FindNextFileW(file_handle, &file_data)); + return true; + } + return false; +} + +#else // XR_OS_LINUX/XR_OS_APPLE fallback + +// simple POSIX-compatible implementation of the pieces used by OpenXR + +bool FileSysUtilsIsRegularFile(const std::string& path) { + struct stat path_stat; + stat(path.c_str(), &path_stat); + return S_ISREG(path_stat.st_mode); +} + +bool FileSysUtilsIsDirectory(const std::string& path) { + struct stat path_stat; + stat(path.c_str(), &path_stat); + return S_ISDIR(path_stat.st_mode); +} + +bool FileSysUtilsPathExists(const std::string& path) { return (access(path.c_str(), F_OK) != -1); } + +bool FileSysUtilsIsAbsolutePath(const std::string& path) { return (path[0] == DIRECTORY_SYMBOL); } + +bool FileSysUtilsGetCurrentPath(std::string& path) { + char tmp_path[PATH_MAX]; + if (nullptr != getcwd(tmp_path, PATH_MAX - 1)) { + path = tmp_path; + return true; + } + return false; +} + +bool FileSysUtilsGetParentPath(const std::string& file_path, std::string& parent_path) { + std::string full_path; + if (FileSysUtilsGetAbsolutePath(file_path, full_path)) { + std::string::size_type lastSeparator = full_path.find_last_of(DIRECTORY_SYMBOL); + parent_path = (lastSeparator == 0) ? full_path : full_path.substr(0, lastSeparator); + return true; + } + return false; +} + +bool FileSysUtilsGetAbsolutePath(const std::string& path, std::string& absolute) { + // canonical path is absolute + return FileSysUtilsGetCanonicalPath(path, absolute); +} + +bool FileSysUtilsGetCanonicalPath(const std::string& path, std::string& canonical) { + char buf[PATH_MAX]; + if (nullptr != realpath(path.c_str(), buf)) { + canonical = buf; + return true; + } + return false; +} + +bool FileSysUtilsCombinePaths(const std::string& parent, const std::string& child, std::string& combined) { + std::string::size_type parent_len = parent.length(); + if (0 == parent_len || "." == parent || "./" == parent) { + combined = child; + return true; + } + char last_char = parent[parent_len - 1]; + if (last_char == DIRECTORY_SYMBOL) { + parent_len--; + } + combined = parent.substr(0, parent_len) + DIRECTORY_SYMBOL + child; + return true; +} + +bool FileSysUtilsParsePathList(std::string& path_list, std::vector& paths) { + std::string::size_type start = 0; + std::string::size_type location = path_list.find(PATH_SEPARATOR); + while (location != std::string::npos) { + paths.push_back(path_list.substr(start, location)); + start = location + 1; + location = path_list.find(PATH_SEPARATOR, start); + } + paths.push_back(path_list.substr(start, location)); + return true; +} + +bool FileSysUtilsFindFilesInPath(const std::string& path, std::vector& files) { + DIR* dir = opendir(path.c_str()); + if (dir == nullptr) { + return false; + } + struct dirent* entry; + while ((entry = readdir(dir)) != nullptr) { + files.emplace_back(entry->d_name); + } + closedir(dir); + return true; +} + +#endif diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/filesystem_utils.hpp b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/filesystem_utils.hpp new file mode 100644 index 0000000..4a5c987 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/filesystem_utils.hpp @@ -0,0 +1,46 @@ +// Copyright (c) 2017 The Khronos Group Inc. +// Copyright (c) 2017 Valve Corporation +// Copyright (c) 2017 LunarG, Inc. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +// +// Initial Author: Mark Young +// + +#pragma once + +#include +#include + +// Determine if the path indicates a regular file (not a directory or symbolic link) +bool FileSysUtilsIsRegularFile(const std::string& path); + +// Determine if the path indicates a directory +bool FileSysUtilsIsDirectory(const std::string& path); + +// Determine if the provided path exists on the filesystem +bool FileSysUtilsPathExists(const std::string& path); + +// Get the current directory +bool FileSysUtilsGetCurrentPath(std::string& path); + +// Get the parent path of a file +bool FileSysUtilsGetParentPath(const std::string& file_path, std::string& parent_path); + +// Determine if the provided path is an absolute path +bool FileSysUtilsIsAbsolutePath(const std::string& path); + +// Get the absolute path for a provided file +bool FileSysUtilsGetAbsolutePath(const std::string& path, std::string& absolute); + +// Get the absolute path for a provided file +bool FileSysUtilsGetCanonicalPath(const std::string& path, std::string& canonical); + +// Combine a parent and child directory +bool FileSysUtilsCombinePaths(const std::string& parent, const std::string& child, std::string& combined); + +// Parse out individual paths in a path list +bool FileSysUtilsParsePathList(std::string& path_list, std::vector& paths); + +// Record all the filenames for files found in the provided path. +bool FileSysUtilsFindFilesInPath(const std::string& path, std::vector& files); diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/gfxwrapper_opengl.c b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/gfxwrapper_opengl.c new file mode 100644 index 0000000..2cd1a29 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/gfxwrapper_opengl.c @@ -0,0 +1,4460 @@ +/* +Copyright (c) 2016 Oculus VR, LLC. +Portions of macOS, iOS, functionality copyright (c) 2016 The Brenwill Workshop Ltd. + +SPDX-License-Identifier: Apache-2.0 +*/ + +#include "gfxwrapper_opengl.h" + +/* +================================================================================================================================ + +System level functionality + +================================================================================================================================ +*/ + +static void *AllocAlignedMemory(size_t size, size_t alignment) { + alignment = (alignment < sizeof(void *)) ? sizeof(void *) : alignment; +#if defined(OS_WINDOWS) + return _aligned_malloc(size, alignment); +#elif defined(OS_APPLE) + void *ptr = NULL; + return (posix_memalign(&ptr, alignment, size) == 0) ? ptr : NULL; +#else + return memalign(alignment, size); +#endif +} + +static void FreeAlignedMemory(void *ptr) { +#if defined(OS_WINDOWS) + _aligned_free(ptr); +#else + free(ptr); +#endif +} + +static void Print(const char *format, ...) { +#if defined(OS_WINDOWS) + char buffer[4096]; + va_list args; + va_start(args, format); + vsnprintf_s(buffer, 4096, _TRUNCATE, format, args); + va_end(args); + + OutputDebugStringA(buffer); +#elif defined(OS_LINUX) + va_list args; + va_start(args, format); + vprintf(format, args); + va_end(args); + fflush(stdout); +#elif defined(OS_APPLE) + char buffer[4096]; + va_list args; + va_start(args, format); + vsnprintf(buffer, 4096, format, args); + va_end(args); + + NSLog(@"%s", buffer); +#elif defined(OS_ANDROID) + char buffer[4096]; + va_list args; + va_start(args, format); + vsnprintf(buffer, 4096, format, args); + va_end(args); + + __android_log_print(ANDROID_LOG_VERBOSE, "atw", "%s", buffer); +#endif +} + +static void Error(const char *format, ...) { +#if defined(OS_WINDOWS) + char buffer[4096]; + va_list args; + va_start(args, format); + vsnprintf_s(buffer, 4096, _TRUNCATE, format, args); + va_end(args); + + OutputDebugStringA(buffer); + + // MessageBoxA(NULL, buffer, "ERROR", MB_OK | MB_ICONINFORMATION); +#elif defined(OS_LINUX) + va_list args; + va_start(args, format); + vprintf(format, args); + va_end(args); + printf("\n"); + fflush(stdout); +#elif defined(OS_APPLE_MACOS) + char buffer[4096]; + va_list args; + va_start(args, format); + int length = vsnprintf(buffer, 4096, format, args); + va_end(args); + + NSLog(@"%s\n", buffer); + + if ([NSThread isMainThread]) { + NSString *string = [[NSString alloc] initWithBytes:buffer length:length encoding:NSASCIIStringEncoding]; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"OK"]; + [alert setMessageText:@"Error"]; + [alert setInformativeText:string]; + [alert setAlertStyle:NSWarningAlertStyle]; + [alert runModal]; +#pragma GCC diagnostic pop + } +#elif defined(OS_APPLE_IOS) + char buffer[4096]; + va_list args; + va_start(args, format); + int length = vsnprintf(buffer, 4096, format, args); + va_end(args); + + NSLog(@"%s\n", buffer); + + if ([NSThread isMainThread]) { + NSString *string = [[NSString alloc] initWithBytes:buffer length:length encoding:NSASCIIStringEncoding]; + UIAlertController *alert = + [UIAlertController alertControllerWithTitle:@"Error" message:string preferredStyle:UIAlertControllerStyleAlert]; + [alert addAction:[UIAlertAction actionWithTitle:@"OK" + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action){ + }]]; + [UIApplication.sharedApplication.keyWindow.rootViewController presentViewController:alert animated:YES completion:nil]; + } +#elif defined(OS_ANDROID) + char buffer[4096]; + va_list args; + va_start(args, format); + vsnprintf(buffer, 4096, format, args); + va_end(args); + + __android_log_print(ANDROID_LOG_ERROR, "atw", "%s", buffer); +#endif + // Without exiting, the application will likely crash. + if (format != NULL) { + exit(0); + } +} + +/* +================================================================================================================================ + +Frame logging. + +Each thread that calls ksFrameLog_Open will open its own log. +A frame log is always opened for a specified number of frames, and will +automatically close after the specified number of frames have been recorded. +The CPU and GPU times for the recorded frames will be listed at the end of the log. + +ksFrameLog + +static void ksFrameLog_Open( const char * fileName, const int frameCount ); +static void ksFrameLog_Write( const char * fileName, const int lineNumber, const char * function ); +static void ksFrameLog_BeginFrame(); +static void ksFrameLog_EndFrame( const ksNanoseconds cpuTimeNanoseconds, const ksNanoseconds gpuTimeNanoseconds, const int +gpuTimeFramesDelayed ); + +================================================================================================================================ +*/ + +typedef struct { + FILE *fp; + ksNanoseconds *frameCpuTimes; + ksNanoseconds *frameGpuTimes; + int frameCount; + int frame; +} ksFrameLog; + +__thread ksFrameLog *threadFrameLog; + +static ksFrameLog *ksFrameLog_Get() { + ksFrameLog *l = threadFrameLog; + if (l == NULL) { + l = (ksFrameLog *)malloc(sizeof(ksFrameLog)); + memset(l, 0, sizeof(ksFrameLog)); + threadFrameLog = l; + } + return l; +} + +static void ksFrameLog_Open(const char *fileName, const int frameCount) { + ksFrameLog *l = ksFrameLog_Get(); + if (l != NULL && l->fp == NULL) { + l->fp = fopen(fileName, "wb"); + if (l->fp == NULL) { + Print("Failed to open %s\n", fileName); + } else { + Print("Opened frame log %s for %d frames.\n", fileName, frameCount); + l->frameCpuTimes = (ksNanoseconds *)malloc(frameCount * sizeof(l->frameCpuTimes[0])); + l->frameGpuTimes = (ksNanoseconds *)malloc(frameCount * sizeof(l->frameGpuTimes[0])); + memset(l->frameCpuTimes, 0, frameCount * sizeof(l->frameCpuTimes[0])); + memset(l->frameGpuTimes, 0, frameCount * sizeof(l->frameGpuTimes[0])); + l->frameCount = frameCount; + l->frame = 0; + } + } +} + +static void ksFrameLog_Write(const char *fileName, const int lineNumber, const char *function) { + ksFrameLog *l = ksFrameLog_Get(); + if (l != NULL && l->fp != NULL) { + if (l->frame < l->frameCount) { + fprintf(l->fp, "%s(%d): %s\r\n", fileName, lineNumber, function); + } + } +} + +static void ksFrameLog_BeginFrame() { + ksFrameLog *l = ksFrameLog_Get(); + if (l != NULL && l->fp != NULL) { + if (l->frame < l->frameCount) { +#if !defined(NDEBUG) + fprintf(l->fp, "================ BEGIN FRAME %d ================\r\n", l->frame); +#endif + } + } +} + +static void ksFrameLog_EndFrame(const ksNanoseconds cpuTimeNanoseconds, const ksNanoseconds gpuTimeNanoseconds, + const int gpuTimeFramesDelayed) { + ksFrameLog *l = ksFrameLog_Get(); + if (l != NULL && l->fp != NULL) { + if (l->frame < l->frameCount) { + l->frameCpuTimes[l->frame] = cpuTimeNanoseconds; +#if !defined(NDEBUG) + fprintf(l->fp, "================ END FRAME %d ================\r\n", l->frame); +#endif + } + if (l->frame >= gpuTimeFramesDelayed && l->frame < l->frameCount + gpuTimeFramesDelayed) { + l->frameGpuTimes[l->frame - gpuTimeFramesDelayed] = gpuTimeNanoseconds; + } + + l->frame++; + + if (l->frame >= l->frameCount + gpuTimeFramesDelayed) { + for (int i = 0; i < l->frameCount; i++) { + fprintf(l->fp, "frame %d: CPU = %1.1f ms, GPU = %1.1f ms\r\n", i, l->frameCpuTimes[i] * 1e-6f, + l->frameGpuTimes[i] * 1e-6f); + } + + Print("Closing frame log file (%d frames).\n", l->frameCount); + fclose(l->fp); + free(l->frameCpuTimes); + free(l->frameGpuTimes); + memset(l, 0, sizeof(ksFrameLog)); + } + } +} + +/* +================================================================================================================================ + +OpenGL error checking. + +================================================================================================================================ +*/ + +#if !defined(NDEBUG) +#define GL(func) \ + func; \ + ksFrameLog_Write(__FILE__, __LINE__, #func); \ + GlCheckErrors(#func); +#else +#define GL(func) func; +#endif + +#if !defined(NDEBUG) +#define EGL(func) \ + ksFrameLog_Write(__FILE__, __LINE__, #func); \ + if (func == EGL_FALSE) { \ + Error(#func " failed: %s", EglErrorString(eglGetError())); \ + } +#else +#define EGL(func) \ + if (func == EGL_FALSE) { \ + Error(#func " failed: %s", EglErrorString(eglGetError())); \ + } +#endif + +#if defined(OS_ANDROID) || defined(OS_LINUX_WAYLAND) +static const char *EglErrorString(const EGLint error) { + switch (error) { + case EGL_SUCCESS: + return "EGL_SUCCESS"; + case EGL_NOT_INITIALIZED: + return "EGL_NOT_INITIALIZED"; + case EGL_BAD_ACCESS: + return "EGL_BAD_ACCESS"; + case EGL_BAD_ALLOC: + return "EGL_BAD_ALLOC"; + case EGL_BAD_ATTRIBUTE: + return "EGL_BAD_ATTRIBUTE"; + case EGL_BAD_CONTEXT: + return "EGL_BAD_CONTEXT"; + case EGL_BAD_CONFIG: + return "EGL_BAD_CONFIG"; + case EGL_BAD_CURRENT_SURFACE: + return "EGL_BAD_CURRENT_SURFACE"; + case EGL_BAD_DISPLAY: + return "EGL_BAD_DISPLAY"; + case EGL_BAD_SURFACE: + return "EGL_BAD_SURFACE"; + case EGL_BAD_MATCH: + return "EGL_BAD_MATCH"; + case EGL_BAD_PARAMETER: + return "EGL_BAD_PARAMETER"; + case EGL_BAD_NATIVE_PIXMAP: + return "EGL_BAD_NATIVE_PIXMAP"; + case EGL_BAD_NATIVE_WINDOW: + return "EGL_BAD_NATIVE_WINDOW"; + case EGL_CONTEXT_LOST: + return "EGL_CONTEXT_LOST"; + default: + return "unknown"; + } +} +#endif + +static const char *GlErrorString(GLenum error) { + switch (error) { + case GL_NO_ERROR: + return "GL_NO_ERROR"; + case GL_INVALID_ENUM: + return "GL_INVALID_ENUM"; + case GL_INVALID_VALUE: + return "GL_INVALID_VALUE"; + case GL_INVALID_OPERATION: + return "GL_INVALID_OPERATION"; + case GL_INVALID_FRAMEBUFFER_OPERATION: + return "GL_INVALID_FRAMEBUFFER_OPERATION"; + case GL_OUT_OF_MEMORY: + return "GL_OUT_OF_MEMORY"; +#if !defined(OS_APPLE_MACOS) && !defined(OS_ANDROID) && !defined(OS_APPLE_IOS) + case GL_STACK_UNDERFLOW: + return "GL_STACK_UNDERFLOW"; + case GL_STACK_OVERFLOW: + return "GL_STACK_OVERFLOW"; +#endif + default: + return "unknown"; + } +} + +static const char *GlFramebufferStatusString(GLenum status) { + switch (status) { + case GL_FRAMEBUFFER_UNDEFINED: + return "GL_FRAMEBUFFER_UNDEFINED"; + case GL_FRAMEBUFFER_UNSUPPORTED: + return "GL_FRAMEBUFFER_UNSUPPORTED"; + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: + return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: + return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; + case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: + return "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"; +#if !defined(OS_ANDROID) && !defined(OS_APPLE_IOS) + case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: + return "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER"; + case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: + return "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER"; + case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS: + return "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS"; +#endif + default: + return "unknown"; + } +} + +static void GlCheckErrors(const char *function) { + for (int i = 0; i < 10; i++) { + const GLenum error = glGetError(); + if (error == GL_NO_ERROR) { + break; + } + Error("GL error: %s: %s", function, GlErrorString(error)); + } +} + +/* +================================================================================================================================ + +OpenGL extensions. + +================================================================================================================================ +*/ + +typedef struct { + bool timer_query; // GL_ARB_timer_query, GL_EXT_disjoint_timer_query + bool texture_clamp_to_border; // GL_EXT_texture_border_clamp, GL_OES_texture_border_clamp + bool buffer_storage; // GL_ARB_buffer_storage + bool multi_sampled_storage; // GL_ARB_texture_storage_multisample + bool multi_view; // GL_OVR_multiview, GL_OVR_multiview2 + bool multi_sampled_resolve; // GL_EXT_multisampled_render_to_texture + bool multi_view_multi_sampled_resolve; // GL_OVR_multiview_multisampled_render_to_texture + + int texture_clamp_to_border_id; +} ksOpenGLExtensions; + +ksOpenGLExtensions glExtensions; + +/* +================================ +Get proc address / extensions +================================ +*/ + +#if defined(OS_WINDOWS) +PROC GetExtension(const char *functionName) { return wglGetProcAddress(functionName); } +#elif defined(OS_APPLE) +void (*GetExtension(const char *functionName))() { return NULL; } +#elif defined(OS_LINUX_XCB) || defined(OS_LINUX_XLIB) || defined(OS_LINUX_XCB_GLX) +void (*GetExtension(const char *functionName))() { return glXGetProcAddress((const GLubyte *)functionName); } +#elif defined(OS_ANDROID) || defined(OS_LINUX_WAYLAND) +void (*GetExtension(const char *functionName))() { return eglGetProcAddress(functionName); } +#endif + +GLint glGetInteger(GLenum pname) { + GLint i; + GL(glGetIntegerv(pname, &i)); + return i; +} + +static bool GlCheckExtension(const char *extension) { +#if defined(OS_WINDOWS) || defined(OS_LINUX) + PFNGLGETSTRINGIPROC glGetStringi = (PFNGLGETSTRINGIPROC)GetExtension("glGetStringi"); +#endif + GL(const GLint numExtensions = glGetInteger(GL_NUM_EXTENSIONS)); + for (int i = 0; i < numExtensions; i++) { + GL(const GLubyte *string = glGetStringi(GL_EXTENSIONS, i)); + if (strcmp((const char *)string, extension) == 0) { + return true; + } + } + return false; +} + +#if defined(OS_WINDOWS) || defined(OS_LINUX) + +PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; +PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; +PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; +PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; +PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; +PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; +PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; +PFNGLISRENDERBUFFERPROC glIsRenderbuffer; +PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; +PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; +PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; +PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; +PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; +PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR; +PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC glFramebufferTextureMultisampleMultiviewOVR; +PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; +PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glCheckNamedFramebufferStatus; + +PFNGLGENBUFFERSPROC glGenBuffers; +PFNGLDELETEBUFFERSPROC glDeleteBuffers; +PFNGLBINDBUFFERPROC glBindBuffer; +PFNGLBINDBUFFERBASEPROC glBindBufferBase; +PFNGLBUFFERDATAPROC glBufferData; +PFNGLBUFFERSUBDATAPROC glBufferSubData; +PFNGLBUFFERSTORAGEPROC glBufferStorage; +PFNGLMAPBUFFERPROC glMapBuffer; +PFNGLMAPBUFFERRANGEPROC glMapBufferRange; +PFNGLUNMAPBUFFERPROC glUnmapBuffer; + +PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; +PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; +PFNGLBINDVERTEXARRAYPROC glBindVertexArray; +PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; +PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor; +PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; +PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; + +#if defined(OS_WINDOWS) +PFNGLACTIVETEXTUREPROC glActiveTexture; +PFNGLTEXIMAGE3DPROC glTexImage3D; +PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D; +PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D; +PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D; +PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D; +#endif +PFNGLTEXSTORAGE2DPROC glTexStorage2D; +PFNGLTEXSTORAGE3DPROC glTexStorage3D; +PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; +PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample; +PFNGLTEXSTORAGE2DMULTISAMPLEPROC glTexStorage2DMultisample; +PFNGLTEXSTORAGE3DMULTISAMPLEPROC glTexStorage3DMultisample; +PFNGLGENERATEMIPMAPPROC glGenerateMipmap; +PFNGLBINDIMAGETEXTUREPROC glBindImageTexture; + +PFNGLCREATEPROGRAMPROC glCreateProgram; +PFNGLDELETEPROGRAMPROC glDeleteProgram; +PFNGLCREATESHADERPROC glCreateShader; +PFNGLDELETESHADERPROC glDeleteShader; +PFNGLSHADERSOURCEPROC glShaderSource; +PFNGLCOMPILESHADERPROC glCompileShader; +PFNGLGETSHADERIVPROC glGetShaderiv; +PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; +PFNGLUSEPROGRAMPROC glUseProgram; +PFNGLATTACHSHADERPROC glAttachShader; +PFNGLLINKPROGRAMPROC glLinkProgram; +PFNGLGETPROGRAMIVPROC glGetProgramiv; +PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; +PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation; +PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; +PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; +PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; +PFNGLGETPROGRAMRESOURCEINDEXPROC glGetProgramResourceIndex; +PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; +PFNGLSHADERSTORAGEBLOCKBINDINGPROC glShaderStorageBlockBinding; +PFNGLPROGRAMUNIFORM1IPROC glProgramUniform1i; +PFNGLUNIFORM1IPROC glUniform1i; +PFNGLUNIFORM1IVPROC glUniform1iv; +PFNGLUNIFORM2IVPROC glUniform2iv; +PFNGLUNIFORM3IVPROC glUniform3iv; +PFNGLUNIFORM4IVPROC glUniform4iv; +PFNGLUNIFORM1FPROC glUniform1f; +PFNGLUNIFORM1FVPROC glUniform1fv; +PFNGLUNIFORM2FVPROC glUniform2fv; +PFNGLUNIFORM3FVPROC glUniform3fv; +PFNGLUNIFORM4FVPROC glUniform4fv; +PFNGLUNIFORMMATRIX2FVPROC glUniformMatrix2fv; +PFNGLUNIFORMMATRIX2X3FVPROC glUniformMatrix2x3fv; +PFNGLUNIFORMMATRIX2X4FVPROC glUniformMatrix2x4fv; +PFNGLUNIFORMMATRIX3X2FVPROC glUniformMatrix3x2fv; +PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv; +PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv; +PFNGLUNIFORMMATRIX4X2FVPROC glUniformMatrix4x2fv; +PFNGLUNIFORMMATRIX4X3FVPROC glUniformMatrix4x3fv; +PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv; + +PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced; +PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; +PFNGLMEMORYBARRIERPROC glMemoryBarrier; + +PFNGLGENQUERIESPROC glGenQueries; +PFNGLDELETEQUERIESPROC glDeleteQueries; +PFNGLISQUERYPROC glIsQuery; +PFNGLBEGINQUERYPROC glBeginQuery; +PFNGLENDQUERYPROC glEndQuery; +PFNGLQUERYCOUNTERPROC glQueryCounter; +PFNGLGETQUERYIVPROC glGetQueryiv; +PFNGLGETQUERYOBJECTIVPROC glGetQueryObjectiv; +PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv; +PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v; +PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v; + +PFNGLFENCESYNCPROC glFenceSync; +PFNGLCLIENTWAITSYNCPROC glClientWaitSync; +PFNGLDELETESYNCPROC glDeleteSync; +PFNGLISSYNCPROC glIsSync; + +PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate; +PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate; + +PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl; +PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback; + +#if defined(OS_WINDOWS) +PFNGLBLENDCOLORPROC glBlendColor; +PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB; +PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; +PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT; +PFNWGLDELAYBEFORESWAPNVPROC wglDelayBeforeSwapNV; +#elif defined(OS_LINUX) && !defined(OS_LINUX_WAYLAND) +PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB; +PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT; +PFNGLXDELAYBEFORESWAPNVPROC glXDelayBeforeSwapNV; +#endif + +void GlBootstrapExtensions() { +#if defined(OS_WINDOWS) + wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)GetExtension("wglChoosePixelFormatARB"); + wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)GetExtension("wglCreateContextAttribsARB"); + wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)GetExtension("wglSwapIntervalEXT"); + wglDelayBeforeSwapNV = (PFNWGLDELAYBEFORESWAPNVPROC)GetExtension("wglDelayBeforeSwapNV"); +#elif defined(OS_LINUX) && !defined(OS_LINUX_WAYLAND) + glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)GetExtension("glXCreateContextAttribsARB"); + glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)GetExtension("glXSwapIntervalEXT"); + glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC)GetExtension("glXDelayBeforeSwapNV"); +#endif +} + +void GlInitExtensions() { + glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)GetExtension("glGenFramebuffers"); + glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)GetExtension("glDeleteFramebuffers"); + glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)GetExtension("glBindFramebuffer"); + glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)GetExtension("glBlitFramebuffer"); + glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)GetExtension("glGenRenderbuffers"); + glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)GetExtension("glDeleteRenderbuffers"); + glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)GetExtension("glBindRenderbuffer"); + glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)GetExtension("glIsRenderbuffer"); + glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)GetExtension("glRenderbufferStorage"); + glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)GetExtension("glRenderbufferStorageMultisample"); + glRenderbufferStorageMultisampleEXT = + (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)GetExtension("glRenderbufferStorageMultisampleEXT"); + glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)GetExtension("glFramebufferRenderbuffer"); + glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)GetExtension("glFramebufferTexture2D"); + glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)GetExtension("glFramebufferTextureLayer"); + glFramebufferTexture2DMultisampleEXT = + (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)GetExtension("glFramebufferTexture2DMultisampleEXT"); + glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)GetExtension("glFramebufferTextureMultiviewOVR"); + glFramebufferTextureMultisampleMultiviewOVR = + (PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)GetExtension("glFramebufferTextureMultisampleMultiviewOVR"); + glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)GetExtension("glCheckFramebufferStatus"); + glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)GetExtension("glCheckNamedFramebufferStatus"); + + glGenBuffers = (PFNGLGENBUFFERSPROC)GetExtension("glGenBuffers"); + glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)GetExtension("glDeleteBuffers"); + glBindBuffer = (PFNGLBINDBUFFERPROC)GetExtension("glBindBuffer"); + glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)GetExtension("glBindBufferBase"); + glBufferData = (PFNGLBUFFERDATAPROC)GetExtension("glBufferData"); + glBufferSubData = (PFNGLBUFFERSUBDATAPROC)GetExtension("glBufferSubData"); + glBufferStorage = (PFNGLBUFFERSTORAGEPROC)GetExtension("glBufferStorage"); + glMapBuffer = (PFNGLMAPBUFFERPROC)GetExtension("glMapBuffer"); + glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)GetExtension("glMapBufferRange"); + glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)GetExtension("glUnmapBuffer"); + + glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)GetExtension("glGenVertexArrays"); + glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)GetExtension("glDeleteVertexArrays"); + glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)GetExtension("glBindVertexArray"); + glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)GetExtension("glVertexAttribPointer"); + glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)GetExtension("glVertexAttribDivisor"); + glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)GetExtension("glDisableVertexAttribArray"); + glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)GetExtension("glEnableVertexAttribArray"); + +#if defined(OS_WINDOWS) + glActiveTexture = (PFNGLACTIVETEXTUREPROC)GetExtension("glActiveTexture"); + glTexImage3D = (PFNGLTEXIMAGE3DPROC)GetExtension("glTexImage3D"); + glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)GetExtension("glCompressedTexImage2D "); + glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)GetExtension("glCompressedTexImage3D "); + glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)GetExtension("glTexSubImage3D"); + glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)GetExtension("glCompressedTexSubImage2D"); + glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)GetExtension("glCompressedTexSubImage3D"); +#endif + glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)GetExtension("glTexStorage2D"); + glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)GetExtension("glTexStorage3D"); + glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)GetExtension("glTexImage2DMultisample"); + glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)GetExtension("glTexImage3DMultisample"); + glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)GetExtension("glTexStorage2DMultisample"); + glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)GetExtension("glTexStorage3DMultisample"); + glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)GetExtension("glGenerateMipmap"); + glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)GetExtension("glBindImageTexture"); + + glCreateProgram = (PFNGLCREATEPROGRAMPROC)GetExtension("glCreateProgram"); + glDeleteProgram = (PFNGLDELETEPROGRAMPROC)GetExtension("glDeleteProgram"); + glCreateShader = (PFNGLCREATESHADERPROC)GetExtension("glCreateShader"); + glDeleteShader = (PFNGLDELETESHADERPROC)GetExtension("glDeleteShader"); + glShaderSource = (PFNGLSHADERSOURCEPROC)GetExtension("glShaderSource"); + glCompileShader = (PFNGLCOMPILESHADERPROC)GetExtension("glCompileShader"); + glGetShaderiv = (PFNGLGETSHADERIVPROC)GetExtension("glGetShaderiv"); + glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)GetExtension("glGetShaderInfoLog"); + glUseProgram = (PFNGLUSEPROGRAMPROC)GetExtension("glUseProgram"); + glAttachShader = (PFNGLATTACHSHADERPROC)GetExtension("glAttachShader"); + glLinkProgram = (PFNGLLINKPROGRAMPROC)GetExtension("glLinkProgram"); + glGetProgramiv = (PFNGLGETPROGRAMIVPROC)GetExtension("glGetProgramiv"); + glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)GetExtension("glGetProgramInfoLog"); + glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)GetExtension("glGetAttribLocation"); + glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)GetExtension("glBindAttribLocation"); + glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)GetExtension("glGetUniformLocation"); + glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)GetExtension("glGetUniformBlockIndex"); + glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)GetExtension("glProgramUniform1i"); + glUniform1i = (PFNGLUNIFORM1IPROC)GetExtension("glUniform1i"); + glUniform1iv = (PFNGLUNIFORM1IVPROC)GetExtension("glUniform1iv"); + glUniform2iv = (PFNGLUNIFORM2IVPROC)GetExtension("glUniform2iv"); + glUniform3iv = (PFNGLUNIFORM3IVPROC)GetExtension("glUniform3iv"); + glUniform4iv = (PFNGLUNIFORM4IVPROC)GetExtension("glUniform4iv"); + glUniform1f = (PFNGLUNIFORM1FPROC)GetExtension("glUniform1f"); + glUniform1fv = (PFNGLUNIFORM1FVPROC)GetExtension("glUniform1fv"); + glUniform2fv = (PFNGLUNIFORM2FVPROC)GetExtension("glUniform2fv"); + glUniform3fv = (PFNGLUNIFORM3FVPROC)GetExtension("glUniform3fv"); + glUniform4fv = (PFNGLUNIFORM4FVPROC)GetExtension("glUniform4fv"); + glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)GetExtension("glUniformMatrix3fv"); + glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)GetExtension("glUniformMatrix2x3fv"); + glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)GetExtension("glUniformMatrix2x4fv"); + glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)GetExtension("glUniformMatrix3x2fv"); + glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)GetExtension("glUniformMatrix3fv"); + glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)GetExtension("glUniformMatrix3x4fv"); + glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)GetExtension("glUniformMatrix4x2fv"); + glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)GetExtension("glUniformMatrix4x3fv"); + glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)GetExtension("glUniformMatrix4fv"); + glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)GetExtension("glGetProgramResourceIndex"); + glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)GetExtension("glUniformBlockBinding"); + glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)GetExtension("glShaderStorageBlockBinding"); + + glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)GetExtension("glDrawElementsInstanced"); + glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)GetExtension("glDispatchCompute"); + glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)GetExtension("glMemoryBarrier"); + + glGenQueries = (PFNGLGENQUERIESPROC)GetExtension("glGenQueries"); + glDeleteQueries = (PFNGLDELETEQUERIESPROC)GetExtension("glDeleteQueries"); + glIsQuery = (PFNGLISQUERYPROC)GetExtension("glIsQuery"); + glBeginQuery = (PFNGLBEGINQUERYPROC)GetExtension("glBeginQuery"); + glEndQuery = (PFNGLENDQUERYPROC)GetExtension("glEndQuery"); + glQueryCounter = (PFNGLQUERYCOUNTERPROC)GetExtension("glQueryCounter"); + glGetQueryiv = (PFNGLGETQUERYIVPROC)GetExtension("glGetQueryiv"); + glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)GetExtension("glGetQueryObjectiv"); + glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)GetExtension("glGetQueryObjectuiv"); + glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)GetExtension("glGetQueryObjecti64v"); + glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)GetExtension("glGetQueryObjectui64v"); + + glFenceSync = (PFNGLFENCESYNCPROC)GetExtension("glFenceSync"); + glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)GetExtension("glClientWaitSync"); + glDeleteSync = (PFNGLDELETESYNCPROC)GetExtension("glDeleteSync"); + glIsSync = (PFNGLISSYNCPROC)GetExtension("glIsSync"); + + glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)GetExtension("glBlendFuncSeparate"); + glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)GetExtension("glBlendEquationSeparate"); + +#if defined(OS_WINDOWS) + glBlendColor = (PFNGLBLENDCOLORPROC)GetExtension("glBlendColor"); +#endif + + glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)GetExtension("glDebugMessageControl"); + glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)GetExtension("glDebugMessageCallback"); + + glExtensions.timer_query = GlCheckExtension("GL_EXT_timer_query"); + glExtensions.texture_clamp_to_border = true; // always available + glExtensions.buffer_storage = + GlCheckExtension("GL_EXT_buffer_storage") || (OPENGL_VERSION_MAJOR * 10 + OPENGL_VERSION_MINOR >= 44); + glExtensions.multi_sampled_storage = + GlCheckExtension("GL_ARB_texture_storage_multisample") || (OPENGL_VERSION_MAJOR * 10 + OPENGL_VERSION_MINOR >= 43); + glExtensions.multi_view = GlCheckExtension("GL_OVR_multiview2"); + glExtensions.multi_sampled_resolve = GlCheckExtension("GL_EXT_multisampled_render_to_texture"); + glExtensions.multi_view_multi_sampled_resolve = GlCheckExtension("GL_OVR_multiview_multisampled_render_to_texture"); + + glExtensions.texture_clamp_to_border_id = GL_CLAMP_TO_BORDER; +} + +#elif defined(OS_APPLE_MACOS) + +PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR; +PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC glFramebufferTextureMultisampleMultiviewOVR; +PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; + +void GlInitExtensions() { + glExtensions.timer_query = GlCheckExtension("GL_EXT_timer_query"); + glExtensions.texture_clamp_to_border = true; // always available + glExtensions.buffer_storage = + GlCheckExtension("GL_EXT_buffer_storage") || (OPENGL_VERSION_MAJOR * 10 + OPENGL_VERSION_MINOR >= 44); + glExtensions.multi_sampled_storage = + GlCheckExtension("GL_ARB_texture_storage_multisample") || (OPENGL_VERSION_MAJOR * 10 + OPENGL_VERSION_MINOR >= 43); + glExtensions.multi_view = GlCheckExtension("GL_OVR_multiview2"); + glExtensions.multi_sampled_resolve = GlCheckExtension("GL_EXT_multisampled_render_to_texture"); + glExtensions.multi_view_multi_sampled_resolve = GlCheckExtension("GL_OVR_multiview_multisampled_render_to_texture"); + + glExtensions.texture_clamp_to_border_id = GL_CLAMP_TO_BORDER; +} + +#elif defined(OS_ANDROID) + +// GL_EXT_disjoint_timer_query without _EXT +#if !defined(GL_TIMESTAMP) +#define GL_QUERY_COUNTER_BITS GL_QUERY_COUNTER_BITS_EXT +#define GL_TIME_ELAPSED GL_TIME_ELAPSED_EXT +#define GL_TIMESTAMP GL_TIMESTAMP_EXT +#define GL_GPU_DISJOINT GL_GPU_DISJOINT_EXT +#endif + +// GL_EXT_buffer_storage without _EXT +#if !defined(GL_BUFFER_STORAGE_FLAGS) +#define GL_MAP_READ_BIT 0x0001 // GL_MAP_READ_BIT_EXT +#define GL_MAP_WRITE_BIT 0x0002 // GL_MAP_WRITE_BIT_EXT +#define GL_MAP_PERSISTENT_BIT 0x0040 // GL_MAP_PERSISTENT_BIT_EXT +#define GL_MAP_COHERENT_BIT 0x0080 // GL_MAP_COHERENT_BIT_EXT +#define GL_DYNAMIC_STORAGE_BIT 0x0100 // GL_DYNAMIC_STORAGE_BIT_EXT +#define GL_CLIENT_STORAGE_BIT 0x0200 // GL_CLIENT_STORAGE_BIT_EXT +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 // GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F // GL_BUFFER_IMMUTABLE_STORAGE_EXT +#define GL_BUFFER_STORAGE_FLAGS 0x8220 // GL_BUFFER_STORAGE_FLAGS_EXT +#endif + +typedef void(GL_APIENTRY *PFNGLBUFFERSTORAGEEXTPROC)(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void(GL_APIENTRY *PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, + GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +// EGL_KHR_fence_sync, GL_OES_EGL_sync, VG_KHR_EGL_sync +PFNEGLCREATESYNCKHRPROC eglCreateSyncKHR; +PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR; +PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR; +PFNEGLGETSYNCATTRIBKHRPROC eglGetSyncAttribKHR; + +// GL_EXT_disjoint_timer_query +PFNGLQUERYCOUNTEREXTPROC glQueryCounter; +PFNGLGETQUERYOBJECTI64VEXTPROC glGetQueryObjecti64v; +PFNGLGETQUERYOBJECTUI64VEXTPROC glGetQueryObjectui64v; + +// GL_EXT_buffer_storage +PFNGLBUFFERSTORAGEEXTPROC glBufferStorage; + +// GL_OVR_multiview +PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR; + +// GL_EXT_multisampled_render_to_texture +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; +PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; + +// GL_OVR_multiview_multisampled_render_to_texture +PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC glFramebufferTextureMultisampleMultiviewOVR; + +#ifndef GL_ES_VERSION_3_2 +PFNGLTEXSTORAGE3DMULTISAMPLEPROC glTexStorage3DMultisample; +#endif + +#if !defined(EGL_OPENGL_ES3_BIT) +#define EGL_OPENGL_ES3_BIT 0x0040 +#endif + +// GL_EXT_texture_cube_map_array +#if !defined(GL_TEXTURE_CUBE_MAP_ARRAY) +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#endif + +// GL_EXT_texture_filter_anisotropic +#if !defined(GL_TEXTURE_MAX_ANISOTROPY_EXT) +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +// GL_EXT_texture_border_clamp or GL_OES_texture_border_clamp +#if !defined(GL_CLAMP_TO_BORDER) +#define GL_CLAMP_TO_BORDER 0x812D +#endif + +// No 1D textures in OpenGL ES. +#if !defined(GL_TEXTURE_1D) +#define GL_TEXTURE_1D 0x0DE0 +#endif + +// No 1D texture arrays in OpenGL ES. +#if !defined(GL_TEXTURE_1D_ARRAY) +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#endif + +// No multi-sampled texture arrays in OpenGL ES. +#if !defined(GL_TEXTURE_2D_MULTISAMPLE_ARRAY) +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#endif + +void GlInitExtensions() { + eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC)GetExtension("eglCreateSyncKHR"); + eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)GetExtension("eglDestroySyncKHR"); + eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)GetExtension("eglClientWaitSyncKHR"); + eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC)GetExtension("eglGetSyncAttribKHR"); + + glQueryCounter = (PFNGLQUERYCOUNTEREXTPROC)GetExtension("glQueryCounterEXT"); + glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VEXTPROC)GetExtension("glGetQueryObjecti64vEXT"); + glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VEXTPROC)GetExtension("glGetQueryObjectui64vEXT"); + + glBufferStorage = (PFNGLBUFFERSTORAGEEXTPROC)GetExtension("glBufferStorageEXT"); + + glRenderbufferStorageMultisampleEXT = + (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)GetExtension("glRenderbufferStorageMultisampleEXT"); + glFramebufferTexture2DMultisampleEXT = + (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)GetExtension("glFramebufferTexture2DMultisampleEXT"); + glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)GetExtension("glFramebufferTextureMultiviewOVR"); + glFramebufferTextureMultisampleMultiviewOVR = + (PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)GetExtension("glFramebufferTextureMultisampleMultiviewOVR"); + +#ifndef GL_ES_VERSION_3_2 + glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)GetExtension("glTexStorage3DMultisample"); +#endif + + glExtensions.timer_query = GlCheckExtension("GL_EXT_disjoint_timer_query"); + glExtensions.texture_clamp_to_border = + GlCheckExtension("GL_EXT_texture_border_clamp") || GlCheckExtension("GL_OES_texture_border_clamp"); + glExtensions.buffer_storage = GlCheckExtension("GL_EXT_buffer_storage"); + glExtensions.multi_view = GlCheckExtension("GL_OVR_multiview2"); + glExtensions.multi_sampled_resolve = GlCheckExtension("GL_EXT_multisampled_render_to_texture"); + glExtensions.multi_view_multi_sampled_resolve = GlCheckExtension("GL_OVR_multiview_multisampled_render_to_texture"); + + glExtensions.texture_clamp_to_border_id = + (GlCheckExtension("GL_OES_texture_border_clamp") + ? GL_CLAMP_TO_BORDER + : (GlCheckExtension("GL_EXT_texture_border_clamp") ? GL_CLAMP_TO_BORDER : (GL_CLAMP_TO_EDGE))); +} + +#endif + +/* +================================================================================================================================ + +Driver Instance. + +================================================================================================================================ +*/ + +bool ksDriverInstance_Create(ksDriverInstance *instance) { + memset(instance, 0, sizeof(ksDriverInstance)); + return true; +} + +void ksDriverInstance_Destroy(ksDriverInstance *instance) { memset(instance, 0, sizeof(ksDriverInstance)); } + +/* +================================================================================================================================ + +GPU Device. + +================================================================================================================================ +*/ + +bool ksGpuDevice_Create(ksGpuDevice *device, ksDriverInstance *instance, const ksGpuQueueInfo *queueInfo) { + /* + Use an extensions to select the appropriate device: + https://www.opengl.org/registry/specs/NV/gpu_affinity.txt + https://www.opengl.org/registry/specs/AMD/wgl_gpu_association.txt + https://www.opengl.org/registry/specs/AMD/glx_gpu_association.txt + + On Linux configure each GPU to use a separate X screen and then select + the X screen to render to. + */ + + memset(device, 0, sizeof(ksGpuDevice)); + + device->instance = instance; + device->queueInfo = *queueInfo; + + return true; +} + +void ksGpuDevice_Destroy(ksGpuDevice *device) { memset(device, 0, sizeof(ksGpuDevice)); } + +/* +================================================================================================================================ + +GPU Context. + +================================================================================================================================ +*/ + +ksGpuSurfaceBits ksGpuContext_BitsForSurfaceFormat(const ksGpuSurfaceColorFormat colorFormat, + const ksGpuSurfaceDepthFormat depthFormat) { + ksGpuSurfaceBits bits; + bits.redBits = ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_R8G8B8A8) + ? 8 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_B8G8R8A8) + ? 8 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_R5G6B5) + ? 5 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_B5G6R5) ? 5 : 8)))); + bits.greenBits = ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_R8G8B8A8) + ? 8 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_B8G8R8A8) + ? 8 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_R5G6B5) + ? 6 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_B5G6R5) ? 6 : 8)))); + bits.blueBits = ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_R8G8B8A8) + ? 8 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_B8G8R8A8) + ? 8 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_R5G6B5) + ? 5 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_B5G6R5) ? 5 : 8)))); + bits.alphaBits = ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_R8G8B8A8) + ? 8 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_B8G8R8A8) + ? 8 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_R5G6B5) + ? 0 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_B5G6R5) ? 0 : 8)))); + bits.colorBits = bits.redBits + bits.greenBits + bits.blueBits + bits.alphaBits; + bits.depthBits = + ((depthFormat == KS_GPU_SURFACE_DEPTH_FORMAT_D16) ? 16 : ((depthFormat == KS_GPU_SURFACE_DEPTH_FORMAT_D24) ? 24 : 0)); + return bits; +} + +GLenum ksGpuContext_InternalSurfaceColorFormat(const ksGpuSurfaceColorFormat colorFormat) { + return ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_R8G8B8A8) + ? GL_RGBA8 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_B8G8R8A8) + ? GL_RGBA8 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_R5G6B5) + ? GL_RGB565 + : ((colorFormat == KS_GPU_SURFACE_COLOR_FORMAT_B5G6R5) ? GL_RGB565 : GL_RGBA8)))); +} + +GLenum ksGpuContext_InternalSurfaceDepthFormat(const ksGpuSurfaceDepthFormat depthFormat) { + return ((depthFormat == KS_GPU_SURFACE_DEPTH_FORMAT_D16) + ? GL_DEPTH_COMPONENT16 + : ((depthFormat == KS_GPU_SURFACE_DEPTH_FORMAT_D24) ? GL_DEPTH_COMPONENT24 : GL_DEPTH_COMPONENT24)); +} + +#if defined(OS_WINDOWS) + +static bool ksGpuContext_CreateForSurface(ksGpuContext *context, const ksGpuDevice *device, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, HINSTANCE hInstance, HDC hDC) { + UNUSED_PARM(queueIndex); + + context->device = device; + + const ksGpuSurfaceBits bits = ksGpuContext_BitsForSurfaceFormat(colorFormat, depthFormat); + + PIXELFORMATDESCRIPTOR pfd = { + sizeof(PIXELFORMATDESCRIPTOR), + 1, // version + PFD_DRAW_TO_WINDOW | // must support windowed + PFD_SUPPORT_OPENGL | // must support OpenGL + PFD_DOUBLEBUFFER, // must support double buffering + PFD_TYPE_RGBA, // iPixelType + bits.colorBits, // cColorBits + 0, + 0, // cRedBits, cRedShift + 0, + 0, // cGreenBits, cGreenShift + 0, + 0, // cBlueBits, cBlueShift + 0, + 0, // cAlphaBits, cAlphaShift + 0, // cAccumBits + 0, // cAccumRedBits + 0, // cAccumGreenBits + 0, // cAccumBlueBits + 0, // cAccumAlphaBits + bits.depthBits, // cDepthBits + 0, // cStencilBits + 0, // cAuxBuffers + PFD_MAIN_PLANE, // iLayerType + 0, // bReserved + 0, // dwLayerMask + 0, // dwVisibleMask + 0 // dwDamageMask + }; + + HWND localWnd = NULL; + HDC localDC = hDC; + + if (sampleCount > KS_GPU_SAMPLE_COUNT_1) { + // A valid OpenGL context is needed to get OpenGL extensions including wglChoosePixelFormatARB + // and wglCreateContextAttribsARB. A device context with a valid pixel format is needed to create + // an OpenGL context. However, once a pixel format is set on a device context it is final. + // Therefore a pixel format is set on the device context of a temporary window to create a context + // to get the extensions for multi-sampling. + localWnd = CreateWindow(APPLICATION_NAME, "temp", 0, 0, 0, 0, 0, NULL, NULL, hInstance, NULL); + localDC = GetDC(localWnd); + } + + int pixelFormat = ChoosePixelFormat(localDC, &pfd); + if (pixelFormat == 0) { + Error("Failed to find a suitable pixel format."); + return false; + } + + if (!SetPixelFormat(localDC, pixelFormat, &pfd)) { + Error("Failed to set the pixel format."); + return false; + } + + // Now that the pixel format is set, create a temporary context to get the extensions. + { + HGLRC hGLRC = wglCreateContext(localDC); + wglMakeCurrent(localDC, hGLRC); + + GlBootstrapExtensions(); + + wglMakeCurrent(NULL, NULL); + wglDeleteContext(hGLRC); + } + + if (sampleCount > KS_GPU_SAMPLE_COUNT_1) { + // Release the device context and destroy the window that were created to get extensions. + ReleaseDC(localWnd, localDC); + DestroyWindow(localWnd); + + int pixelFormatAttribs[] = {WGL_DRAW_TO_WINDOW_ARB, + GL_TRUE, + WGL_SUPPORT_OPENGL_ARB, + GL_TRUE, + WGL_DOUBLE_BUFFER_ARB, + GL_TRUE, + WGL_PIXEL_TYPE_ARB, + WGL_TYPE_RGBA_ARB, + WGL_COLOR_BITS_ARB, + bits.colorBits, + WGL_DEPTH_BITS_ARB, + bits.depthBits, + WGL_SAMPLE_BUFFERS_ARB, + 1, + WGL_SAMPLES_ARB, + sampleCount, + 0}; + + unsigned int numPixelFormats = 0; + + if (!wglChoosePixelFormatARB(hDC, pixelFormatAttribs, NULL, 1, &pixelFormat, &numPixelFormats) || numPixelFormats == 0) { + Error("Failed to find MSAA pixel format."); + return false; + } + + memset(&pfd, 0, sizeof(pfd)); + + if (!DescribePixelFormat(hDC, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd)) { + Error("Failed to describe the pixel format."); + return false; + } + + if (!SetPixelFormat(hDC, pixelFormat, &pfd)) { + Error("Failed to set the pixel format."); + return false; + } + } + + int contextAttribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, + OPENGL_VERSION_MAJOR, + WGL_CONTEXT_MINOR_VERSION_ARB, + OPENGL_VERSION_MINOR, + WGL_CONTEXT_PROFILE_MASK_ARB, + WGL_CONTEXT_CORE_PROFILE_BIT_ARB, + WGL_CONTEXT_FLAGS_ARB, + WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB | WGL_CONTEXT_DEBUG_BIT_ARB, + 0}; + + context->hDC = hDC; + context->hGLRC = wglCreateContextAttribsARB(hDC, NULL, contextAttribs); + if (!context->hGLRC) { + Error("Failed to create GL context."); + return false; + } + + wglMakeCurrent(hDC, context->hGLRC); + + GlInitExtensions(); + + return true; +} + +#elif defined(OS_LINUX_XLIB) || defined(OS_LINUX_XCB_GLX) + +static int glxGetFBConfigAttrib2(Display *dpy, GLXFBConfig config, int attribute) { + int value; + glXGetFBConfigAttrib(dpy, config, attribute, &value); + return value; +} + +static bool ksGpuContext_CreateForSurface(ksGpuContext *context, const ksGpuDevice *device, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, Display *xDisplay, int xScreen) { + UNUSED_PARM(queueIndex); + + context->device = device; + + int glxErrorBase; + int glxEventBase; + if (!glXQueryExtension(xDisplay, &glxErrorBase, &glxEventBase)) { + Error("X display does not support the GLX extension."); + return false; + } + + int glxVersionMajor; + int glxVersionMinor; + if (!glXQueryVersion(xDisplay, &glxVersionMajor, &glxVersionMinor)) { + Error("Unable to retrieve GLX version."); + return false; + } + + int fbConfigCount = 0; + GLXFBConfig *fbConfigs = glXGetFBConfigs(xDisplay, xScreen, &fbConfigCount); + if (fbConfigCount == 0) { + Error("No valid framebuffer configurations found."); + return false; + } + + const ksGpuSurfaceBits bits = ksGpuContext_BitsForSurfaceFormat(colorFormat, depthFormat); + + bool foundFbConfig = false; + for (int i = 0; i < fbConfigCount; i++) { + if (glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_FBCONFIG_ID) == 0) { + continue; + } + if (glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_VISUAL_ID) == 0) { + continue; + } + if (glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_DOUBLEBUFFER) == 0) { + continue; + } + if ((glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_RENDER_TYPE) & GLX_RGBA_BIT) == 0) { + continue; + } + if ((glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_DRAWABLE_TYPE) & GLX_WINDOW_BIT) == 0) { + continue; + } + if (glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_RED_SIZE) != bits.redBits) { + continue; + } + if (glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_GREEN_SIZE) != bits.greenBits) { + continue; + } + if (glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_BLUE_SIZE) != bits.blueBits) { + continue; + } + if (glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_ALPHA_SIZE) != bits.alphaBits) { + continue; + } + if (glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_DEPTH_SIZE) != bits.depthBits) { + continue; + } + if (sampleCount > KS_GPU_SAMPLE_COUNT_1) { + if (glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_SAMPLE_BUFFERS) != 1) { + continue; + } + if (glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_SAMPLES) != (int)sampleCount) { + continue; + } + } + + context->visualid = glxGetFBConfigAttrib2(xDisplay, fbConfigs[i], GLX_VISUAL_ID); + context->glxFBConfig = fbConfigs[i]; + foundFbConfig = true; + break; + } + + XFree(fbConfigs); + + if (!foundFbConfig) { + Error("Failed to to find desired framebuffer configuration."); + return false; + } + + context->xDisplay = xDisplay; + + int attribs[] = {GLX_CONTEXT_MAJOR_VERSION_ARB, + OPENGL_VERSION_MAJOR, + GLX_CONTEXT_MINOR_VERSION_ARB, + OPENGL_VERSION_MINOR, + GLX_CONTEXT_PROFILE_MASK_ARB, + GLX_CONTEXT_CORE_PROFILE_BIT_ARB, + GLX_CONTEXT_FLAGS_ARB, + GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, + 0}; + + glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)GetExtension("glXCreateContextAttribsARB"); + + context->glxContext = glXCreateContextAttribsARB(xDisplay, // Display * dpy + context->glxFBConfig, // GLXFBConfig config + NULL, // GLXContext share_context + True, // Bool direct + attribs); // const int * attrib_list + + if (context->glxContext == NULL) { + Error("Unable to create GLX context."); + return false; + } + + if (!glXIsDirect(xDisplay, context->glxContext)) { + Error("Unable to create direct rendering context."); + return false; + } + + return true; +} + +#elif defined(OS_LINUX_XCB) + +static uint32_t xcb_glx_get_property(const uint32_t *properties, const uint32_t numProperties, uint32_t propertyName) { + for (uint32_t i = 0; i < numProperties; i++) { + if (properties[i * 2 + 0] == propertyName) { + return properties[i * 2 + 1]; + } + } + return 0; +} + +static bool ksGpuContext_CreateForSurface(ksGpuContext *context, const ksGpuDevice *device, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, xcb_connection_t *connection, int screen_number) { + UNUSED_PARM(queueIndex); + + context->device = device; + + GlInitExtensions(); + + xcb_glx_query_version_cookie_t glx_query_version_cookie = + xcb_glx_query_version(connection, OPENGL_VERSION_MAJOR, OPENGL_VERSION_MINOR); + xcb_glx_query_version_reply_t *glx_query_version_reply = + xcb_glx_query_version_reply(connection, glx_query_version_cookie, NULL); + if (glx_query_version_reply == NULL) { + Error("Unable to retrieve GLX version."); + return false; + } + free(glx_query_version_reply); + + xcb_glx_get_fb_configs_cookie_t get_fb_configs_cookie = xcb_glx_get_fb_configs(connection, screen_number); + xcb_glx_get_fb_configs_reply_t *get_fb_configs_reply = xcb_glx_get_fb_configs_reply(connection, get_fb_configs_cookie, NULL); + + if (get_fb_configs_reply == NULL || get_fb_configs_reply->num_FB_configs == 0) { + Error("No valid framebuffer configurations found."); + return false; + } + + const ksGpuSurfaceBits bits = ksGpuContext_BitsForSurfaceFormat(colorFormat, depthFormat); + + const uint32_t *fb_configs_properties = xcb_glx_get_fb_configs_property_list(get_fb_configs_reply); + const uint32_t fb_configs_num_properties = get_fb_configs_reply->num_properties; + + bool foundFbConfig = false; + for (uint32_t i = 0; i < get_fb_configs_reply->num_FB_configs; i++) { + const uint32_t *fb_config = fb_configs_properties + i * fb_configs_num_properties * 2; + + if (xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_FBCONFIG_ID) == 0) { + continue; + } + if (xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_VISUAL_ID) == 0) { + continue; + } + if (xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_DOUBLEBUFFER) == 0) { + continue; + } + if ((xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_RENDER_TYPE) & GLX_RGBA_BIT) == 0) { + continue; + } + if ((xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_DRAWABLE_TYPE) & GLX_WINDOW_BIT) == 0) { + continue; + } + if (xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_RED_SIZE) != bits.redBits) { + continue; + } + if (xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_GREEN_SIZE) != bits.greenBits) { + continue; + } + if (xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_BLUE_SIZE) != bits.blueBits) { + continue; + } + if (xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_ALPHA_SIZE) != bits.alphaBits) { + continue; + } + if (xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_DEPTH_SIZE) != bits.depthBits) { + continue; + } + if (sampleCount > KS_GPU_SAMPLE_COUNT_1) { + if (xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_SAMPLE_BUFFERS) != 1) { + continue; + } + if (xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_SAMPLES) != sampleCount) { + continue; + } + } + + context->fbconfigid = xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_FBCONFIG_ID); + context->visualid = xcb_glx_get_property(fb_config, fb_configs_num_properties, GLX_VISUAL_ID); + foundFbConfig = true; + break; + } + + free(get_fb_configs_reply); + + if (!foundFbConfig) { + Error("Failed to to find desired framebuffer configuration."); + return false; + } + + context->connection = connection; + context->screen_number = screen_number; + + // Create the context. + uint32_t attribs[] = {GLX_CONTEXT_MAJOR_VERSION_ARB, + OPENGL_VERSION_MAJOR, + GLX_CONTEXT_MINOR_VERSION_ARB, + OPENGL_VERSION_MINOR, + GLX_CONTEXT_PROFILE_MASK_ARB, + GLX_CONTEXT_CORE_PROFILE_BIT_ARB, + GLX_CONTEXT_FLAGS_ARB, + GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, + 0}; + + context->glxContext = xcb_generate_id(connection); + xcb_glx_create_context_attribs_arb(connection, // xcb_connection_t * connection + context->glxContext, // xcb_glx_context_t context + context->fbconfigid, // xcb_glx_fbconfig_t fbconfig + screen_number, // uint32_t screen + 0, // xcb_glx_context_t share_list + 1, // uint8_t is_direct + 4, // uint32_t num_attribs + attribs); // const uint32_t * attribs + + // Make sure the context is direct. + xcb_generic_error_t *error; + xcb_glx_is_direct_cookie_t glx_is_direct_cookie = xcb_glx_is_direct_unchecked(connection, context->glxContext); + xcb_glx_is_direct_reply_t *glx_is_direct_reply = xcb_glx_is_direct_reply(connection, glx_is_direct_cookie, &error); + const bool is_direct = (glx_is_direct_reply != NULL && glx_is_direct_reply->is_direct); + free(glx_is_direct_reply); + + if (!is_direct) { + Error("Unable to create direct rendering context."); + return false; + } + + return true; +} + +#elif defined(OS_LINUX_WAYLAND) + +static bool ksGpuContext_CreateForSurface(ksGpuContext *context, const ksGpuDevice *device, struct wl_display *native_display) { + context->device = device; + + EGLint numConfigs; + EGLint majorVersion; + EGLint minorVersion; + + EGLint fbAttribs[] = {EGL_SURFACE_TYPE, + EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, + EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT, + EGL_RED_SIZE, + 8, + EGL_GREEN_SIZE, + 8, + EGL_BLUE_SIZE, + 8, + EGL_NONE}; + + EGLint contextAttribs[] = {EGL_CONTEXT_OPENGL_PROFILE_MASK, + EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT, + EGL_CONTEXT_CLIENT_VERSION, + OPENGL_VERSION_MAJOR, + EGL_CONTEXT_MINOR_VERSION, + OPENGL_VERSION_MINOR, + EGL_NONE}; + + context->display = eglGetDisplay(native_display); + if (context->display == EGL_NO_DISPLAY) { + Error("Could not create EGL Display."); + return false; + } + + if (!eglInitialize(context->display, &majorVersion, &minorVersion)) { + Error("eglInitialize failed."); + return false; + } + + printf("Initialized EGL context version %d.%d\n", majorVersion, minorVersion); + + EGLBoolean ret = eglGetConfigs(context->display, NULL, 0, &numConfigs); + if (ret != EGL_TRUE || numConfigs == 0) { + Error("eglGetConfigs failed."); + return false; + } + + ret = eglChooseConfig(context->display, fbAttribs, &context->config, 1, &numConfigs); + if (ret != EGL_TRUE || numConfigs != 1) { + Error("eglChooseConfig failed."); + return false; + } + + context->mainSurface = eglCreateWindowSurface(context->display, context->config, context->native_window, NULL); + if (context->mainSurface == EGL_NO_SURFACE) { + Error("eglCreateWindowSurface failed"); + return false; + } + + eglBindAPI(EGL_OPENGL_API); + + context->context = eglCreateContext(context->display, context->config, EGL_NO_CONTEXT, contextAttribs); + if (context->context == EGL_NO_CONTEXT) { + Error("Could not create OpenGL context."); + return false; + } + + if (!eglMakeCurrent(context->display, context->mainSurface, context->mainSurface, context->context)) { + Error("Could not make the current context current."); + return false; + } + + GlInitExtensions(); + + return true; +} + +#elif defined(OS_APPLE_MACOS) + +static bool ksGpuContext_CreateForSurface(ksGpuContext *context, const ksGpuDevice *device, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, CGDirectDisplayID display) { + UNUSED_PARM(queueIndex); + + context->device = device; + + const ksGpuSurfaceBits bits = ksGpuContext_BitsForSurfaceFormat(colorFormat, depthFormat); + + NSOpenGLPixelFormatAttribute pixelFormatAttributes[] = {NSOpenGLPFAMinimumPolicy, + 1, + NSOpenGLPFAScreenMask, + CGDisplayIDToOpenGLDisplayMask(display), + NSOpenGLPFAAccelerated, + NSOpenGLPFAOpenGLProfile, + NSOpenGLProfileVersion3_2Core, + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAColorSize, + bits.colorBits, + NSOpenGLPFADepthSize, + bits.depthBits, + NSOpenGLPFASampleBuffers, + (sampleCount > KS_GPU_SAMPLE_COUNT_1), + NSOpenGLPFASamples, + sampleCount, + 0}; + + NSOpenGLPixelFormat *pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes] autorelease]; + if (pixelFormat == nil) { + return false; + } + context->nsContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil]; + if (context->nsContext == nil) { + return false; + } + + context->cglContext = [context->nsContext CGLContextObj]; + + GlInitExtensions(); + + return true; +} + +#elif defined(OS_ANDROID) + +static bool ksGpuContext_CreateForSurface(ksGpuContext *context, const ksGpuDevice *device, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, EGLDisplay display) { + context->device = device; + + context->display = display; + + // Do NOT use eglChooseConfig, because the Android EGL code pushes in multisample + // flags in eglChooseConfig when the user has selected the "force 4x MSAA" option in + // settings, and that is completely wasted on the time warped frontbuffer. + const int MAX_CONFIGS = 1024; + EGLConfig configs[MAX_CONFIGS]; + EGLint numConfigs = 0; + EGL(eglGetConfigs(display, configs, MAX_CONFIGS, &numConfigs)); + + const ksGpuSurfaceBits bits = ksGpuContext_BitsForSurfaceFormat(colorFormat, depthFormat); + + const EGLint configAttribs[] = {EGL_RED_SIZE, bits.greenBits, EGL_GREEN_SIZE, bits.redBits, EGL_BLUE_SIZE, bits.blueBits, + EGL_ALPHA_SIZE, bits.alphaBits, EGL_DEPTH_SIZE, bits.depthBits, + // EGL_STENCIL_SIZE, 0, + EGL_SAMPLE_BUFFERS, (sampleCount > KS_GPU_SAMPLE_COUNT_1), EGL_SAMPLES, + (sampleCount > KS_GPU_SAMPLE_COUNT_1) ? sampleCount : 0, EGL_NONE}; + + context->config = 0; + for (int i = 0; i < numConfigs; i++) { + EGLint value = 0; + + eglGetConfigAttrib(display, configs[i], EGL_RENDERABLE_TYPE, &value); + if ((value & EGL_OPENGL_ES3_BIT) != EGL_OPENGL_ES3_BIT) { + continue; + } + + // Without EGL_KHR_surfaceless_context, the config needs to support both pbuffers and window surfaces. + eglGetConfigAttrib(display, configs[i], EGL_SURFACE_TYPE, &value); + if ((value & (EGL_WINDOW_BIT | EGL_PBUFFER_BIT)) != (EGL_WINDOW_BIT | EGL_PBUFFER_BIT)) { + continue; + } + + int j = 0; + for (; configAttribs[j] != EGL_NONE; j += 2) { + eglGetConfigAttrib(display, configs[i], configAttribs[j], &value); + if (value != configAttribs[j + 1]) { + break; + } + } + if (configAttribs[j] == EGL_NONE) { + context->config = configs[i]; + break; + } + } + if (context->config == 0) { + Error("Failed to find EGLConfig"); + return false; + } + + EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, OPENGL_VERSION_MAJOR, EGL_NONE, EGL_NONE, EGL_NONE}; + // Use the default priority if KS_GPU_QUEUE_PRIORITY_MEDIUM is selected. + const ksGpuQueuePriority priority = device->queueInfo.queuePriorities[queueIndex]; + if (priority != KS_GPU_QUEUE_PRIORITY_MEDIUM) { + contextAttribs[2] = EGL_CONTEXT_PRIORITY_LEVEL_IMG; + contextAttribs[3] = (priority == KS_GPU_QUEUE_PRIORITY_LOW) ? EGL_CONTEXT_PRIORITY_LOW_IMG : EGL_CONTEXT_PRIORITY_HIGH_IMG; + } + context->context = eglCreateContext(display, context->config, EGL_NO_CONTEXT, contextAttribs); + if (context->context == EGL_NO_CONTEXT) { + Error("eglCreateContext() failed: %s", EglErrorString(eglGetError())); + return false; + } + + const EGLint surfaceAttribs[] = {EGL_WIDTH, 16, EGL_HEIGHT, 16, EGL_NONE}; + context->tinySurface = eglCreatePbufferSurface(display, context->config, surfaceAttribs); + if (context->tinySurface == EGL_NO_SURFACE) { + Error("eglCreatePbufferSurface() failed: %s", EglErrorString(eglGetError())); + eglDestroyContext(display, context->context); + context->context = EGL_NO_CONTEXT; + return false; + } + context->mainSurface = context->tinySurface; + + return true; +} + +#endif + +bool ksGpuContext_CreateShared(ksGpuContext *context, const ksGpuContext *other, int queueIndex) { + UNUSED_PARM(queueIndex); + + memset(context, 0, sizeof(ksGpuContext)); + + context->device = other->device; + +#if defined(OS_WINDOWS) + context->hDC = other->hDC; + context->hGLRC = wglCreateContext(other->hDC); + if (!wglShareLists(other->hGLRC, context->hGLRC)) { + return false; + } +#elif defined(OS_LINUX_XLIB) || defined(OS_LINUX_XCB_GLX) + context->xDisplay = other->xDisplay; + context->visualid = other->visualid; + context->glxFBConfig = other->glxFBConfig; + context->glxDrawable = other->glxDrawable; + context->glxContext = glXCreateNewContext(other->xDisplay, other->glxFBConfig, GLX_RGBA_TYPE, other->glxContext, True); + if (context->glxContext == NULL) { + return false; + } +#elif defined(OS_LINUX_XCB) + context->connection = other->connection; + context->screen_number = other->screen_number; + context->fbconfigid = other->fbconfigid; + context->visualid = other->visualid; + context->glxDrawable = other->glxDrawable; + context->glxContext = xcb_generate_id(other->connection); + xcb_glx_create_context(other->connection, context->glxContext, other->visualid, other->screen_number, other->glxContext, 1); + context->glxContextTag = 0; +#elif defined(OS_APPLE_MACOS) + context->nsContext = NULL; + CGLPixelFormatObj pf = CGLGetPixelFormat(other->cglContext); + if (CGLCreateContext(pf, other->cglContext, &context->cglContext) != kCGLNoError) { + return false; + } + CGSConnectionID cid; + CGSWindowID wid; + CGSSurfaceID sid; + if (CGLGetSurface(other->cglContext, &cid, &wid, &sid) != kCGLNoError) { + return false; + } + if (CGLSetSurface(context->cglContext, cid, wid, sid) != kCGLNoError) { + return false; + } +#elif defined(OS_ANDROID) || defined(OS_LINUX_WAYLAND) + context->display = other->display; + EGLint configID; + if (!eglQueryContext(context->display, other->context, EGL_CONFIG_ID, &configID)) { + Error("eglQueryContext EGL_CONFIG_ID failed: %s", EglErrorString(eglGetError())); + return false; + } + const int MAX_CONFIGS = 1024; + EGLConfig configs[MAX_CONFIGS]; + EGLint numConfigs = 0; + EGL(eglGetConfigs(context->display, configs, MAX_CONFIGS, &numConfigs)); + context->config = 0; + for (int i = 0; i < numConfigs; i++) { + EGLint value = 0; + eglGetConfigAttrib(context->display, configs[i], EGL_CONFIG_ID, &value); + if (value == configID) { + context->config = configs[i]; + break; + } + } + if (context->config == 0) { + Error("Failed to find share context config."); + return false; + } + EGLint surfaceType = 0; + eglGetConfigAttrib(context->display, context->config, EGL_SURFACE_TYPE, &surfaceType); + +#if defined(OS_ANDROID) + if ((surfaceType & EGL_PBUFFER_BIT) == 0) { + Error("Share context config does have EGL_PBUFFER_BIT."); + return false; + } +#endif + EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, OPENGL_VERSION_MAJOR, EGL_NONE}; + context->context = eglCreateContext(context->display, context->config, other->context, contextAttribs); + if (context->context == EGL_NO_CONTEXT) { + Error("eglCreateContext() failed: %s", EglErrorString(eglGetError())); + return false; + } +#if defined(OS_ANDROID) + const EGLint surfaceAttribs[] = {EGL_WIDTH, 16, EGL_HEIGHT, 16, EGL_NONE}; + context->tinySurface = eglCreatePbufferSurface(context->display, context->config, surfaceAttribs); + if (context->tinySurface == EGL_NO_SURFACE) { + Error("eglCreatePbufferSurface() failed: %s", EglErrorString(eglGetError())); + eglDestroyContext(context->display, context->context); + context->context = EGL_NO_CONTEXT; + return false; + } + context->mainSurface = context->tinySurface; +#endif +#endif + return true; +} + +void ksGpuContext_Destroy(ksGpuContext *context) { +#if defined(OS_WINDOWS) + if (context->hGLRC) { + if (!wglMakeCurrent(NULL, NULL)) { + DWORD error = GetLastError(); + Error("Failed to release context error code (%d).", error); + } + + if (!wglDeleteContext(context->hGLRC)) { + DWORD error = GetLastError(); + Error("Failed to delete context error code (%d).", error); + } + context->hGLRC = NULL; + } + context->hDC = NULL; +#elif defined(OS_LINUX_XLIB) || defined(OS_LINUX_XCB_GLX) + glXDestroyContext(context->xDisplay, context->glxContext); + context->xDisplay = NULL; + context->visualid = 0; + context->glxFBConfig = NULL; + context->glxDrawable = 0; + context->glxContext = NULL; +#elif defined(OS_LINUX_XCB) + xcb_glx_destroy_context(context->connection, context->glxContext); + context->connection = NULL; + context->screen_number = 0; + context->fbconfigid = 0; + context->visualid = 0; + context->glxDrawable = 0; + context->glxContext = 0; + context->glxContextTag = 0; +#elif defined(OS_APPLE_MACOS) + CGLSetCurrentContext(NULL); + if (context->nsContext != NULL) { + [context->nsContext clearDrawable]; + [context->nsContext release]; + context->nsContext = nil; + } else { + CGLDestroyContext(context->cglContext); + } + context->cglContext = nil; +#elif defined(OS_ANDROID) || defined(OS_LINUX_WAYLAND) + if (context->display != 0) { + EGL(eglMakeCurrent(context->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); + } + if (context->context != EGL_NO_CONTEXT) { + EGL(eglDestroyContext(context->display, context->context)); + } + +#if defined(OS_ANDROID) + if (context->mainSurface != context->tinySurface) { + EGL(eglDestroySurface(context->display, context->mainSurface)); + } + if (context->tinySurface != EGL_NO_SURFACE) { + EGL(eglDestroySurface(context->display, context->tinySurface)); + } + context->tinySurface = EGL_NO_SURFACE; +#elif defined(OS_LINUX_WAYLAND) + if (context->mainSurface != EGL_NO_SURFACE) { + EGL(eglDestroySurface(context->display, context->mainSurface)); + } +#endif + context->display = 0; + context->config = 0; + context->mainSurface = EGL_NO_SURFACE; + context->context = EGL_NO_CONTEXT; +#endif +} + +void ksGpuContext_WaitIdle(ksGpuContext *context) { + UNUSED_PARM(context); + + GL(glFinish()); +} + +void ksGpuContext_SetCurrent(ksGpuContext *context) { +#if defined(OS_WINDOWS) + wglMakeCurrent(context->hDC, context->hGLRC); +#elif defined(OS_LINUX_XLIB) || defined(OS_LINUX_XCB_GLX) + glXMakeCurrent(context->xDisplay, context->glxDrawable, context->glxContext); + static int firstTime = 1; + if (firstTime) { + GlInitExtensions(); + firstTime = 0; + } + +#elif defined(OS_LINUX_XCB) + xcb_glx_make_current_cookie_t glx_make_current_cookie = + xcb_glx_make_current(context->connection, context->glxDrawable, context->glxContext, 0); + xcb_glx_make_current_reply_t *glx_make_current_reply = + xcb_glx_make_current_reply(context->connection, glx_make_current_cookie, NULL); + context->glxContextTag = glx_make_current_reply->context_tag; + free(glx_make_current_reply); +#elif defined(OS_APPLE_MACOS) + CGLSetCurrentContext(context->cglContext); +#elif defined(OS_ANDROID) || defined(OS_LINUX_WAYLAND) + EGL(eglMakeCurrent(context->display, context->mainSurface, context->mainSurface, context->context)); +#endif +} + +void ksGpuContext_UnsetCurrent(ksGpuContext *context) { +#if defined(OS_WINDOWS) + wglMakeCurrent(context->hDC, NULL); +#elif defined(OS_LINUX_XLIB) || defined(OS_LINUX_XCB_GLX) + glXMakeCurrent(context->xDisplay, None, NULL); +#elif defined(OS_LINUX_XCB) + xcb_glx_make_current(context->connection, 0, 0, 0); +#elif defined(OS_APPLE_MACOS) + CGLSetCurrentContext(NULL); +#elif defined(OS_ANDROID) || defined(OS_LINUX_WAYLAND) + EGL(eglMakeCurrent(context->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)); +#endif +} + +bool ksGpuContext_CheckCurrent(ksGpuContext *context) { +#if defined(OS_WINDOWS) + return (wglGetCurrentContext() == context->hGLRC); +#elif defined(OS_LINUX_XLIB) || defined(OS_LINUX_XCB_GLX) + return (glXGetCurrentContext() == context->glxContext); +#elif defined(OS_LINUX_XCB) + return true; +#elif defined(OS_APPLE_MACOS) + return (CGLGetCurrentContext() == context->cglContext); +#elif defined(OS_APPLE_IOS) + return (false); // TODO: pick current context off the UIView +#elif defined(OS_ANDROID) || defined(OS_LINUX_WAYLAND) + return (eglGetCurrentContext() == context->context); +#endif +} + +static void ksGpuContext_GetLimits(ksGpuContext *context, ksGpuLimits *limits) { + UNUSED_PARM(context); + + limits->maxPushConstantsSize = 512; + limits->maxSamples = glGetInteger(GL_MAX_SAMPLES); +} + +/* +================================================================================================================================ + +GPU Window. + +================================================================================================================================ +*/ + +#if defined(OS_WINDOWS) + +typedef enum { + KEY_A = 0x41, + KEY_B = 0x42, + KEY_C = 0x43, + KEY_D = 0x44, + KEY_E = 0x45, + KEY_F = 0x46, + KEY_G = 0x47, + KEY_H = 0x48, + KEY_I = 0x49, + KEY_J = 0x4A, + KEY_K = 0x4B, + KEY_L = 0x4C, + KEY_M = 0x4D, + KEY_N = 0x4E, + KEY_O = 0x4F, + KEY_P = 0x50, + KEY_Q = 0x51, + KEY_R = 0x52, + KEY_S = 0x53, + KEY_T = 0x54, + KEY_U = 0x55, + KEY_V = 0x56, + KEY_W = 0x57, + KEY_X = 0x58, + KEY_Y = 0x59, + KEY_Z = 0x5A, + KEY_RETURN = VK_RETURN, + KEY_TAB = VK_TAB, + KEY_ESCAPE = VK_ESCAPE, + KEY_SHIFT_LEFT = VK_LSHIFT, + KEY_CTRL_LEFT = VK_LCONTROL, + KEY_ALT_LEFT = VK_LMENU, + KEY_CURSOR_UP = VK_UP, + KEY_CURSOR_DOWN = VK_DOWN, + KEY_CURSOR_LEFT = VK_LEFT, + KEY_CURSOR_RIGHT = VK_RIGHT +} ksKeyboardKey; + +typedef enum { MOUSE_LEFT = 0, MOUSE_RIGHT = 1 } ksMouseButton; + +LRESULT APIENTRY WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + ksGpuWindow *window = (ksGpuWindow *)GetWindowLongPtrA(hWnd, GWLP_USERDATA); + + switch (message) { + case WM_SIZE: { + if (window != NULL) { + window->windowWidth = (int)LOWORD(lParam); + window->windowHeight = (int)HIWORD(lParam); + } + return 0; + } + case WM_ACTIVATE: { + if (window != NULL) { + window->windowActiveState = !HIWORD(wParam); + } + return 0; + } + case WM_ERASEBKGND: { + return 0; + } + case WM_CLOSE: { + PostQuitMessage(0); + return 0; + } + case WM_KEYDOWN: { + if (window != NULL) { + if ((int)wParam >= 0 && (int)wParam < 256) { + if ((int)wParam != KEY_SHIFT_LEFT && (int)wParam != KEY_CTRL_LEFT && (int)wParam != KEY_ALT_LEFT && + (int)wParam != KEY_CURSOR_UP && (int)wParam != KEY_CURSOR_DOWN && (int)wParam != KEY_CURSOR_LEFT && + (int)wParam != KEY_CURSOR_RIGHT) { + window->input.keyInput[(int)wParam] = true; + } + } + } + break; + } + case WM_LBUTTONDOWN: { + window->input.mouseInput[MOUSE_LEFT] = true; + window->input.mouseInputX[MOUSE_LEFT] = LOWORD(lParam); + window->input.mouseInputY[MOUSE_LEFT] = window->windowHeight - HIWORD(lParam); + break; + } + case WM_RBUTTONDOWN: { + window->input.mouseInput[MOUSE_RIGHT] = true; + window->input.mouseInputX[MOUSE_RIGHT] = LOWORD(lParam); + window->input.mouseInputY[MOUSE_RIGHT] = window->windowHeight - HIWORD(lParam); + break; + } + } + return DefWindowProcA(hWnd, message, wParam, lParam); +} + +void ksGpuWindow_Destroy(ksGpuWindow *window) { + ksGpuContext_Destroy(&window->context); + ksGpuDevice_Destroy(&window->device); + + if (window->windowFullscreen) { + ChangeDisplaySettingsA(NULL, 0); + ShowCursor(TRUE); + } + + if (window->hDC) { + if (!ReleaseDC(window->hWnd, window->hDC)) { + Error("Failed to release device context."); + } + window->hDC = NULL; + } + + if (window->hWnd) { + if (!DestroyWindow(window->hWnd)) { + Error("Failed to destroy the window."); + } + window->hWnd = NULL; + } + + if (window->hInstance) { + if (!UnregisterClassA(APPLICATION_NAME, window->hInstance)) { + Error("Failed to unregister window class."); + } + window->hInstance = NULL; + } +} + +bool ksGpuWindow_Create(ksGpuWindow *window, ksDriverInstance *instance, const ksGpuQueueInfo *queueInfo, int queueIndex, + ksGpuSurfaceColorFormat colorFormat, ksGpuSurfaceDepthFormat depthFormat, ksGpuSampleCount sampleCount, + int width, int height, bool fullscreen) { + memset(window, 0, sizeof(ksGpuWindow)); + + window->colorFormat = colorFormat; + window->depthFormat = depthFormat; + window->sampleCount = sampleCount; + window->windowWidth = width; + window->windowHeight = height; + window->windowSwapInterval = 1; + window->windowRefreshRate = 60.0f; + window->windowFullscreen = fullscreen; + window->windowActive = false; + window->windowExit = false; + window->windowActiveState = false; + window->lastSwapTime = GetTimeNanoseconds(); + + const LPCSTR displayDevice = NULL; + + if (window->windowFullscreen) { + DEVMODEA dmScreenSettings; + memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); + dmScreenSettings.dmSize = sizeof(dmScreenSettings); + dmScreenSettings.dmPelsWidth = width; + dmScreenSettings.dmPelsHeight = height; + dmScreenSettings.dmBitsPerPel = 32; + dmScreenSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; + + if (ChangeDisplaySettingsExA(displayDevice, &dmScreenSettings, NULL, CDS_FULLSCREEN, NULL) != DISP_CHANGE_SUCCESSFUL) { + Error("The requested fullscreen mode is not supported."); + return false; + } + } + + DEVMODEA lpDevMode; + memset(&lpDevMode, 0, sizeof(DEVMODEA)); + lpDevMode.dmSize = sizeof(DEVMODEA); + lpDevMode.dmDriverExtra = 0; + + if (EnumDisplaySettingsA(displayDevice, ENUM_CURRENT_SETTINGS, &lpDevMode) != FALSE) { + window->windowRefreshRate = (float)lpDevMode.dmDisplayFrequency; + } + + window->hInstance = GetModuleHandleA(NULL); + + WNDCLASSA wc; + wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; + wc.lpfnWndProc = (WNDPROC)WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = window->hInstance; + wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = NULL; + wc.lpszMenuName = NULL; + wc.lpszClassName = APPLICATION_NAME; + + if (!RegisterClassA(&wc)) { + Error("Failed to register window class."); + return false; + } + + DWORD dwExStyle = 0; + DWORD dwStyle = 0; + if (window->windowFullscreen) { + dwExStyle = WS_EX_APPWINDOW; + dwStyle = WS_POPUP; + ShowCursor(FALSE); + } else { + // Fixed size window. + dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; + dwStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; + } + + RECT windowRect; + windowRect.left = (long)0; + windowRect.right = (long)width; + windowRect.top = (long)0; + windowRect.bottom = (long)height; + + AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle); + + if (!window->windowFullscreen) { + RECT desktopRect; + GetWindowRect(GetDesktopWindow(), &desktopRect); + + const int offsetX = (desktopRect.right - (windowRect.right - windowRect.left)) / 2; + const int offsetY = (desktopRect.bottom - (windowRect.bottom - windowRect.top)) / 2; + + windowRect.left += offsetX; + windowRect.right += offsetX; + windowRect.top += offsetY; + windowRect.bottom += offsetY; + } + + window->hWnd = CreateWindowExA(dwExStyle, // Extended style for the window + APPLICATION_NAME, // Class name + WINDOW_TITLE, // Window title + dwStyle | // Defined window style + WS_CLIPSIBLINGS | // Required window style + WS_CLIPCHILDREN, // Required window style + windowRect.left, // Window X position + windowRect.top, // Window Y position + windowRect.right - windowRect.left, // Window width + windowRect.bottom - windowRect.top, // Window height + NULL, // No parent window + NULL, // No menu + window->hInstance, // Instance + NULL); // No WM_CREATE parameter + if (!window->hWnd) { + ksGpuWindow_Destroy(window); + Error("Failed to create window."); + return false; + } + + SetWindowLongPtrA(window->hWnd, GWLP_USERDATA, (LONG_PTR)window); + + window->hDC = GetDC(window->hWnd); + if (!window->hDC) { + ksGpuWindow_Destroy(window); + Error("Failed to acquire device context."); + return false; + } + + ksGpuDevice_Create(&window->device, instance, queueInfo); + ksGpuContext_CreateForSurface(&window->context, &window->device, queueIndex, colorFormat, depthFormat, sampleCount, + window->hInstance, window->hDC); + ksGpuContext_SetCurrent(&window->context); + + ShowWindow(window->hWnd, SW_SHOW); + SetForegroundWindow(window->hWnd); + SetFocus(window->hWnd); + + return true; +} + +static bool ksGpuWindow_SupportedResolution(const int width, const int height) { + DEVMODE dm = {0}; + dm.dmSize = sizeof(dm); + for (int modeIndex = 0; EnumDisplaySettings(NULL, modeIndex, &dm) != 0; modeIndex++) { + if (dm.dmPelsWidth == (DWORD)width && dm.dmPelsHeight == (DWORD)height) { + return true; + } + } + return false; +} + +void ksGpuWindow_Exit(ksGpuWindow *window) { window->windowExit = true; } + +ksGpuWindowEvent ksGpuWindow_ProcessEvents(ksGpuWindow *window) { + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) > 0) { + if (msg.message == WM_QUIT) { + window->windowExit = true; + } else { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + window->input.keyInput[KEY_SHIFT_LEFT] = GetAsyncKeyState(KEY_SHIFT_LEFT) != 0; + window->input.keyInput[KEY_CTRL_LEFT] = GetAsyncKeyState(KEY_CTRL_LEFT) != 0; + window->input.keyInput[KEY_ALT_LEFT] = GetAsyncKeyState(KEY_ALT_LEFT) != 0; + window->input.keyInput[KEY_CURSOR_UP] = GetAsyncKeyState(KEY_CURSOR_UP) != 0; + window->input.keyInput[KEY_CURSOR_DOWN] = GetAsyncKeyState(KEY_CURSOR_DOWN) != 0; + window->input.keyInput[KEY_CURSOR_LEFT] = GetAsyncKeyState(KEY_CURSOR_LEFT) != 0; + window->input.keyInput[KEY_CURSOR_RIGHT] = GetAsyncKeyState(KEY_CURSOR_RIGHT) != 0; + + if (window->windowExit) { + return KS_GPU_WINDOW_EVENT_EXIT; + } + if (window->windowActiveState != window->windowActive) { + window->windowActive = window->windowActiveState; + return (window->windowActiveState) ? KS_GPU_WINDOW_EVENT_ACTIVATED : KS_GPU_WINDOW_EVENT_DEACTIVATED; + } + return KS_GPU_WINDOW_EVENT_NONE; +} + +#elif defined(OS_LINUX_XLIB) + +typedef enum // keysym.h +{ KEY_A = XK_a, + KEY_B = XK_b, + KEY_C = XK_c, + KEY_D = XK_d, + KEY_E = XK_e, + KEY_F = XK_f, + KEY_G = XK_g, + KEY_H = XK_h, + KEY_I = XK_i, + KEY_J = XK_j, + KEY_K = XK_k, + KEY_L = XK_l, + KEY_M = XK_m, + KEY_N = XK_n, + KEY_O = XK_o, + KEY_P = XK_p, + KEY_Q = XK_q, + KEY_R = XK_r, + KEY_S = XK_s, + KEY_T = XK_t, + KEY_U = XK_u, + KEY_V = XK_v, + KEY_W = XK_w, + KEY_X = XK_x, + KEY_Y = XK_y, + KEY_Z = XK_z, + KEY_RETURN = (XK_Return & 0xFF), + KEY_TAB = (XK_Tab & 0xFF), + KEY_ESCAPE = (XK_Escape & 0xFF), + KEY_SHIFT_LEFT = (XK_Shift_L & 0xFF), + KEY_CTRL_LEFT = (XK_Control_L & 0xFF), + KEY_ALT_LEFT = (XK_Alt_L & 0xFF), + KEY_CURSOR_UP = (XK_Up & 0xFF), + KEY_CURSOR_DOWN = (XK_Down & 0xFF), + KEY_CURSOR_LEFT = (XK_Left & 0xFF), + KEY_CURSOR_RIGHT = (XK_Right & 0xFF) } ksKeyboardKey; + +typedef enum { MOUSE_LEFT = Button1, MOUSE_RIGHT = Button2 } ksMouseButton; + +/* + Change video mode using the XFree86-VidMode X extension. + + While the XFree86-VidMode X extension should be superseded by the XRandR X extension, + this still appears to be the most reliable way to change video modes for a single + monitor configuration. +*/ +static bool ChangeVideoMode_XF86VidMode(Display *xDisplay, int xScreen, int *currentWidth, int *currentHeight, + float *currentRefreshRate, int *desiredWidth, int *desiredHeight, + float *desiredRefreshRate) { + int videoModeCount; + XF86VidModeModeInfo **videoModeInfos; + + XF86VidModeGetAllModeLines(xDisplay, xScreen, &videoModeCount, &videoModeInfos); + + if (currentWidth != NULL && currentHeight != NULL && currentRefreshRate != NULL) { + XF86VidModeModeInfo *mode = videoModeInfos[0]; + *currentWidth = mode->hdisplay; + *currentHeight = mode->vdisplay; + *currentRefreshRate = (mode->dotclock * 1000.0f) / (mode->htotal * mode->vtotal); + } + + if (desiredWidth != NULL && desiredHeight != NULL && desiredRefreshRate != NULL) { + XF86VidModeModeInfo *bestMode = NULL; + int bestModeWidth = 0; + int bestModeHeight = 0; + float bestModeRefreshRate = 0.0f; + int bestSizeError = 0x7FFFFFFF; + float bestRefreshRateError = 1e6f; + for (int j = 0; j < videoModeCount; j++) { + XF86VidModeModeInfo *mode = videoModeInfos[j]; + const int modeWidth = mode->hdisplay; + const int modeHeight = mode->vdisplay; + const float modeRefreshRate = (mode->dotclock * 1000.0f) / (mode->htotal * mode->vtotal); + + const int dw = modeWidth - *desiredWidth; + const int dh = modeHeight - *desiredHeight; + const int sizeError = dw * dw + dh * dh; + const float refreshRateError = fabsf(modeRefreshRate - *desiredRefreshRate); + if (sizeError < bestSizeError || (sizeError == bestSizeError && refreshRateError < bestRefreshRateError)) { + bestSizeError = sizeError; + bestRefreshRateError = refreshRateError; + bestMode = mode; + bestModeWidth = modeWidth; + bestModeHeight = modeHeight; + bestModeRefreshRate = modeRefreshRate; + } + } + + XF86VidModeSwitchToMode(xDisplay, xScreen, bestMode); + XF86VidModeSetViewPort(xDisplay, xScreen, 0, 0); + + *desiredWidth = bestModeWidth; + *desiredHeight = bestModeHeight; + *desiredRefreshRate = bestModeRefreshRate; + } + + for (int i = 0; i < videoModeCount; i++) { + if (videoModeInfos[i]->privsize > 0) { + XFree(videoModeInfos[i]->private); + } + } + XFree(videoModeInfos); + + return true; +} + +/* + Change video mode using the XRandR X extension version 1.1 + + This does not work using NVIDIA drivers because the NVIDIA drivers by default dynamically + configure TwinView, known as DynamicTwinView. When DynamicTwinView is enabled (the default), + the refresh rate of a mode reported through XRandR is not the actual refresh rate, but + instead is an unique number such that each MetaMode has a different value. This is to + guarantee that MetaModes can be uniquely identified by XRandR. + + To get XRandR to report accurate refresh rates, DynamicTwinView needs to be disabled, but + then NV-CONTROL clients, such as nvidia-settings, will not be able to dynamically manipulate + the X screen's MetaModes. +*/ +static bool ChangeVideoMode_XRandR_1_1(Display *xDisplay, Window xWindow, int *currentWidth, int *currentHeight, + float *currentRefreshRate, int *desiredWidth, int *desiredHeight, + float *desiredRefreshRate) { + int major_version; + int minor_version; + XRRQueryVersion(xDisplay, &major_version, &minor_version); + + XRRScreenConfiguration *screenInfo = XRRGetScreenInfo(xDisplay, xWindow); + if (screenInfo == NULL) { + Error("Cannot get screen info."); + return false; + } + + if (currentWidth != NULL && currentHeight != NULL && currentRefreshRate != NULL) { + XRRScreenConfiguration *screenInfo = XRRGetScreenInfo(xDisplay, xWindow); + + Rotation rotation; + int size_index = XRRConfigCurrentConfiguration(screenInfo, &rotation); + + int nsizes; + XRRScreenSize *sizes = XRRConfigSizes(screenInfo, &nsizes); + + *currentWidth = sizes[size_index].width; + *currentHeight = sizes[size_index].height; + *currentRefreshRate = XRRConfigCurrentRate(screenInfo); + } + + if (desiredWidth != NULL && desiredHeight != NULL && desiredRefreshRate != NULL) { + int nsizes = 0; + XRRScreenSize *sizes = XRRConfigSizes(screenInfo, &nsizes); + + int size_index = -1; + int bestSizeError = 0x7FFFFFFF; + for (int i = 0; i < nsizes; i++) { + const int dw = sizes[i].width - *desiredWidth; + const int dh = sizes[i].height - *desiredHeight; + const int error = dw * dw + dh * dh; + if (error < bestSizeError) { + bestSizeError = error; + size_index = i; + } + } + if (size_index == -1) { + Error("%dx%d resolution not available.", *desiredWidth, *desiredHeight); + XRRFreeScreenConfigInfo(screenInfo); + return false; + } + + int nrates = 0; + short *rates = XRRConfigRates(screenInfo, size_index, &nrates); + + int rate_index = -1; + float bestRateError = 1e6f; + for (int i = 0; i < nrates; i++) { + const float error = fabsf(rates[i] - *desiredRefreshRate); + if (error < bestRateError) { + bestRateError = error; + rate_index = i; + } + } + + *desiredWidth = sizes[size_index].width; + *desiredHeight = sizes[size_index].height; + *desiredRefreshRate = rates[rate_index]; + + XSelectInput(xDisplay, xWindow, StructureNotifyMask); + XRRSelectInput(xDisplay, xWindow, RRScreenChangeNotifyMask); + + Rotation rotation = 1; + int reflection = 0; + + Status status = XRRSetScreenConfigAndRate(xDisplay, screenInfo, xWindow, (SizeID)size_index, + (Rotation)(rotation | reflection), rates[rate_index], CurrentTime); + + if (status != RRSetConfigSuccess) { + Error("Failed to change resolution to %dx%d", *desiredWidth, *desiredHeight); + XRRFreeScreenConfigInfo(screenInfo); + return false; + } + + int eventbase; + int errorbase; + XRRQueryExtension(xDisplay, &eventbase, &errorbase); + + bool receivedScreenChangeNotify = false; + bool receivedConfigNotify = false; + while (1) { + XEvent event; + XNextEvent(xDisplay, (XEvent *)&event); + XRRUpdateConfiguration(&event); + if (event.type - eventbase == RRScreenChangeNotify) { + receivedScreenChangeNotify = true; + } else if (event.type == ConfigureNotify) { + receivedConfigNotify = true; + } + if (receivedScreenChangeNotify && receivedConfigNotify) { + break; + } + } + } + + XRRFreeScreenConfigInfo(screenInfo); + + return true; +} + +/* + Change video mode using the XRandR X extension version 1.2 + + The following code does not necessarily work out of the box, because on + some configurations the modes list returned by XRRGetScreenResources() + is populated with nothing other than the maximum display resolution, + even though XF86VidModeGetAllModeLines() and XRRConfigSizes() *will* + list all resolutions for the same display. + + The user can manually add new modes from the command-line using the + xrandr utility: + + xrandr --newmode + + Where is generated with a utility that implements either + the General Timing Formula (GTF) or the Coordinated Video Timing (CVT) + standard put forth by the Video Electronics Standards Association (VESA): + + gft // http://gtf.sourceforge.net/ + cvt // http://www.uruk.org/~erich/projects/cvt/ + + Alternatively, new modes can be added in code using XRRCreateMode(). + However, this requires calculating all the timing information in code + because there is no standard library that implements the GTF or CVT. +*/ +static bool ChangeVideoMode_XRandR_1_2(Display *xDisplay, Window xWindow, int *currentWidth, int *currentHeight, + float *currentRefreshRate, int *desiredWidth, int *desiredHeight, + float *desiredRefreshRate) { + int major_version; + int minor_version; + XRRQueryVersion(xDisplay, &major_version, &minor_version); + + /* + Screen - virtual screenspace which may be covered by multiple CRTCs + CRTC - display controller + Output - display/monitor connected to a CRTC + Clones - outputs that are simultaneously connected to the same CRTC + */ + + const int PRIMARY_CRTC_INDEX = 0; + const int PRIMARY_OUTPUT_INDEX = 0; + + XRRScreenResources *screenResources = XRRGetScreenResources(xDisplay, xWindow); + XRRCrtcInfo *primaryCrtcInfo = XRRGetCrtcInfo(xDisplay, screenResources, screenResources->crtcs[PRIMARY_CRTC_INDEX]); + XRROutputInfo *primaryOutputInfo = XRRGetOutputInfo(xDisplay, screenResources, primaryCrtcInfo->outputs[PRIMARY_OUTPUT_INDEX]); + + if (currentWidth != NULL && currentHeight != NULL && currentRefreshRate != NULL) { + for (int i = 0; i < screenResources->nmode; i++) { + const XRRModeInfo *modeInfo = &screenResources->modes[i]; + if (modeInfo->id == primaryCrtcInfo->mode) { + *currentWidth = modeInfo->width; + *currentHeight = modeInfo->height; + *currentRefreshRate = modeInfo->dotClock / ((float)modeInfo->hTotal * (float)modeInfo->vTotal); + break; + } + } + } + + if (desiredWidth != NULL && desiredHeight != NULL && desiredRefreshRate != NULL) { + RRMode bestMode = 0; + int bestModeWidth = 0; + int bestModeHeight = 0; + float bestModeRefreshRate = 0.0f; + int bestSizeError = 0x7FFFFFFF; + float bestRefreshRateError = 1e6f; + + for (int i = 0; i < screenResources->nmode; i++) { + const XRRModeInfo *modeInfo = &screenResources->modes[i]; + + if (modeInfo->modeFlags & RR_Interlace) { + continue; + } + + bool validOutputMode = false; + for (int j = 0; j < primaryOutputInfo->nmode; j++) { + if (modeInfo->id == primaryOutputInfo->modes[j]) { + validOutputMode = true; + break; + } + } + if (!validOutputMode) { + continue; + } + + const int modeWidth = modeInfo->width; + const int modeHeight = modeInfo->height; + const float modeRefreshRate = modeInfo->dotClock / ((float)modeInfo->hTotal * (float)modeInfo->vTotal); + + const int dw = modeWidth - *desiredWidth; + const int dh = modeHeight - *desiredHeight; + const int sizeError = dw * dw + dh * dh; + const float refreshRateError = fabsf(modeRefreshRate - *desiredRefreshRate); + if (sizeError < bestSizeError || (sizeError == bestSizeError && refreshRateError < bestRefreshRateError)) { + bestSizeError = sizeError; + bestRefreshRateError = refreshRateError; + bestMode = modeInfo->id; + bestModeWidth = modeWidth; + bestModeHeight = modeHeight; + bestModeRefreshRate = modeRefreshRate; + } + } + + XRRSetCrtcConfig(xDisplay, screenResources, primaryOutputInfo->crtc, CurrentTime, primaryCrtcInfo->x, primaryCrtcInfo->y, + bestMode, primaryCrtcInfo->rotation, primaryCrtcInfo->outputs, primaryCrtcInfo->noutput); + + *desiredWidth = bestModeWidth; + *desiredHeight = bestModeHeight; + *desiredRefreshRate = bestModeRefreshRate; + } + + XRRFreeOutputInfo(primaryOutputInfo); + XRRFreeCrtcInfo(primaryCrtcInfo); + XRRFreeScreenResources(screenResources); + + return true; +} + +void ksGpuWindow_Destroy(ksGpuWindow *window) { + ksGpuContext_Destroy(&window->context); + ksGpuDevice_Destroy(&window->device); + + if (window->windowFullscreen) { + ChangeVideoMode_XF86VidMode(window->xDisplay, window->xScreen, NULL, NULL, NULL, &window->desktopWidth, + &window->desktopHeight, &window->desktopRefreshRate); + + XUngrabPointer(window->xDisplay, CurrentTime); + XUngrabKeyboard(window->xDisplay, CurrentTime); + } + + if (window->xWindow) { + XUnmapWindow(window->xDisplay, window->xWindow); + XDestroyWindow(window->xDisplay, window->xWindow); + window->xWindow = 0; + } + + if (window->xColormap) { + XFreeColormap(window->xDisplay, window->xColormap); + window->xColormap = 0; + } + + if (window->xVisual) { + XFree(window->xVisual); + window->xVisual = NULL; + } + + XFlush(window->xDisplay); + XCloseDisplay(window->xDisplay); + window->xDisplay = NULL; +} + +bool ksGpuWindow_Create(ksGpuWindow *window, ksDriverInstance *instance, const ksGpuQueueInfo *queueInfo, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, const int width, const int height, const bool fullscreen) { + memset(window, 0, sizeof(ksGpuWindow)); + + window->colorFormat = colorFormat; + window->depthFormat = depthFormat; + window->sampleCount = sampleCount; + window->windowWidth = width; + window->windowHeight = height; + window->windowSwapInterval = 1; + window->windowRefreshRate = 60.0f; + window->windowFullscreen = fullscreen; + window->windowActive = false; + window->windowExit = false; + window->lastSwapTime = GetTimeNanoseconds(); + + const char *displayName = NULL; + window->xDisplay = XOpenDisplay(displayName); + if (!window->xDisplay) { + Error("Unable to open X Display."); + return false; + } + + window->xScreen = XDefaultScreen(window->xDisplay); + window->xRoot = XRootWindow(window->xDisplay, window->xScreen); + + if (window->windowFullscreen) { + ChangeVideoMode_XF86VidMode(window->xDisplay, window->xScreen, &window->desktopWidth, &window->desktopHeight, + &window->desktopRefreshRate, &window->windowWidth, &window->windowHeight, + &window->windowRefreshRate); + } else { + ChangeVideoMode_XF86VidMode(window->xDisplay, window->xScreen, &window->desktopWidth, &window->desktopHeight, + &window->desktopRefreshRate, NULL, NULL, NULL); + window->windowRefreshRate = window->desktopRefreshRate; + } + + ksGpuDevice_Create(&window->device, instance, queueInfo); + ksGpuContext_CreateForSurface(&window->context, &window->device, queueIndex, colorFormat, depthFormat, sampleCount, + window->xDisplay, window->xScreen); + + window->xVisual = glXGetVisualFromFBConfig(window->xDisplay, window->context.glxFBConfig); + if (window->xVisual == NULL) { + Error("Failed to retrieve visual for framebuffer config."); + ksGpuWindow_Destroy(window); + return false; + } + + window->xColormap = XCreateColormap(window->xDisplay, window->xRoot, window->xVisual->visual, AllocNone); + + const unsigned long wamask = CWColormap | CWEventMask | (window->windowFullscreen ? 0 : CWBorderPixel); + + XSetWindowAttributes wa; + memset(&wa, 0, sizeof(wa)); + wa.colormap = window->xColormap; + wa.border_pixel = 0; + wa.event_mask = StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask | KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask | FocusChangeMask | ExposureMask | VisibilityChangeMask | EnterWindowMask | + LeaveWindowMask; + + window->xWindow = XCreateWindow(window->xDisplay, // Display * display + window->xRoot, // Window parent + 0, // int x + 0, // int y + window->windowWidth, // unsigned int width + window->windowHeight, // unsigned int height + 0, // unsigned int border_width + window->xVisual->depth, // int depth + InputOutput, // unsigned int class + window->xVisual->visual, // Visual * visual + wamask, // unsigned long valuemask + &wa); // XSetWindowAttributes * attributes + + if (!window->xWindow) { + Error("Failed to create window."); + ksGpuWindow_Destroy(window); + return false; + } + + // Change the window title. + Atom _NET_WM_NAME = XInternAtom(window->xDisplay, "_NET_WM_NAME", False); + XChangeProperty(window->xDisplay, window->xWindow, _NET_WM_NAME, XA_STRING, 8, PropModeReplace, + (const unsigned char *)WINDOW_TITLE, strlen(WINDOW_TITLE)); + + if (window->windowFullscreen) { + // Bypass the compositor in fullscreen mode. + const unsigned long bypass = 1; + Atom _NET_WM_BYPASS_COMPOSITOR = XInternAtom(window->xDisplay, "_NET_WM_BYPASS_COMPOSITOR", False); + XChangeProperty(window->xDisplay, window->xWindow, _NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32, PropModeReplace, + (const unsigned char *)&bypass, 1); + + // Completely disassociate window from window manager. + XSetWindowAttributes attributes; + attributes.override_redirect = True; + XChangeWindowAttributes(window->xDisplay, window->xWindow, CWOverrideRedirect, &attributes); + + // Make the window visible. + XMapRaised(window->xDisplay, window->xWindow); + XMoveResizeWindow(window->xDisplay, window->xWindow, 0, 0, window->windowWidth, window->windowHeight); + XFlush(window->xDisplay); + + // Grab mouse and keyboard input now that the window is disassociated from the window manager. + XGrabPointer(window->xDisplay, window->xWindow, True, 0, GrabModeAsync, GrabModeAsync, window->xWindow, 0L, CurrentTime); + XGrabKeyboard(window->xDisplay, window->xWindow, True, GrabModeAsync, GrabModeAsync, CurrentTime); + } else { + // Make the window fixed size. + XSizeHints *hints = XAllocSizeHints(); + hints->flags = (PMinSize | PMaxSize); + hints->min_width = window->windowWidth; + hints->max_width = window->windowWidth; + hints->min_height = window->windowHeight; + hints->max_height = window->windowHeight; + XSetWMNormalHints(window->xDisplay, window->xWindow, hints); + XFree(hints); + + // First map the window and then center the window on the screen. + XMapRaised(window->xDisplay, window->xWindow); + const int x = (window->desktopWidth - window->windowWidth) / 2; + const int y = (window->desktopHeight - window->windowHeight) / 2; + XMoveResizeWindow(window->xDisplay, window->xWindow, x, y, window->windowWidth, window->windowHeight); + XFlush(window->xDisplay); + } + + window->context.glxDrawable = window->xWindow; + + ksGpuContext_SetCurrent(&window->context); + + return true; +} + +static bool ksGpuWindow_SupportedResolution(const int width, const int height) { + UNUSED_PARM(width); + UNUSED_PARM(height); + + return true; +} + +void ksGpuWindow_Exit(ksGpuWindow *window) { window->windowExit = true; } + +ksGpuWindowEvent ksGpuWindow_ProcessEvents(ksGpuWindow *window) { + int count = XPending(window->xDisplay); + for (int i = 0; i < count; i++) { + XEvent event; + XNextEvent(window->xDisplay, &event); + + switch (event.type) { + case KeyPress: { + KeySym key = XLookupKeysym(&event.xkey, 0); + if (key < 256 || key == XK_Escape) { + window->input.keyInput[key & 255] = true; + } + break; + } + case KeyRelease: { + KeySym key = XLookupKeysym(&event.xkey, 0); + if (key == XK_Escape) { + exit(0); + } + break; + } + case ButtonPress: { + window->input.mouseInput[event.xbutton.button] = true; + window->input.mouseInputX[event.xbutton.button] = event.xbutton.x; + window->input.mouseInputY[event.xbutton.button] = event.xbutton.y; + } + case ButtonRelease: { + break; + } + // StructureNotifyMask + case ConfigureNotify: + case MapNotify: + case UnmapNotify: + case DestroyNotify: + // PropertyChangeMask + case PropertyNotify: + // ResizeRedirectMask + case ResizeRequest: + // EnterWindowMask | LeaveWindowMask + case EnterNotify: + case LeaveNotify: + // FocusChangeMask + case FocusIn: + case FocusOut: + // ExposureMask + case Expose: + // VisibilityChangeMask + case VisibilityNotify: + + case GenericEvent: + default: + break; + } + } + + if (window->windowExit) { + return KS_GPU_WINDOW_EVENT_EXIT; + } + + if (window->windowActive == false) { + window->windowActive = true; + return KS_GPU_WINDOW_EVENT_ACTIVATED; + } + + return KS_GPU_WINDOW_EVENT_NONE; +} + +#elif defined(OS_LINUX_XCB) || defined(OS_LINUX_XCB_GLX) + +typedef enum // keysym.h +{ KEY_A = XK_a, + KEY_B = XK_b, + KEY_C = XK_c, + KEY_D = XK_d, + KEY_E = XK_e, + KEY_F = XK_f, + KEY_G = XK_g, + KEY_H = XK_h, + KEY_I = XK_i, + KEY_J = XK_j, + KEY_K = XK_k, + KEY_L = XK_l, + KEY_M = XK_m, + KEY_N = XK_n, + KEY_O = XK_o, + KEY_P = XK_p, + KEY_Q = XK_q, + KEY_R = XK_r, + KEY_S = XK_s, + KEY_T = XK_t, + KEY_U = XK_u, + KEY_V = XK_v, + KEY_W = XK_w, + KEY_X = XK_x, + KEY_Y = XK_y, + KEY_Z = XK_z, + KEY_RETURN = (XK_Return & 0xFF), + KEY_TAB = (XK_Tab & 0xFF), + KEY_ESCAPE = (XK_Escape & 0xFF), + KEY_SHIFT_LEFT = (XK_Shift_L & 0xFF), + KEY_CTRL_LEFT = (XK_Control_L & 0xFF), + KEY_ALT_LEFT = (XK_Alt_L & 0xFF), + KEY_CURSOR_UP = (XK_Up & 0xFF), + KEY_CURSOR_DOWN = (XK_Down & 0xFF), + KEY_CURSOR_LEFT = (XK_Left & 0xFF), + KEY_CURSOR_RIGHT = (XK_Right & 0xFF) } ksKeyboardKey; + +typedef enum { MOUSE_LEFT = 0, MOUSE_RIGHT = 1 } ksMouseButton; + +typedef enum { + XCB_SIZE_HINT_US_POSITION = 1 << 0, + XCB_SIZE_HINT_US_SIZE = 1 << 1, + XCB_SIZE_HINT_P_POSITION = 1 << 2, + XCB_SIZE_HINT_P_SIZE = 1 << 3, + XCB_SIZE_HINT_P_MIN_SIZE = 1 << 4, + XCB_SIZE_HINT_P_MAX_SIZE = 1 << 5, + XCB_SIZE_HINT_P_RESIZE_INC = 1 << 6, + XCB_SIZE_HINT_P_ASPECT = 1 << 7, + XCB_SIZE_HINT_BASE_SIZE = 1 << 8, + XCB_SIZE_HINT_P_WIN_GRAVITY = 1 << 9 +} xcb_size_hints_flags_t; + +static const int _NET_WM_STATE_ADD = 1; // add/set property + +/* + Change video mode using the RandR X extension version 1.4 + + The following code does not necessarily work out of the box, because on + some configurations the modes list returned by XRRGetScreenResources() + is populated with nothing other than the maximum display resolution, + even though XF86VidModeGetAllModeLines() and XRRConfigSizes() *will* + list all resolutions for the same display. + + The user can manually add new modes from the command-line using the + xrandr utility: + + xrandr --newmode + + Where is generated with a utility that implements either + the General Timing Formula (GTF) or the Coordinated Video Timing (CVT) + standard put forth by the Video Electronics Standards Association (VESA): + + gft // http://gtf.sourceforge.net/ + cvt // http://www.uruk.org/~erich/projects/cvt/ + + Alternatively, new modes can be added in code using XRRCreateMode(). + However, this requires calculating all the timing information in code + because there is no standard library that implements the GTF or CVT. +*/ +static bool ChangeVideoMode_XcbRandR_1_4(xcb_connection_t *connection, xcb_screen_t *screen, int *currentWidth, int *currentHeight, + float *currentRefreshRate, int *desiredWidth, int *desiredHeight, + float *desiredRefreshRate) { + /* + Screen - virtual screenspace which may be covered by multiple CRTCs + CRTC - display controller + Output - display/monitor connected to a CRTC + Clones - outputs that are simultaneously connected to the same CRTC + */ + + xcb_randr_get_screen_resources_cookie_t screen_resources_cookie = xcb_randr_get_screen_resources(connection, screen->root); + xcb_randr_get_screen_resources_reply_t *screen_resources_reply = + xcb_randr_get_screen_resources_reply(connection, screen_resources_cookie, 0); + if (screen_resources_reply == NULL) { + return false; + } + + xcb_randr_mode_info_t *mode_info = xcb_randr_get_screen_resources_modes(screen_resources_reply); + const int modes_length = xcb_randr_get_screen_resources_modes_length(screen_resources_reply); + assert(modes_length > 0); + + xcb_randr_crtc_t *crtcs = xcb_randr_get_screen_resources_crtcs(screen_resources_reply); + const int crtcs_length = xcb_randr_get_screen_resources_crtcs_length(screen_resources_reply); + assert(crtcs_length > 0); + UNUSED_PARM(crtcs_length); + + const int PRIMARY_CRTC_INDEX = 0; + const int PRIMARY_OUTPUT_INDEX = 0; + + xcb_randr_get_crtc_info_cookie_t primary_crtc_info_cookie = xcb_randr_get_crtc_info(connection, crtcs[PRIMARY_CRTC_INDEX], 0); + xcb_randr_get_crtc_info_reply_t *primary_crtc_info_reply = + xcb_randr_get_crtc_info_reply(connection, primary_crtc_info_cookie, NULL); + + xcb_randr_output_t *crtc_outputs = xcb_randr_get_crtc_info_outputs(primary_crtc_info_reply); + + xcb_randr_get_output_info_cookie_t primary_output_info_cookie = + xcb_randr_get_output_info(connection, crtc_outputs[PRIMARY_OUTPUT_INDEX], 0); + xcb_randr_get_output_info_reply_t *primary_output_info_reply = + xcb_randr_get_output_info_reply(connection, primary_output_info_cookie, NULL); + + if (currentWidth != NULL && currentHeight != NULL && currentRefreshRate != NULL) { + for (int i = 0; i < modes_length; i++) { + if (mode_info[i].id == primary_crtc_info_reply->mode) { + *currentWidth = mode_info[i].width; + *currentHeight = mode_info[i].height; + *currentRefreshRate = mode_info[i].dot_clock / ((float)mode_info[i].htotal * (float)mode_info[i].vtotal); + break; + } + } + } + + if (desiredWidth != NULL && desiredHeight != NULL && desiredRefreshRate != NULL) { + xcb_randr_mode_t bestMode = 0; + int bestModeWidth = 0; + int bestModeHeight = 0; + float bestModeRefreshRate = 0.0f; + int bestSizeError = 0x7FFFFFFF; + float bestRefreshRateError = 1e6f; + for (int i = 0; i < modes_length; i++) { + if (mode_info[i].mode_flags & XCB_RANDR_MODE_FLAG_INTERLACE) { + continue; + } + + xcb_randr_mode_t *primary_output_info_modes = xcb_randr_get_output_info_modes(primary_output_info_reply); + int primary_output_info_modes_length = xcb_randr_get_output_info_modes_length(primary_output_info_reply); + + bool validOutputMode = false; + for (int j = 0; j < primary_output_info_modes_length; j++) { + if (mode_info[i].id == primary_output_info_modes[j]) { + validOutputMode = true; + break; + } + } + if (!validOutputMode) { + continue; + } + + const int modeWidth = mode_info[i].width; + const int modeHeight = mode_info[i].height; + const float modeRefreshRate = mode_info[i].dot_clock / ((float)mode_info[i].htotal * (float)mode_info[i].vtotal); + + const int dw = modeWidth - *desiredWidth; + const int dh = modeHeight - *desiredHeight; + const int sizeError = dw * dw + dh * dh; + const float refreshRateError = fabs(modeRefreshRate - *desiredRefreshRate); + if (sizeError < bestSizeError || (sizeError == bestSizeError && refreshRateError < bestRefreshRateError)) { + bestSizeError = sizeError; + bestRefreshRateError = refreshRateError; + bestMode = mode_info[i].id; + bestModeWidth = modeWidth; + bestModeHeight = modeHeight; + bestModeRefreshRate = modeRefreshRate; + } + } + + xcb_randr_output_t *primary_crtc_info_outputs = xcb_randr_get_crtc_info_outputs(primary_crtc_info_reply); + int primary_crtc_info_outputs_length = xcb_randr_get_crtc_info_outputs_length(primary_crtc_info_reply); + + xcb_randr_set_crtc_config(connection, primary_output_info_reply->crtc, XCB_TIME_CURRENT_TIME, XCB_TIME_CURRENT_TIME, + primary_crtc_info_reply->x, primary_crtc_info_reply->y, bestMode, + primary_crtc_info_reply->rotation, primary_crtc_info_outputs_length, primary_crtc_info_outputs); + + *desiredWidth = bestModeWidth; + *desiredHeight = bestModeHeight; + *desiredRefreshRate = bestModeRefreshRate; + } + + free(primary_output_info_reply); + free(primary_crtc_info_reply); + free(screen_resources_reply); + + return true; +} + +void ksGpuWindow_Destroy(ksGpuWindow *window) { + ksGpuContext_Destroy(&window->context); + ksGpuDevice_Destroy(&window->device); + +#if defined(OS_LINUX_XCB_GLX) + glXDestroyWindow(window->xDisplay, window->glxWindow); + XFlush(window->xDisplay); + XCloseDisplay(window->xDisplay); + window->xDisplay = NULL; +#else + xcb_glx_delete_window(window->connection, window->glxWindow); +#endif + + if (window->windowFullscreen) { + ChangeVideoMode_XcbRandR_1_4(window->connection, window->screen, NULL, NULL, NULL, &window->desktopWidth, + &window->desktopHeight, &window->desktopRefreshRate); + } + + xcb_destroy_window(window->connection, window->window); + xcb_free_colormap(window->connection, window->colormap); + xcb_flush(window->connection); + xcb_disconnect(window->connection); + xcb_key_symbols_free(window->key_symbols); +} + +bool ksGpuWindow_Create(ksGpuWindow *window, ksDriverInstance *instance, const ksGpuQueueInfo *queueInfo, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, const int width, const int height, const bool fullscreen) { + memset(window, 0, sizeof(ksGpuWindow)); + + window->colorFormat = colorFormat; + window->depthFormat = depthFormat; + window->sampleCount = sampleCount; + window->windowWidth = width; + window->windowHeight = height; + window->windowSwapInterval = 1; + window->windowRefreshRate = 60.0f; + window->windowFullscreen = fullscreen; + window->windowActive = false; + window->windowExit = false; + window->lastSwapTime = GetTimeNanoseconds(); + + const char *displayName = NULL; + int screen_number = 0; + window->connection = xcb_connect(displayName, &screen_number); + if (xcb_connection_has_error(window->connection)) { + ksGpuWindow_Destroy(window); + Error("Failed to open XCB connection."); + return false; + } + + const xcb_setup_t *setup = xcb_get_setup(window->connection); + xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup); + for (int i = 0; i < screen_number; i++) { + xcb_screen_next(&iter); + } + window->screen = iter.data; + + if (window->windowFullscreen) { + ChangeVideoMode_XcbRandR_1_4(window->connection, window->screen, &window->desktopWidth, &window->desktopHeight, + &window->desktopRefreshRate, &window->windowWidth, &window->windowHeight, + &window->windowRefreshRate); + } else { + ChangeVideoMode_XcbRandR_1_4(window->connection, window->screen, &window->desktopWidth, &window->desktopHeight, + &window->desktopRefreshRate, NULL, NULL, NULL); + window->windowRefreshRate = window->desktopRefreshRate; + } + + ksGpuDevice_Create(&window->device, instance, queueInfo); +#if defined(OS_LINUX_XCB_GLX) + window->xDisplay = XOpenDisplay(displayName); + ksGpuContext_CreateForSurface(&window->context, &window->device, queueIndex, colorFormat, depthFormat, sampleCount, + window->xDisplay, screen_number); +#else + ksGpuContext_CreateForSurface(&window->context, &window->device, queueIndex, colorFormat, depthFormat, sampleCount, + window->connection, screen_number); +#endif + + // Create the color map. + window->colormap = xcb_generate_id(window->connection); + xcb_create_colormap(window->connection, XCB_COLORMAP_ALLOC_NONE, window->colormap, window->screen->root, + window->context.visualid); + + // Create the window. + uint32_t value_mask = XCB_CW_BACK_PIXEL | XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK | XCB_CW_COLORMAP; + uint32_t value_list[5]; + value_list[0] = window->screen->black_pixel; + value_list[1] = 0; + value_list[2] = XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_BUTTON_PRESS; + value_list[3] = window->colormap; + value_list[4] = 0; + + window->window = xcb_generate_id(window->connection); + xcb_create_window(window->connection, // xcb_connection_t * connection + XCB_COPY_FROM_PARENT, // uint8_t depth + window->window, // xcb_window_t wid + window->screen->root, // xcb_window_t parent + 0, // int16_t x + 0, // int16_t y + window->windowWidth, // uint16_t width + window->windowHeight, // uint16_t height + 0, // uint16_t border_width + XCB_WINDOW_CLASS_INPUT_OUTPUT, // uint16_t _class + window->context.visualid, // xcb_visualid_t visual + value_mask, // uint32_t value_mask + value_list); // const uint32_t * value_list + + // Change the window title. + xcb_change_property(window->connection, XCB_PROP_MODE_REPLACE, window->window, XCB_ATOM_WM_NAME, XCB_ATOM_STRING, 8, + strlen(WINDOW_TITLE), WINDOW_TITLE); + + // Setup code that will send a notification when the window is destroyed. + xcb_intern_atom_cookie_t wm_protocols_cookie = xcb_intern_atom(window->connection, 1, 12, "WM_PROTOCOLS"); + xcb_intern_atom_cookie_t wm_delete_window_cookie = xcb_intern_atom(window->connection, 0, 16, "WM_DELETE_WINDOW"); + xcb_intern_atom_reply_t *wm_protocols_reply = xcb_intern_atom_reply(window->connection, wm_protocols_cookie, 0); + xcb_intern_atom_reply_t *wm_delete_window_reply = xcb_intern_atom_reply(window->connection, wm_delete_window_cookie, 0); + + window->wm_delete_window_atom = wm_delete_window_reply->atom; + xcb_change_property(window->connection, XCB_PROP_MODE_REPLACE, window->window, wm_protocols_reply->atom, XCB_ATOM_ATOM, 32, 1, + &wm_delete_window_reply->atom); + + free(wm_protocols_reply); + free(wm_delete_window_reply); + + if (window->windowFullscreen) { + // Change the window to fullscreen + xcb_intern_atom_cookie_t wm_state_cookie = xcb_intern_atom(window->connection, 0, 13, "_NET_WM_STATE"); + xcb_intern_atom_cookie_t wm_state_fullscreen_cookie = + xcb_intern_atom(window->connection, 0, 24, "_NET_WM_STATE_FULLSCREEN"); + xcb_intern_atom_reply_t *wm_state_reply = xcb_intern_atom_reply(window->connection, wm_state_cookie, 0); + xcb_intern_atom_reply_t *wm_state_fullscreen_reply = + xcb_intern_atom_reply(window->connection, wm_state_fullscreen_cookie, 0); + + xcb_client_message_event_t ev; + ev.response_type = XCB_CLIENT_MESSAGE; + ev.format = 32; + ev.sequence = 0; + ev.window = window->window; + ev.type = wm_state_reply->atom; + ev.data.data32[0] = _NET_WM_STATE_ADD; + ev.data.data32[1] = wm_state_fullscreen_reply->atom; + ev.data.data32[2] = XCB_ATOM_NONE; + ev.data.data32[3] = 0; + ev.data.data32[4] = 0; + + xcb_send_event(window->connection, 1, window->window, + XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY, (const char *)(&ev)); + + free(wm_state_reply); + free(wm_state_fullscreen_reply); + + xcb_map_window(window->connection, window->window); + xcb_flush(window->connection); + } else { + // Make the window fixed size. + xcb_size_hints_t hints; + memset(&hints, 0, sizeof(hints)); + hints.flags = XCB_SIZE_HINT_US_SIZE | XCB_SIZE_HINT_P_SIZE | XCB_SIZE_HINT_P_MIN_SIZE | XCB_SIZE_HINT_P_MAX_SIZE; + hints.min_width = window->windowWidth; + hints.max_width = window->windowWidth; + hints.min_height = window->windowHeight; + hints.max_height = window->windowHeight; + + xcb_change_property(window->connection, XCB_PROP_MODE_REPLACE, window->window, XCB_ATOM_WM_NORMAL_HINTS, + XCB_ATOM_WM_SIZE_HINTS, 32, sizeof(hints) / 4, &hints); + + // First map the window and then center the window on the screen. + xcb_map_window(window->connection, window->window); + const uint32_t coords[] = {(window->desktopWidth - window->windowWidth) / 2, + (window->desktopHeight - window->windowHeight) / 2}; + xcb_configure_window(window->connection, window->window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords); + xcb_flush(window->connection); + } + + window->key_symbols = xcb_key_symbols_alloc(window->connection); + +#if defined(OS_LINUX_XCB_GLX) + window->glxWindow = glXCreateWindow(window->xDisplay, window->context.glxFBConfig, window->window, NULL); +#else + window->glxWindow = xcb_generate_id(window->connection); + xcb_glx_create_window(window->connection, screen_number, window->context.fbconfigid, window->window, window->glxWindow, 0, + NULL); +#endif + + window->context.glxDrawable = window->glxWindow; + + ksGpuContext_SetCurrent(&window->context); + + return true; +} + +static bool ksGpuWindow_SupportedResolution(const int width, const int height) { + UNUSED_PARM(width); + UNUSED_PARM(height); + + return true; +} + +void ksGpuWindow_Exit(ksGpuWindow *window) { window->windowExit = true; } + +ksGpuWindowEvent ksGpuWindow_ProcessEvents(ksGpuWindow *window) { + xcb_generic_event_t *event = xcb_poll_for_event(window->connection); + if (event != NULL) { + const uint8_t event_code = (event->response_type & 0x7f); + switch (event_code) { + case XCB_CLIENT_MESSAGE: { + const xcb_client_message_event_t *client_message_event = (const xcb_client_message_event_t *)event; + if (client_message_event->data.data32[0] == window->wm_delete_window_atom) { + free(event); + return KS_GPU_WINDOW_EVENT_EXIT; + } + break; + } + case XCB_KEY_PRESS: { + xcb_key_press_event_t *key_press_event = (xcb_key_press_event_t *)event; + const xcb_keysym_t keysym = xcb_key_press_lookup_keysym(window->key_symbols, key_press_event, 0); + if (keysym < 256 || keysym == XK_Escape) { + window->input.keyInput[keysym & 255] = true; + } + break; + } + case XCB_BUTTON_PRESS: { + const xcb_button_press_event_t *button_press_event = (const xcb_button_press_event_t *)event; + const int masks[5] = {XCB_BUTTON_MASK_1, XCB_BUTTON_MASK_2, XCB_BUTTON_MASK_3, XCB_BUTTON_MASK_4, + XCB_BUTTON_MASK_5}; + for (int i = 0; i < 5; i++) { + if ((button_press_event->state & masks[i]) != 0) { + window->input.mouseInput[i] = true; + window->input.mouseInputX[i] = button_press_event->event_x; + window->input.mouseInputY[i] = button_press_event->event_y; + } + } + break; + } + default: + break; + } + free(event); + } + + if (window->windowExit) { + return KS_GPU_WINDOW_EVENT_EXIT; + } + + if (window->windowActive == false) { + window->windowActive = true; + return KS_GPU_WINDOW_EVENT_ACTIVATED; + } + + return KS_GPU_WINDOW_EVENT_NONE; +} + +#elif defined(OS_LINUX_WAYLAND) + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +#endif +static void _keyboard_keymap_cb(void *data, struct wl_keyboard *keyboard, uint32_t format, int fd, uint32_t size) { close(fd); } +static void _keyboard_modifiers_cb(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t mods_depressed, + uint32_t mods_latched, uint32_t mods_locked, uint32_t group) {} + +static void _keyboard_enter_cb(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface, + struct wl_array *keys) {} + +static void _keyboard_leave_cb(void *data, struct wl_keyboard *keyboard, uint32_t serial, struct wl_surface *surface) {} + +static void _pointer_leave_cb(void *data, struct wl_pointer *pointer, uint32_t serial, struct wl_surface *surface) {} + +static void _pointer_enter_cb(void *data, struct wl_pointer *pointer, uint32_t serial, struct wl_surface *surface, wl_fixed_t sx, + wl_fixed_t sy) { + wl_pointer_set_cursor(pointer, serial, NULL, 0, 0); +} + +static void _pointer_motion_cb(void *data, struct wl_pointer *pointer, uint32_t time, wl_fixed_t x, wl_fixed_t y) { + ksGpuWindow *window = (ksGpuWindow *)data; + window->input.mouseInputX[0] = wl_fixed_to_int(x); + window->input.mouseInputY[0] = wl_fixed_to_int(y); +} + +static void _pointer_button_cb(void *data, struct wl_pointer *pointer, uint32_t serial, uint32_t time, uint32_t button, + uint32_t state) { + ksGpuWindow *window = (ksGpuWindow *)data; + + uint32_t button_id = 0; + switch (button) { + case BTN_LEFT: + button_id = 0; + break; + case BTN_MIDDLE: + button_id = 1; + break; + case BTN_RIGHT: + button_id = 2; + break; + } + + window->input.mouseInput[button_id] = state; +} + +static void _pointer_axis_cb(void *data, struct wl_pointer *pointer, uint32_t time, uint32_t axis, wl_fixed_t value) {} + +static void _keyboard_key_cb(void *data, struct wl_keyboard *keyboard, uint32_t serial, uint32_t time, uint32_t key, + uint32_t state) { + ksGpuWindow *window = (ksGpuWindow *)data; + if (key == KEY_ESC) window->windowExit = true; + + if (state) window->input.keyInput[key] = state; +} + +const struct wl_pointer_listener pointer_listener = { + _pointer_enter_cb, _pointer_leave_cb, _pointer_motion_cb, _pointer_button_cb, _pointer_axis_cb, +}; + +const struct wl_keyboard_listener keyboard_listener = { + _keyboard_keymap_cb, _keyboard_enter_cb, _keyboard_leave_cb, _keyboard_key_cb, _keyboard_modifiers_cb, +}; + +static void _seat_capabilities_cb(void *data, struct wl_seat *seat, uint32_t caps) { + ksGpuWindow *window = (ksGpuWindow *)data; + if ((caps & WL_SEAT_CAPABILITY_POINTER) && !window->pointer) { + window->pointer = wl_seat_get_pointer(seat); + wl_pointer_add_listener(window->pointer, &pointer_listener, window); + } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && window->pointer) { + wl_pointer_destroy(window->pointer); + window->pointer = NULL; + } + + if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !window->keyboard) { + window->keyboard = wl_seat_get_keyboard(seat); + wl_keyboard_add_listener(window->keyboard, &keyboard_listener, window); + } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && window->keyboard) { + wl_keyboard_destroy(window->keyboard); + window->keyboard = NULL; + } +} + +const struct wl_seat_listener seat_listener = { + _seat_capabilities_cb, +}; + +static void _xdg_surface_configure_cb(void *data, struct zxdg_surface_v6 *surface, uint32_t serial) { + zxdg_surface_v6_ack_configure(surface, serial); +} + +const struct zxdg_surface_v6_listener xdg_surface_listener = { + _xdg_surface_configure_cb, +}; + +static void _xdg_shell_ping_cb(void *data, struct zxdg_shell_v6 *shell, uint32_t serial) { zxdg_shell_v6_pong(shell, serial); } + +const struct zxdg_shell_v6_listener xdg_shell_listener = { + _xdg_shell_ping_cb, +}; + +static void _xdg_toplevel_configure_cb(void *data, struct zxdg_toplevel_v6 *toplevel, int32_t width, int32_t height, + struct wl_array *states) { + ksGpuWindow *window = (ksGpuWindow *)data; + + window->windowActive = false; + + enum zxdg_toplevel_v6_state *state; + wl_array_for_each(state, states) { + switch (*state) { + case ZXDG_TOPLEVEL_V6_STATE_FULLSCREEN: + break; + case ZXDG_TOPLEVEL_V6_STATE_RESIZING: + window->windowWidth = width; + window->windowWidth = height; + break; + case ZXDG_TOPLEVEL_V6_STATE_MAXIMIZED: + break; + case ZXDG_TOPLEVEL_V6_STATE_ACTIVATED: + window->windowActive = true; + break; + } + } +} + +static void _xdg_toplevel_close_cb(void *data, struct zxdg_toplevel_v6 *toplevel) { + ksGpuWindow *window = (ksGpuWindow *)data; + window->windowExit = true; +} + +const struct zxdg_toplevel_v6_listener xdg_toplevel_listener = { + _xdg_toplevel_configure_cb, + _xdg_toplevel_close_cb, +}; + +static void _registry_cb(void *data, struct wl_registry *registry, uint32_t id, const char *interface, uint32_t version) { + ksGpuWindow *window = (ksGpuWindow *)data; + + if (strcmp(interface, "wl_compositor") == 0) { + window->compositor = wl_registry_bind(registry, id, &wl_compositor_interface, 1); + } else if (strcmp(interface, "zxdg_shell_v6") == 0) { + window->shell = wl_registry_bind(registry, id, &zxdg_shell_v6_interface, 1); + zxdg_shell_v6_add_listener(window->shell, &xdg_shell_listener, NULL); + } else if (strcmp(interface, "wl_seat") == 0) { + window->seat = wl_registry_bind(registry, id, &wl_seat_interface, 1); + wl_seat_add_listener(window->seat, &seat_listener, window); + } +} + +static void _registry_remove_cb(void *data, struct wl_registry *registry, uint32_t id) {} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + +const struct wl_registry_listener registry_listener = {_registry_cb, _registry_remove_cb}; + +bool ksGpuWindow_Create(ksGpuWindow *window, ksDriverInstance *instance, const ksGpuQueueInfo *queueInfo, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, const int width, const int height, const bool fullscreen) { + (void)queueIndex; + memset(window, 0, sizeof(ksGpuWindow)); + + window->display = NULL; + window->surface = NULL; + window->registry = NULL; + window->compositor = NULL; + window->shell = NULL; + window->shell_surface = NULL; + + window->keyboard = NULL; + window->pointer = NULL; + window->seat = NULL; + + window->colorFormat = colorFormat; + window->depthFormat = depthFormat; + window->sampleCount = sampleCount; + window->windowWidth = width; + window->windowHeight = height; + window->windowSwapInterval = 1; + window->windowRefreshRate = 60.0f; + window->windowFullscreen = fullscreen; + window->windowActive = false; + window->windowExit = false; + window->lastSwapTime = GetTimeNanoseconds(); + + window->display = wl_display_connect(NULL); + if (window->display == NULL) { + Error("Can't connect to wayland display."); + return false; + } + + window->registry = wl_display_get_registry(window->display); + wl_registry_add_listener(window->registry, ®istry_listener, window); + + wl_display_roundtrip(window->display); + + if (window->compositor == NULL) { + Error("Compositor protocol failed to bind"); + return false; + } + + if (window->shell == NULL) { + Error("Compositor is missing support for zxdg_shell_v6."); + return false; + } + + window->surface = wl_compositor_create_surface(window->compositor); + if (window->surface == NULL) { + Error("Could not create compositor surface."); + return false; + } + + window->shell_surface = zxdg_shell_v6_get_xdg_surface(window->shell, window->surface); + if (window->shell_surface == NULL) { + Error("Could not get shell surface."); + return false; + } + + zxdg_surface_v6_add_listener(window->shell_surface, &xdg_surface_listener, window); + + struct zxdg_toplevel_v6 *toplevel = zxdg_surface_v6_get_toplevel(window->shell_surface); + if (toplevel == NULL) { + Error("Could not get surface toplevel."); + return false; + } + + zxdg_toplevel_v6_add_listener(toplevel, &xdg_toplevel_listener, window); + + zxdg_toplevel_v6_set_title(toplevel, WINDOW_TITLE); + zxdg_toplevel_v6_set_app_id(toplevel, APPLICATION_NAME); + zxdg_toplevel_v6_set_min_size(toplevel, width, height); + zxdg_toplevel_v6_set_max_size(toplevel, width, height); + + wl_surface_commit(window->surface); + + window->context.native_window = wl_egl_window_create(window->surface, width, height); + + if (window->context.native_window == EGL_NO_SURFACE) { + ksGpuWindow_Destroy(window); + Error("Could not create wayland egl window."); + return false; + } + + ksGpuDevice_Create(&window->device, instance, queueInfo); + + ksGpuContext_CreateForSurface(&window->context, &window->device, window->display); + + ksGpuContext_SetCurrent(&window->context); + + return true; +} + +void ksGpuWindow_Destroy(ksGpuWindow *window) { + if (window->pointer != NULL) wl_pointer_destroy(window->pointer); + if (window->keyboard != NULL) wl_keyboard_destroy(window->keyboard); + if (window->seat != NULL) wl_seat_destroy(window->seat); + + wl_egl_window_destroy(window->context.native_window); + + if (window->compositor != NULL) wl_compositor_destroy(window->compositor); + if (window->registry != NULL) wl_registry_destroy(window->registry); + if (window->shell_surface != NULL) zxdg_surface_v6_destroy(window->shell_surface); + if (window->shell != NULL) zxdg_shell_v6_destroy(window->shell); + if (window->surface != NULL) wl_surface_destroy(window->surface); + if (window->display != NULL) wl_display_disconnect(window->display); + + ksGpuContext_Destroy(&window->context); + ksGpuDevice_Destroy(&window->device); +} + +ksGpuWindowEvent ksGpuWindow_ProcessEvents(ksGpuWindow *window) { + while (wl_display_prepare_read(window->display) != 0) wl_display_dispatch_pending(window->display); + + if (wl_display_flush(window->display) < 0 && errno != EAGAIN) { + wl_display_cancel_read(window->display); + return KS_GPU_WINDOW_EVENT_NONE; + } + + struct pollfd fds[] = { + {wl_display_get_fd(window->display), POLLIN}, + }; + if (poll(fds, 1, 0) > 0) { + wl_display_read_events(window->display); + wl_display_dispatch_pending(window->display); + } else { + wl_display_cancel_read(window->display); + } + + if (window->windowExit) { + return KS_GPU_WINDOW_EVENT_EXIT; + } + + return KS_GPU_WINDOW_EVENT_NONE; +} + +/* + * TODO: + * This is a work around for ksKeyboardKey naming collision + * with the definitions from . + * The proper fix for this is to rename the key enums. + */ + +#undef KEY_A +#undef KEY_B +#undef KEY_C +#undef KEY_D +#undef KEY_E +#undef KEY_F +#undef KEY_G +#undef KEY_H +#undef KEY_I +#undef KEY_J +#undef KEY_K +#undef KEY_L +#undef KEY_M +#undef KEY_N +#undef KEY_O +#undef KEY_P +#undef KEY_Q +#undef KEY_R +#undef KEY_S +#undef KEY_T +#undef KEY_U +#undef KEY_V +#undef KEY_W +#undef KEY_X +#undef KEY_Y +#undef KEY_Z +#undef KEY_TAB + +typedef enum // from +{ KEY_A = 30, + KEY_B = 48, + KEY_C = 46, + KEY_D = 32, + KEY_E = 18, + KEY_F = 33, + KEY_G = 34, + KEY_H = 35, + KEY_I = 23, + KEY_J = 36, + KEY_K = 37, + KEY_L = 38, + KEY_M = 50, + KEY_N = 49, + KEY_O = 24, + KEY_P = 25, + KEY_Q = 16, + KEY_R = 19, + KEY_S = 31, + KEY_T = 20, + KEY_U = 22, + KEY_V = 47, + KEY_W = 17, + KEY_X = 45, + KEY_Y = 21, + KEY_Z = 44, + KEY_TAB = 15, + KEY_RETURN = KEY_ENTER, + KEY_ESCAPE = KEY_ESC, + KEY_SHIFT_LEFT = KEY_LEFTSHIFT, + KEY_CTRL_LEFT = KEY_LEFTCTRL, + KEY_ALT_LEFT = KEY_LEFTALT, + KEY_CURSOR_UP = KEY_UP, + KEY_CURSOR_DOWN = KEY_DOWN, + KEY_CURSOR_LEFT = KEY_LEFT, + KEY_CURSOR_RIGHT = KEY_RIGHT } ksKeyboardKey; + +typedef enum { MOUSE_LEFT = BTN_LEFT, MOUSE_MIDDLE = BTN_MIDDLE, MOUSE_RIGHT = BTN_RIGHT } ksMouseButton; + +#elif defined(OS_APPLE_MACOS) + +typedef enum { + KEY_A = 0x00, + KEY_B = 0x0B, + KEY_C = 0x08, + KEY_D = 0x02, + KEY_E = 0x0E, + KEY_F = 0x03, + KEY_G = 0x05, + KEY_H = 0x04, + KEY_I = 0x22, + KEY_J = 0x26, + KEY_K = 0x28, + KEY_L = 0x25, + KEY_M = 0x2E, + KEY_N = 0x2D, + KEY_O = 0x1F, + KEY_P = 0x23, + KEY_Q = 0x0C, + KEY_R = 0x0F, + KEY_S = 0x01, + KEY_T = 0x11, + KEY_U = 0x20, + KEY_V = 0x09, + KEY_W = 0x0D, + KEY_X = 0x07, + KEY_Y = 0x10, + KEY_Z = 0x06, + KEY_RETURN = 0x24, + KEY_TAB = 0x30, + KEY_ESCAPE = 0x35, + KEY_SHIFT_LEFT = 0x38, + KEY_CTRL_LEFT = 0x3B, + KEY_ALT_LEFT = 0x3A, + KEY_CURSOR_UP = 0x7E, + KEY_CURSOR_DOWN = 0x7D, + KEY_CURSOR_LEFT = 0x7B, + KEY_CURSOR_RIGHT = 0x7C +} ksKeyboardKey; + +typedef enum { MOUSE_LEFT = 0, MOUSE_RIGHT = 1 } ksMouseButton; + +NSAutoreleasePool *autoReleasePool; + +@interface MyNSWindow : NSWindow +- (BOOL)canBecomeMainWindow; +- (BOOL)canBecomeKeyWindow; +- (BOOL)acceptsFirstResponder; +- (void)keyDown:(NSEvent *)event; +@end + +@implementation MyNSWindow +- (BOOL)canBecomeMainWindow { + return YES; +} +- (BOOL)canBecomeKeyWindow { + return YES; +} +- (BOOL)acceptsFirstResponder { + return YES; +} +- (void)keyDown:(NSEvent *)event { +} +@end + +@interface MyNSView : NSView +- (BOOL)acceptsFirstResponder; +- (void)keyDown:(NSEvent *)event; +@end + +@implementation MyNSView +- (BOOL)acceptsFirstResponder { + return YES; +} +- (void)keyDown:(NSEvent *)event { +} +@end + +void ksGpuWindow_Destroy(ksGpuWindow *window) { + ksGpuContext_Destroy(&window->context); + ksGpuDevice_Destroy(&window->device); + + if (window->windowFullscreen) { + CGDisplaySetDisplayMode(window->display, window->desktopDisplayMode, NULL); + CGDisplayModeRelease(window->desktopDisplayMode); + window->desktopDisplayMode = NULL; + } + if (window->nsWindow) { + [window->nsWindow release]; + window->nsWindow = nil; + } + if (window->nsView) { + [window->nsView release]; + window->nsView = nil; + } +} + +bool ksGpuWindow_Create(ksGpuWindow *window, ksDriverInstance *instance, const ksGpuQueueInfo *queueInfo, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, const int width, const int height, const bool fullscreen) { + memset(window, 0, sizeof(ksGpuWindow)); + + window->colorFormat = colorFormat; + window->depthFormat = depthFormat; + window->sampleCount = sampleCount; + window->windowWidth = width; + window->windowHeight = height; + window->windowSwapInterval = 1; + window->windowRefreshRate = 60.0f; + window->windowFullscreen = fullscreen; + window->windowActive = false; + window->windowExit = false; + window->lastSwapTime = GetTimeNanoseconds(); + + // Get a list of all available displays. + CGDirectDisplayID displays[32]; + CGDisplayCount displayCount = 0; + CGDisplayErr err = CGGetActiveDisplayList(32, displays, &displayCount); + if (err != CGDisplayNoErr) { + return false; + } + // Use the main display. + window->display = displays[0]; + window->desktopDisplayMode = CGDisplayCopyDisplayMode(window->display); + + // If fullscreen then switch to the best matching display mode. + if (window->windowFullscreen) { + CFArrayRef displayModes = CGDisplayCopyAllDisplayModes(window->display, NULL); + CFIndex displayModeCount = CFArrayGetCount(displayModes); + CGDisplayModeRef bestDisplayMode = nil; + size_t bestDisplayWidth = 0; + size_t bestDisplayHeight = 0; + float bestDisplayRefreshRate = 0; + size_t bestError = 0x7FFFFFFF; + for (CFIndex i = 0; i < displayModeCount; i++) { + CGDisplayModeRef mode = (CGDisplayModeRef)CFArrayGetValueAtIndex(displayModes, i); + + const size_t modeWidth = CGDisplayModeGetWidth(mode); + const size_t modeHeight = CGDisplayModeGetHeight(mode); + const double modeRefreshRate = CGDisplayModeGetRefreshRate(mode); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + CFStringRef modePixelEncoding = CGDisplayModeCopyPixelEncoding(mode); +#pragma GCC diagnostic pop + const bool modeBitsPerPixelIs32 = + (CFStringCompare(modePixelEncoding, CFSTR(IO32BitDirectPixels), 0) == kCFCompareEqualTo); + CFRelease(modePixelEncoding); + + if (modeBitsPerPixelIs32) { + const size_t dw = modeWidth - width; + const size_t dh = modeHeight - height; + const size_t error = dw * dw + dh * dh; + if (error < bestError) { + bestError = error; + bestDisplayMode = mode; + bestDisplayWidth = modeWidth; + bestDisplayHeight = modeHeight; + bestDisplayRefreshRate = (float)modeRefreshRate; + } + } + } + CGDisplayErr err = CGDisplaySetDisplayMode(window->display, bestDisplayMode, NULL); + if (err != CGDisplayNoErr) { + CFRelease(displayModes); + return false; + } + CFRelease(displayModes); + window->windowWidth = (int)bestDisplayWidth; + window->windowHeight = (int)bestDisplayHeight; + window->windowRefreshRate = (bestDisplayRefreshRate > 0.0f) ? bestDisplayRefreshRate : 60.0f; + } else { + const float desktopDisplayRefreshRate = (float)CGDisplayModeGetRefreshRate(window->desktopDisplayMode); + window->windowRefreshRate = (desktopDisplayRefreshRate > 0.0f) ? desktopDisplayRefreshRate : 60.0f; + } + + if (window->windowFullscreen) { + NSScreen *screen = [NSScreen mainScreen]; + NSRect screenRect = [screen frame]; + + window->nsView = [MyNSView alloc]; + [window->nsView initWithFrame:screenRect]; + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + const int style = NSBorderlessWindowMask; +#pragma GCC diagnostic pop + + window->nsWindow = [MyNSWindow alloc]; + [window->nsWindow initWithContentRect:screenRect styleMask:style backing:NSBackingStoreBuffered defer:NO screen:screen]; + [window->nsWindow setOpaque:YES]; + [window->nsWindow setLevel:NSMainMenuWindowLevel + 1]; + [window->nsWindow setContentView:window->nsView]; + [window->nsWindow makeMainWindow]; + [window->nsWindow makeKeyAndOrderFront:nil]; + [window->nsWindow makeFirstResponder:nil]; + } else { + NSScreen *screen = [NSScreen mainScreen]; + NSRect screenRect = [screen frame]; + + NSRect windowRect; + windowRect.origin.x = (screenRect.size.width - width) / 2; + windowRect.origin.y = (screenRect.size.height - height) / 2; + windowRect.size.width = width; + windowRect.size.height = height; + + window->nsView = [MyNSView alloc]; + [window->nsView initWithFrame:windowRect]; + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + // Fixed size window. + const int style = NSTitledWindowMask; // | NSClosableWindowMask | NSResizableWindowMask; +#pragma GCC diagnostic pop + + window->nsWindow = [MyNSWindow alloc]; + [window->nsWindow initWithContentRect:windowRect styleMask:style backing:NSBackingStoreBuffered defer:NO screen:screen]; + [window->nsWindow setTitle:@WINDOW_TITLE]; + [window->nsWindow setOpaque:YES]; + [window->nsWindow setContentView:window->nsView]; + [window->nsWindow makeMainWindow]; + [window->nsWindow makeKeyAndOrderFront:nil]; + [window->nsWindow makeFirstResponder:nil]; + } + + ksGpuDevice_Create(&window->device, instance, queueInfo); + ksGpuContext_CreateForSurface(&window->context, &window->device, queueIndex, colorFormat, depthFormat, sampleCount, + window->display); + + [window->context.nsContext setView:window->nsView]; + + ksGpuContext_SetCurrent(&window->context); + + // The color buffers are not cleared by default. + for (int i = 0; i < 2; i++) { + GL(glClearColor(0.0f, 0.0f, 0.0f, 1.0f)); + GL(glClear(GL_COLOR_BUFFER_BIT)); + CGLFlushDrawable(window->context.cglContext); + } + + return true; +} + +static bool ksGpuWindow_SupportedResolution(const int width, const int height) { + UNUSED_PARM(width); + UNUSED_PARM(height); + + return true; +} + +void ksGpuWindow_Exit(ksGpuWindow *window) { window->windowExit = true; } + +ksGpuWindowEvent ksGpuWindow_ProcessEvents(ksGpuWindow *window) { + [autoReleasePool release]; + autoReleasePool = [[NSAutoreleasePool alloc] init]; + + for (;;) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + NSEvent *event = + [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES]; + if (event == nil) { + break; + } + + if (event.type == NSKeyDown) { + unsigned short key = [event keyCode]; + if (key >= 0 && key < 256) { + window->input.keyInput[key] = true; + } + } else if (event.type == NSLeftMouseDown) { + NSPoint point = [event locationInWindow]; + window->input.mouseInput[MOUSE_LEFT] = true; + window->input.mouseInputX[MOUSE_LEFT] = point.x; + window->input.mouseInputY[MOUSE_LEFT] = point.y - 1; // change to zero-based + } else if (event.type == NSRightMouseDown) { + NSPoint point = [event locationInWindow]; + window->input.mouseInput[MOUSE_RIGHT] = true; + window->input.mouseInputX[MOUSE_RIGHT] = point.x; + window->input.mouseInputY[MOUSE_RIGHT] = point.y - 1; // change to zero-based + } +#pragma GCC diagnostic pop + + [NSApp sendEvent:event]; + } + + if (window->windowExit) { + return KS_GPU_WINDOW_EVENT_EXIT; + } + + if (window->windowActive == false) { + window->windowActive = true; + return KS_GPU_WINDOW_EVENT_ACTIVATED; + } + + return KS_GPU_WINDOW_EVENT_NONE; +} + +#elif defined(OS_APPLE_IOS) + +typedef enum { + KEY_A = 0x00, + KEY_B = 0x0B, + KEY_C = 0x08, + KEY_D = 0x02, + KEY_E = 0x0E, + KEY_F = 0x03, + KEY_G = 0x05, + KEY_H = 0x04, + KEY_I = 0x22, + KEY_J = 0x26, + KEY_K = 0x28, + KEY_L = 0x25, + KEY_M = 0x2E, + KEY_N = 0x2D, + KEY_O = 0x1F, + KEY_P = 0x23, + KEY_Q = 0x0C, + KEY_R = 0x0F, + KEY_S = 0x01, + KEY_T = 0x11, + KEY_U = 0x20, + KEY_V = 0x09, + KEY_W = 0x0D, + KEY_X = 0x07, + KEY_Y = 0x10, + KEY_Z = 0x06, + KEY_RETURN = 0x24, + KEY_TAB = 0x30, + KEY_ESCAPE = 0x35, + KEY_SHIFT_LEFT = 0x38, + KEY_CTRL_LEFT = 0x3B, + KEY_ALT_LEFT = 0x3A, + KEY_CURSOR_UP = 0x7E, + KEY_CURSOR_DOWN = 0x7D, + KEY_CURSOR_LEFT = 0x7B, + KEY_CURSOR_RIGHT = 0x7C +} ksKeyboardKey; + +typedef enum { MOUSE_LEFT = 0, MOUSE_RIGHT = 1 } ksMouseButton; + +static UIView *myUIView; +static UIWindow *myUIWindow; + +@interface MyUIView : UIView +@end + +@implementation MyUIView + +- (instancetype)initWithFrame:(CGRect)frameRect { + self = [super initWithFrame:frameRect]; + if (self) { + self.contentScaleFactor = UIScreen.mainScreen.nativeScale; + } + return self; +} + ++ (Class)layerClass { + return [CAEAGLLayer class]; +} + +@end + +@interface MyUIViewController : UIViewController +@end + +@implementation MyUIViewController + +- (UIInterfaceOrientationMask)supportedInterfaceOrientations { + return UIInterfaceOrientationMaskLandscape; +} + +- (BOOL)shouldAutorotate { + return TRUE; +} + +@end + +void ksGpuWindow_Destroy(ksGpuWindow *window) { + ksGpuContext_Destroy(&window->context); + ksGpuDevice_Destroy(&window->device); + window->uiWindow = nil; + window->uiView = nil; +} + +bool ksGpuWindow_Create(ksGpuWindow *window, ksDriverInstance *instance, const ksGpuQueueInfo *queueInfo, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, const int width, const int height, const bool fullscreen) { + memset(window, 0, sizeof(ksGpuWindow)); + + window->colorFormat = colorFormat; + window->depthFormat = depthFormat; + window->sampleCount = sampleCount; + window->windowWidth = width; + window->windowHeight = height; + window->windowSwapInterval = 1; + window->windowRefreshRate = 60.0f; + window->windowFullscreen = fullscreen; + window->windowActive = false; + window->windowExit = false; + window->lastSwapTime = GetTimeNanoseconds(); + window->uiView = myUIView; + window->uiWindow = myUIWindow; + + ksGpuDevice_Create(&window->device, instance, queueInfo); + // ksGpuContext_CreateForSurface(&window->context, &window->device, queueIndex, colorFormat, depthFormat, sampleCount, + // window->display); + + return true; +} + +static bool ksGpuWindow_SupportedResolution(const int width, const int height) { + UNUSED_PARM(width); + UNUSED_PARM(height); + + return true; +} + +void ksGpuWindow_Exit(ksGpuWindow *window) { window->windowExit = true; } + +ksGpuWindowEvent ksGpuWindow_ProcessEvents(ksGpuWindow *window) { + if (window->windowExit) { + return KS_GPU_WINDOW_EVENT_EXIT; + } + + if (window->windowActive == false) { + window->windowActive = true; + return KS_GPU_WINDOW_EVENT_ACTIVATED; + } + + return KS_GPU_WINDOW_EVENT_NONE; +} + +#elif defined(OS_ANDROID) + +typedef enum // https://developer.android.com/ndk/reference/group___input.html +{ KEY_A = AKEYCODE_A, + KEY_B = AKEYCODE_B, + KEY_C = AKEYCODE_C, + KEY_D = AKEYCODE_D, + KEY_E = AKEYCODE_E, + KEY_F = AKEYCODE_F, + KEY_G = AKEYCODE_G, + KEY_H = AKEYCODE_H, + KEY_I = AKEYCODE_I, + KEY_J = AKEYCODE_J, + KEY_K = AKEYCODE_K, + KEY_L = AKEYCODE_L, + KEY_M = AKEYCODE_M, + KEY_N = AKEYCODE_N, + KEY_O = AKEYCODE_O, + KEY_P = AKEYCODE_P, + KEY_Q = AKEYCODE_Q, + KEY_R = AKEYCODE_R, + KEY_S = AKEYCODE_S, + KEY_T = AKEYCODE_T, + KEY_U = AKEYCODE_U, + KEY_V = AKEYCODE_V, + KEY_W = AKEYCODE_W, + KEY_X = AKEYCODE_X, + KEY_Y = AKEYCODE_Y, + KEY_Z = AKEYCODE_Z, + KEY_RETURN = AKEYCODE_ENTER, + KEY_TAB = AKEYCODE_TAB, + KEY_ESCAPE = AKEYCODE_ESCAPE, + KEY_SHIFT_LEFT = AKEYCODE_SHIFT_LEFT, + KEY_CTRL_LEFT = AKEYCODE_CTRL_LEFT, + KEY_ALT_LEFT = AKEYCODE_ALT_LEFT, + KEY_CURSOR_UP = AKEYCODE_DPAD_UP, + KEY_CURSOR_DOWN = AKEYCODE_DPAD_DOWN, + KEY_CURSOR_LEFT = AKEYCODE_DPAD_LEFT, + KEY_CURSOR_RIGHT = AKEYCODE_DPAD_RIGHT } ksKeyboardKey; + +typedef enum { MOUSE_LEFT = 0, MOUSE_RIGHT = 1 } ksMouseButton; + +static void app_handle_cmd(struct android_app *app, int32_t cmd) { + ksGpuWindow *window = (ksGpuWindow *)app->userData; + + switch (cmd) { + // There is no APP_CMD_CREATE. The ANativeActivity creates the + // application thread from onCreate(). The application thread + // then calls android_main(). + case APP_CMD_START: { + Print("onStart()"); + Print(" APP_CMD_START"); + break; + } + case APP_CMD_RESUME: { + Print("onResume()"); + Print(" APP_CMD_RESUME"); + window->resumed = true; + break; + } + case APP_CMD_PAUSE: { + Print("onPause()"); + Print(" APP_CMD_PAUSE"); + window->resumed = false; + break; + } + case APP_CMD_STOP: { + Print("onStop()"); + Print(" APP_CMD_STOP"); + break; + } + case APP_CMD_DESTROY: { + Print("onDestroy()"); + Print(" APP_CMD_DESTROY"); + window->nativeWindow = NULL; + break; + } + case APP_CMD_INIT_WINDOW: { + Print("surfaceCreated()"); + Print(" APP_CMD_INIT_WINDOW"); + window->nativeWindow = app->window; + break; + } + case APP_CMD_TERM_WINDOW: { + Print("surfaceDestroyed()"); + Print(" APP_CMD_TERM_WINDOW"); + window->nativeWindow = NULL; + break; + } + } +} + +static int32_t app_handle_input(struct android_app *app, AInputEvent *event) { + ksGpuWindow *window = (ksGpuWindow *)app->userData; + + const int type = AInputEvent_getType(event); + if (type == AINPUT_EVENT_TYPE_KEY) { + int keyCode = AKeyEvent_getKeyCode(event); + const int action = AKeyEvent_getAction(event); + if (action == AKEY_EVENT_ACTION_DOWN) { + // Translate controller input to useful keys. + switch (keyCode) { + case AKEYCODE_BUTTON_A: + keyCode = AKEYCODE_Q; + break; + case AKEYCODE_BUTTON_B: + keyCode = AKEYCODE_W; + break; + case AKEYCODE_BUTTON_X: + keyCode = AKEYCODE_E; + break; + case AKEYCODE_BUTTON_Y: + keyCode = AKEYCODE_M; + break; + case AKEYCODE_BUTTON_START: + keyCode = AKEYCODE_L; + break; + case AKEYCODE_BUTTON_SELECT: + keyCode = AKEYCODE_ESCAPE; + break; + } + if (keyCode >= 0 && keyCode < 256) { + window->input.keyInput[keyCode] = true; + return 1; + } + } + return 0; + } else if (type == AINPUT_EVENT_TYPE_MOTION) { + const int source = AInputEvent_getSource(event); + // Events with source == AINPUT_SOURCE_TOUCHSCREEN come from the phone's builtin touch screen. + // Events with source == AINPUT_SOURCE_MOUSE come from the trackpad on the right side of the GearVR. + if (source == AINPUT_SOURCE_TOUCHSCREEN || source == AINPUT_SOURCE_MOUSE) { + const int action = AKeyEvent_getAction(event) & AMOTION_EVENT_ACTION_MASK; + const float x = AMotionEvent_getRawX(event, 0); + const float y = AMotionEvent_getRawY(event, 0); + if (action == AMOTION_EVENT_ACTION_UP) { + window->input.mouseInput[MOUSE_LEFT] = true; + window->input.mouseInputX[MOUSE_LEFT] = (int)x; + window->input.mouseInputY[MOUSE_LEFT] = (int)y; + return 1; + } + return 0; + } + } + return 0; +} + +void ksGpuWindow_Destroy(ksGpuWindow *window) { + ksGpuContext_Destroy(&window->context); + ksGpuDevice_Destroy(&window->device); + + if (window->display != 0) { + EGL(eglTerminate(window->display)); + window->display = 0; + } + + if (window->app != NULL) { + (*window->java.vm)->DetachCurrentThread(window->java.vm); + window->java.vm = NULL; + window->java.env = NULL; + window->java.activity = 0; + } +} + +static float GetDisplayRefreshRate(const Java_t *java) { + // Retrieve Context.WINDOW_SERVICE. + jclass contextClass = (*java->env)->FindClass(java->env, "android/content/Context"); + jfieldID field_WINDOW_SERVICE = (*java->env)->GetStaticFieldID(java->env, contextClass, "WINDOW_SERVICE", "Ljava/lang/String;"); + jobject WINDOW_SERVICE = (*java->env)->GetStaticObjectField(java->env, contextClass, field_WINDOW_SERVICE); + (*java->env)->DeleteLocalRef(java->env, contextClass); + + // WindowManager windowManager = (WindowManager) activity.getSystemService( Context.WINDOW_SERVICE ); + const jclass activityClass = (*java->env)->GetObjectClass(java->env, java->activity); + const jmethodID getSystemServiceMethodId = + (*java->env)->GetMethodID(java->env, activityClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); + const jobject windowManager = + (*java->env)->CallObjectMethod(java->env, java->activity, getSystemServiceMethodId, WINDOW_SERVICE); + (*java->env)->DeleteLocalRef(java->env, activityClass); + + // Display display = windowManager.getDefaultDisplay(); + const jclass windowManagerClass = (*java->env)->GetObjectClass(java->env, windowManager); + const jmethodID getDefaultDisplayMethodId = + (*java->env)->GetMethodID(java->env, windowManagerClass, "getDefaultDisplay", "()Landroid/view/Display;"); + const jobject display = (*java->env)->CallObjectMethod(java->env, windowManager, getDefaultDisplayMethodId); + (*java->env)->DeleteLocalRef(java->env, windowManagerClass); + + // float refreshRate = display.getRefreshRate(); + const jclass displayClass = (*java->env)->GetObjectClass(java->env, display); + const jmethodID getRefreshRateMethodId = (*java->env)->GetMethodID(java->env, displayClass, "getRefreshRate", "()F"); + const float refreshRate = (*java->env)->CallFloatMethod(java->env, display, getRefreshRateMethodId); + (*java->env)->DeleteLocalRef(java->env, displayClass); + + (*java->env)->DeleteLocalRef(java->env, display); + (*java->env)->DeleteLocalRef(java->env, windowManager); + (*java->env)->DeleteLocalRef(java->env, WINDOW_SERVICE); + + return refreshRate; +} + +struct android_app *global_app; + +bool ksGpuWindow_Create(ksGpuWindow *window, ksDriverInstance *instance, const ksGpuQueueInfo *queueInfo, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, const int width, const int height, const bool fullscreen) { + memset(window, 0, sizeof(ksGpuWindow)); + + window->colorFormat = colorFormat; + window->depthFormat = depthFormat; + window->sampleCount = sampleCount; + window->windowWidth = width; + window->windowHeight = height; + window->windowSwapInterval = 1; + window->windowRefreshRate = 60.0f; + window->windowFullscreen = true; + window->windowActive = false; + window->windowExit = false; + window->lastSwapTime = GetTimeNanoseconds(); + + window->app = global_app; + window->nativeWindow = NULL; + window->resumed = false; + + if (window->app != NULL) { + window->app->userData = window; + window->app->onAppCmd = app_handle_cmd; + window->app->onInputEvent = app_handle_input; + window->java.vm = window->app->activity->vm; + (*window->java.vm)->AttachCurrentThread(window->java.vm, &window->java.env, NULL); + window->java.activity = window->app->activity->clazz; + + window->windowRefreshRate = GetDisplayRefreshRate(&window->java); + + // Keep the display on and bright. + // Also make sure there is only one "HWC" next to the "FB TARGET" (adb shell dumpsys SurfaceFlinger). + ANativeActivity_setWindowFlags(window->app->activity, AWINDOW_FLAG_FULLSCREEN | AWINDOW_FLAG_KEEP_SCREEN_ON, 0); + } + + window->display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + EGL(eglInitialize(window->display, &window->majorVersion, &window->minorVersion)); + + ksGpuDevice_Create(&window->device, instance, queueInfo); + ksGpuContext_CreateForSurface(&window->context, &window->device, queueIndex, colorFormat, depthFormat, sampleCount, + window->display); + ksGpuContext_SetCurrent(&window->context); + + GlInitExtensions(); + + return true; +} + +static bool ksGpuWindow_SupportedResolution(const int width, const int height) { + UNUSED_PARM(width); + UNUSED_PARM(height); + + // Assume the HWC can handle any window size. + return true; +} + +void ksGpuWindow_Exit(ksGpuWindow *window) { + // Call finish() on the activity and ksGpuWindow_ProcessEvents will handle the rest. + ANativeActivity_finish(window->app->activity); +} + +ksGpuWindowEvent ksGpuWindow_ProcessEvents(ksGpuWindow *window) { + if (window->app == NULL) { + return KS_GPU_WINDOW_EVENT_NONE; + } + + const bool windowWasActive = window->windowActive; + + for (;;) { + int events; + struct android_poll_source *source; + const int timeoutMilliseconds = (window->windowActive == false && window->app->destroyRequested == 0) ? -1 : 0; + if (ALooper_pollAll(timeoutMilliseconds, NULL, &events, (void **)&source) < 0) { + break; + } + + if (source != NULL) { + source->process(window->app, source); + } + + if (window->nativeWindow != NULL && window->context.mainSurface == window->context.tinySurface) { + Print(" ANativeWindow_setBuffersGeometry %d x %d", window->windowWidth, window->windowHeight); + ANativeWindow_setBuffersGeometry(window->nativeWindow, window->windowWidth, window->windowHeight, 0); + + const EGLint surfaceAttribs[] = {EGL_NONE}; + Print(" mainSurface = eglCreateWindowSurface( nativeWindow )"); + window->context.mainSurface = + eglCreateWindowSurface(window->context.display, window->context.config, window->nativeWindow, surfaceAttribs); + if (window->context.mainSurface == EGL_NO_SURFACE) { + Error(" eglCreateWindowSurface() failed: %s", EglErrorString(eglGetError())); + return KS_GPU_WINDOW_EVENT_EXIT; + } + Print(" eglMakeCurrent( mainSurface )"); + EGL(eglMakeCurrent(window->context.display, window->context.mainSurface, window->context.mainSurface, + window->context.context)); + + eglQuerySurface(window->context.display, window->context.mainSurface, EGL_WIDTH, &window->windowWidth); + eglQuerySurface(window->context.display, window->context.mainSurface, EGL_HEIGHT, &window->windowHeight); + } + + if (window->resumed != false && window->nativeWindow != NULL) { + window->windowActive = true; + } else { + window->windowActive = false; + } + + if (window->nativeWindow == NULL && window->context.mainSurface != window->context.tinySurface) { + Print(" eglMakeCurrent( tinySurface )"); + EGL(eglMakeCurrent(window->context.display, window->context.tinySurface, window->context.tinySurface, + window->context.context)); + Print(" eglDestroySurface( mainSurface )"); + EGL(eglDestroySurface(window->context.display, window->context.mainSurface)); + window->context.mainSurface = window->context.tinySurface; + } + } + + if (window->app->destroyRequested != 0) { + return KS_GPU_WINDOW_EVENT_EXIT; + } + if (windowWasActive != window->windowActive) { + return (window->windowActive) ? KS_GPU_WINDOW_EVENT_ACTIVATED : KS_GPU_WINDOW_EVENT_DEACTIVATED; + } + return KS_GPU_WINDOW_EVENT_NONE; +} + +#endif + +void ksGpuWindow_SwapInterval(ksGpuWindow *window, int swapInterval) { + if (swapInterval != window->windowSwapInterval) { +#if defined(OS_WINDOWS) + wglSwapIntervalEXT(swapInterval); +#elif defined(OS_LINUX_XLIB) + glXSwapIntervalEXT(window->context.xDisplay, window->xWindow, swapInterval); +#elif defined(OS_LINUX_XCB) + xcb_dri2_swap_interval(window->context.connection, window->context.glxDrawable, swapInterval); +#elif defined(OS_LINUX_XCB_GLX) + glXSwapIntervalEXT(window->context.xDisplay, window->glxWindow, swapInterval); +#elif defined(OS_APPLE_MACOS) + CGLSetParameter(window->context.cglContext, kCGLCPSwapInterval, &swapInterval); +#elif defined(OS_ANDROID) || defined(OS_LINUX_WAYLAND) + EGL(eglSwapInterval(window->context.display, swapInterval)); +#endif + window->windowSwapInterval = swapInterval; + } +} + +void ksGpuWindow_SwapBuffers(ksGpuWindow *window) { +#if defined(OS_WINDOWS) + SwapBuffers(window->context.hDC); +#elif defined(OS_LINUX_XLIB) + glXSwapBuffers(window->context.xDisplay, window->xWindow); +#elif defined(OS_LINUX_XCB) + xcb_glx_swap_buffers(window->context.connection, window->context.glxContextTag, window->glxWindow); +#elif defined(OS_LINUX_XCB_GLX) + glXSwapBuffers(window->context.xDisplay, window->glxWindow); +#elif defined(OS_APPLE_MACOS) + CGLFlushDrawable(window->context.cglContext); +#elif defined(OS_ANDROID) || defined(OS_LINUX_WAYLAND) + EGL(eglSwapBuffers(window->context.display, window->context.mainSurface)); +#endif + + ksNanoseconds newTimeNanoseconds = GetTimeNanoseconds(); + + // Even with smoothing, this is not particularly accurate. + const float frameTimeNanoseconds = 1000.0f * 1000.0f * 1000.0f / window->windowRefreshRate; + const float deltaTimeNanoseconds = (float)newTimeNanoseconds - window->lastSwapTime - frameTimeNanoseconds; + if (fabsf(deltaTimeNanoseconds) < frameTimeNanoseconds * 0.75f) { + newTimeNanoseconds = (ksNanoseconds)(window->lastSwapTime + frameTimeNanoseconds + 0.025f * deltaTimeNanoseconds); + } + // const float smoothDeltaNanoseconds = (float)( newTimeNanoseconds - window->lastSwapTime ); + // Print( "frame delta = %1.3f (error = %1.3f)\n", smoothDeltaNanoseconds * 1e-6f, + // ( smoothDeltaNanoseconds - frameTimeNanoseconds ) * 1e-6f ); + window->lastSwapTime = newTimeNanoseconds; +} + +ksNanoseconds ksGpuWindow_GetNextSwapTimeNanoseconds(ksGpuWindow *window) { + const float frameTimeNanoseconds = 1000.0f * 1000.0f * 1000.0f / window->windowRefreshRate; + return window->lastSwapTime + (ksNanoseconds)(frameTimeNanoseconds); +} + +ksNanoseconds ksGpuWindow_GetFrameTimeNanoseconds(ksGpuWindow *window) { + const float frameTimeNanoseconds = 1000.0f * 1000.0f * 1000.0f / window->windowRefreshRate; + return (ksNanoseconds)(frameTimeNanoseconds); +} + +void ksGpuWindow_DelayBeforeSwap(ksGpuWindow *window, const ksNanoseconds delay) { + UNUSED_PARM(window); + UNUSED_PARM(delay); + + // FIXME: this appears to not only stall the calling context but also other contexts. + /* + #if defined( OS_WINDOWS ) + if ( wglDelayBeforeSwapNV != NULL ) + { + wglDelayBeforeSwapNV( window->hDC, delay * 1e-6f ); + } + #elif defined( OS_LINUX_XLIB ) + if ( glXDelayBeforeSwapNV != NULL ) + { + glXDelayBeforeSwapNV( window->hDC, delay * 1e-6f ); + } + #endif + */ +} + +static bool ksGpuWindowInput_ConsumeKeyboardKey(ksGpuWindowInput *input, const ksKeyboardKey key) { + if (input->keyInput[key]) { + input->keyInput[key] = false; + return true; + } + return false; +} + +static bool ksGpuWindowInput_ConsumeMouseButton(ksGpuWindowInput *input, const ksMouseButton button) { + if (input->mouseInput[button]) { + input->mouseInput[button] = false; + return true; + } + return false; +} + +static bool ksGpuWindowInput_CheckKeyboardKey(ksGpuWindowInput *input, const ksKeyboardKey key) { + return (input->keyInput[key] != false); +} + +/* +================================================================================================================================ + +GPU timer. + +================================================================================================================================ +*/ + +void ksGpuTimer_Create(ksGpuContext *context, ksGpuTimer *timer) { + UNUSED_PARM(context); + + if (glExtensions.timer_query) { + GL(glGenQueries(KS_GPU_TIMER_FRAMES_DELAYED, timer->beginQueries)); + GL(glGenQueries(KS_GPU_TIMER_FRAMES_DELAYED, timer->endQueries)); + timer->queryIndex = 0; + timer->gpuTime = 0; + } +} + +void ksGpuTimer_Destroy(ksGpuContext *context, ksGpuTimer *timer) { + UNUSED_PARM(context); + + if (glExtensions.timer_query) { + GL(glDeleteQueries(KS_GPU_TIMER_FRAMES_DELAYED, timer->beginQueries)); + GL(glDeleteQueries(KS_GPU_TIMER_FRAMES_DELAYED, timer->endQueries)); + } +} + +ksNanoseconds ksGpuTimer_GetNanoseconds(ksGpuTimer *timer) { + if (glExtensions.timer_query) { + return timer->gpuTime; + } else { + return 0; + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/gfxwrapper_opengl.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/gfxwrapper_opengl.h new file mode 100644 index 0000000..a7b999a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/gfxwrapper_opengl.h @@ -0,0 +1,1055 @@ +/* +================================================================================================ + +Description : Convenient wrapper for the OpenGL API. +Author : J.M.P. van Waveren +Date : 12/21/2014 +Language : C99 +Format : Real tabs with the tab size equal to 4 spaces. +Copyright : Copyright (c) 2016 Oculus VR, LLC. All Rights reserved. + : Portions copyright (c) 2016 The Brenwill Workshop Ltd. All Rights reserved. + + +LICENSE +======= + +Copyright (c) 2016 Oculus VR, LLC. +Portions of macOS, iOS, functionality copyright (c) 2016 The Brenwill Workshop Ltd. + +SPDX-License-Identifier: Apache-2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +IMPLEMENTATION +============== + +The code is written in an object-oriented style with a focus on minimizing state +and side effects. The majority of the functions manipulate self-contained objects +without modifying any global state (except for OpenGL state). The types +introduced in this file have no circular dependencies, and there are no forward +declarations. + +Even though an object-oriented style is used, the code is written in straight C99 for +maximum portability and readability. To further improve portability and to simplify +compilation, all source code is in a single file without any dependencies on third- +party code or non-standard libraries. The code does not use an OpenGL loading library +like GLEE, GLEW, GL3W, or an OpenGL toolkit like GLUT, FreeGLUT, GLFW, etc. Instead, +the code provides direct access to window and context creation for driver extension work. + +The code is written against version 4.3 of the Core Profile OpenGL Specification, +and version 3.1 of the OpenGL ES Specification. + +Supported platforms are: + + - Microsoft Windows 7 or later + - Ubuntu Linux 14.04 or later + - Apple macOS 10.11 or later + - Apple iOS 9.0 or later + - Android 5.0 or later + + +GRAPHICS API WRAPPER +==================== + +The code wraps the OpenGL API with a convenient wrapper that takes care of a +lot of the OpenGL intricacies. This wrapper does not expose the full OpenGL API +but can be easily extended to support more features. Some of the current +limitations are: + +- The wrapper is setup for forward rendering with a single render pass. This + can be easily extended if more complex rendering algorithms are desired. + +- A pipeline can only use 256 bytes worth of plain integer and floating-point + uniforms, including vectors and matrices. If more uniforms are needed then + it is advised to use a uniform buffer, which is the preferred approach for + exposing large amounts of data anyway. + +- Graphics programs currently consist of only a vertex and fragment shader. + This can be easily extended if there is a need for geometry shaders etc. + + +KNOWN ISSUES +============ + +OS : Apple Mac OS X 10.9.5 +GPU : Geforce GT 750M +DRIVER : NVIDIA 310.40.55b01 +----------------------------------------------- +- glGetQueryObjectui64v( query, GL_QUERY_RESULT, &time ) always returns zero for a timer query. +- glFlush() after a glFenceSync() stalls the CPU for many milliseconds. +- Creating a context fails when the share context is current on another thread. + +OS : Android 6.0.1 +GPU : Adreno (TM) 530 +DRIVER : OpenGL ES 3.1 V@145.0 +----------------------------------------------- +- Enabling OVR_multiview hangs the GPU. + + +WORK ITEMS +========== + +- Implement WGL, GLX and NSOpenGL equivalents of EGL_IMG_context_priority. +- Implement an extension that provides accurate display refresh timing (WGL_NV_delay_before_swap, D3DKMTGetScanLine). +- Implement an OpenGL extension that allows rendering directly to the front buffer. +- Implement an OpenGL extension that allows a compute shader to directly write to the front/back buffer images +(WGL_AMDX_drawable_view). +- Improve GPU task switching granularity. + +================================================================================================ +*/ + +#if !defined(KSGRAPHICSWRAPPER_OPENGL_H) +#define KSGRAPHICSWRAPPER_OPENGL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64) +#define OS_WINDOWS +#elif defined(__ANDROID__) +#define OS_ANDROID +#elif defined(__APPLE__) +#define OS_APPLE +#include +#if __IPHONE_OS_VERSION_MAX_ALLOWED +#define OS_APPLE_IOS +#elif __MAC_OS_X_VERSION_MAX_ALLOWED +#define OS_APPLE_MACOS +#endif +#elif defined(__linux__) +#define OS_LINUX +#else +#error "unknown platform" +#endif + +/* +================================ +Platform headers / declarations +================================ +*/ + +#if defined(OS_WINDOWS) + +#define XR_USE_PLATFORM_WIN32 1 + +#if !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#if defined(_MSC_VER) +#pragma warning(disable : 4204) // nonstandard extension used : non-constant aggregate initializer +#pragma warning(disable : 4221) // nonstandard extension used: 'layers': cannot be initialized using address of automatic variable + // 'layerProjection' +#pragma warning(disable : 4255) // '' : no function prototype given: converting '()' to '(void)' +#pragma warning(disable : 4668) // '__cplusplus' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif' +#pragma warning(disable : 4710) // 'int printf(const char *const ,...)': function not inlined +#pragma warning(disable : 4711) // function '' selected for automatic inline expansion +#pragma warning(disable : 4738) // storing 32-bit float result in memory, possible loss of performance +#pragma warning(disable : 4820) // '' : 'X' bytes padding added after data member '' +#pragma warning(disable : 4505) // unreferenced local function has been removed +#endif + +#if _MSC_VER >= 1900 +#pragma warning(disable : 4464) // relative include path contains '..' +#pragma warning(disable : 4774) // 'printf' : format string expected in argument 1 is not a string literal +#endif + +#define OPENGL_VERSION_MAJOR 4 +#define OPENGL_VERSION_MINOR 3 +#define GLSL_VERSION "430" +#define SPIRV_VERSION "99" +#define USE_SYNC_OBJECT 0 // 0 = GLsync, 1 = EGLSyncKHR, 2 = storage buffer + +#include +#include +#define GL_EXT_color_subtable +#include +#include +#include + +#define GRAPHICS_API_OPENGL 1 +#define OUTPUT_PATH "" + +#define __thread __declspec(thread) + +#elif defined(OS_LINUX) + +#define OPENGL_VERSION_MAJOR 4 +#define OPENGL_VERSION_MINOR 5 +#define GLSL_VERSION "430" +#define SPIRV_VERSION "99" +#define USE_SYNC_OBJECT 0 // 0 = GLsync, 1 = EGLSyncKHR, 2 = storage buffer + +#if !defined(_XOPEN_SOURCE) +#if __STDC_VERSION__ >= 199901L +#define _XOPEN_SOURCE 600 +#else +#define _XOPEN_SOURCE 500 +#endif +#endif + +#include // for timespec +#include // for gettimeofday() +#if !defined(__USE_UNIX98) +#define __USE_UNIX98 1 // for pthread_mutexattr_settype +#endif +#include // for pthread_create() etc. +#include // for memalign +#if defined(OS_LINUX_XLIB) +#define XR_USE_PLATFORM_XLIB 1 + +#include +#include +#include // for fullscreen video mode +#include // for resolution changes +#include + +#elif defined(OS_LINUX_XCB) || defined(OS_LINUX_XCB_GLX) +#define XR_USE_PLATFORM_XCB 1 + +#include +#include +#include +#include +#include +#include +#include +#include + +#elif defined(OS_LINUX_WAYLAND) +#define XR_USE_PLATFORM_WAYLAND 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "xdg-shell-unstable-v6.h" + +#endif + +#include + +#define GRAPHICS_API_OPENGL 1 +#define OUTPUT_PATH "" + +#if !defined(__USE_GNU) +// These prototypes are only included when __USE_GNU is defined but that causes other compile errors. +extern int pthread_setname_np(pthread_t __target_thread, __const char *__name); +extern int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset); +#endif // !__USE_GNU + +#pragma GCC diagnostic ignored "-Wunused-function" + +#elif defined(OS_APPLE_MACOS) + +// Apple is still at OpenGL 4.1 +#define OPENGL_VERSION_MAJOR 4 +#define OPENGL_VERSION_MINOR 1 +#define GLSL_VERSION "410" +#define SPIRV_VERSION "99" +#define USE_SYNC_OBJECT 0 // 0 = GLsync, 1 = EGLSyncKHR, 2 = storage buffer +#define XR_USE_PLATFORM_MACOS 1 + +#include +#include +#include +#include +#include +#define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED +#include +#include +#include +#include + +#undef MAX +#undef MIN + +#define GRAPHICS_API_OPENGL 1 +#define OUTPUT_PATH "" + +// Undocumented CGS and CGL +typedef void *CGSConnectionID; +typedef int CGSWindowID; +typedef int CGSSurfaceID; + +CGLError CGLSetSurface(CGLContextObj ctx, CGSConnectionID cid, CGSWindowID wid, CGSSurfaceID sid); +CGLError CGLGetSurface(CGLContextObj ctx, CGSConnectionID *cid, CGSWindowID *wid, CGSSurfaceID *sid); +CGLError CGLUpdateContext(CGLContextObj ctx); + +#pragma clang diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wunused-const-variable" + +#elif defined(OS_APPLE_IOS) + +// Assume iOS 7+ which is GLES 3.0 +#define OPENGL_VERSION_MAJOR 3 +#define OPENGL_VERSION_MINOR 0 +#define GLSL_VERSION "300 es" +#define SPIRV_VERSION "99" +#define USE_SYNC_OBJECT 0 // 0 = GLsync, 1 = EGLSyncKHR, 2 = storage buffer +#define XR_USE_PLATFORM_IOS 1 + +#import +#import +#import +#import +#import +#include + +#define GRAPHICS_API_OPENGL_ES 1 + +#elif defined(OS_ANDROID) + +#define OPENGL_VERSION_MAJOR 3 +#define OPENGL_VERSION_MINOR 2 +#define GLSL_VERSION "320 es" +#define SPIRV_VERSION "99" +#define USE_SYNC_OBJECT 1 // 0 = GLsync, 1 = EGLSyncKHR, 2 = storage buffer + +#include +#include +#include // for opendir/closedir +#include +#include // for memalign +#include // for dlopen +#include // for prctl( PR_SET_NAME ) +#include // for gettid +#include // for syscall +#include // for __android_log_print +#include // for AKEYCODE_ etc. +#include // for AWINDOW_FLAG_KEEP_SCREEN_ON +#include // for native window JNI +#include +#include +#include +#include +#include +#include +#if OPENGL_VERSION_MAJOR == 3 +#if OPENGL_VERSION_MINOR == 1 +#include +#elif OPENGL_VERSION_MINOR == 2 +#include +#endif +#endif +#include +#include + +#define GRAPHICS_API_OPENGL_ES 1 +#define OUTPUT_PATH "/sdcard/" + +#pragma GCC diagnostic ignored "-Wunused-function" + +typedef struct { + JavaVM *vm; // Java Virtual Machine + JNIEnv *env; // Thread specific environment + jobject activity; // Java activity object +} Java_t; + +#endif + +/* +================================ +Common headers +================================ +*/ + +#include +#include +#include +#include +#include +#include +#include +#include // for memset +#include // for EBUSY, ETIMEDOUT etc. +#include // for isspace, isdigit + +#include +#include +#include +#include + +/* +================================ +Common defines +================================ +*/ + +#define UNUSED_PARM(x) \ + { (void)(x); } +#define ARRAY_SIZE(a) (sizeof((a)) / sizeof((a)[0])) +#define OFFSETOF_MEMBER(type, member) (size_t) & ((type *)0)->member +#define SIZEOF_MEMBER(type, member) sizeof(((type *)0)->member) +#define BIT(x) (1 << (x)) +#define ROUNDUP(x, granularity) (((x) + (granularity)-1) & ~((granularity)-1)) +#ifndef MAX +#define MAX(x, y) ((x > y) ? (x) : (y)) +#endif +#ifndef MIN +#define MIN(x, y) ((x < y) ? (x) : (y)) +#endif +#define CLAMP(x, min, max) (((x) < (min)) ? (min) : (((x) > (max)) ? (max) : (x))) +#define STRINGIFY_EXPANDED(a) #a +#define STRINGIFY(a) STRINGIFY_EXPANDED(a) + +#define APPLICATION_NAME "OpenGL SI" +#define WINDOW_TITLE "OpenGL SI" + +#define PROGRAM(name) name##GLSL + +#define GLSL_EXTENSIONS "#extension GL_EXT_shader_io_blocks : enable\n" +#define GL_FINISH_SYNC 1 + +#if defined(OS_ANDROID) +#define ES_HIGHP "highp" // GLSL "310 es" requires a precision qualifier on a image2D +#else +#define ES_HIGHP "" // GLSL "430" disallows a precision qualifier on a image2D +#endif + +void GlInitExtensions(); + +/* +================================================================================================================================ + +OpenGL extensions. + +================================================================================================================================ +*/ + +/* +================================ +Multi-view support +================================ +*/ + +#if !defined(GL_OVR_multiview) +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 +#define GL_MAX_VIEWS_OVR 0x9631 + +typedef void (*PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, + GLint baseViewIndex, GLsizei numViews); +#endif + +/* +================================ +Multi-sampling support +================================ +*/ + +#if !defined(GL_EXT_framebuffer_multisample) +typedef void (*PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, + GLsizei height); +#endif + +#if !defined(GL_EXT_multisampled_render_to_texture) +typedef void (*PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, + GLint level, GLsizei samples); +#endif + +#if !defined(GL_OVR_multiview_multisampled_render_to_texture) +typedef void (*PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, + GLsizei samples, GLint baseViewIndex, GLsizei numViews); +#endif + +#if defined(OS_WINDOWS) || defined(OS_LINUX) + +extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; +extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; +extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; +extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; +extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; +extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; +extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; +extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer; +extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; +extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; +extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; +extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; +extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; +extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; +extern PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; +extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR; +extern PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC glFramebufferTextureMultisampleMultiviewOVR; +extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; +extern PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glCheckNamedFramebufferStatus; + +extern PFNGLGENBUFFERSPROC glGenBuffers; +extern PFNGLDELETEBUFFERSPROC glDeleteBuffers; +extern PFNGLBINDBUFFERPROC glBindBuffer; +extern PFNGLBINDBUFFERBASEPROC glBindBufferBase; +extern PFNGLBUFFERDATAPROC glBufferData; +extern PFNGLBUFFERSUBDATAPROC glBufferSubData; +extern PFNGLBUFFERSTORAGEPROC glBufferStorage; +extern PFNGLMAPBUFFERPROC glMapBuffer; +extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange; +extern PFNGLUNMAPBUFFERPROC glUnmapBuffer; + +extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays; +extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays; +extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray; +extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer; +extern PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor; +extern PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray; +extern PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray; + +#if defined(OS_WINDOWS) +extern PFNGLACTIVETEXTUREPROC glActiveTexture; +extern PFNGLTEXIMAGE3DPROC glTexImage3D; +extern PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D; +extern PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D; +extern PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D; +extern PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D; +extern PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D; +#endif +extern PFNGLTEXSTORAGE2DPROC glTexStorage2D; +extern PFNGLTEXSTORAGE3DPROC glTexStorage3D; +extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample; +extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample; +extern PFNGLTEXSTORAGE2DMULTISAMPLEPROC glTexStorage2DMultisample; +extern PFNGLTEXSTORAGE3DMULTISAMPLEPROC glTexStorage3DMultisample; +extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap; +extern PFNGLBINDIMAGETEXTUREPROC glBindImageTexture; + +extern PFNGLCREATEPROGRAMPROC glCreateProgram; +extern PFNGLDELETEPROGRAMPROC glDeleteProgram; +extern PFNGLCREATESHADERPROC glCreateShader; +extern PFNGLDELETESHADERPROC glDeleteShader; +extern PFNGLSHADERSOURCEPROC glShaderSource; +extern PFNGLCOMPILESHADERPROC glCompileShader; +extern PFNGLGETSHADERIVPROC glGetShaderiv; +extern PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog; +extern PFNGLUSEPROGRAMPROC glUseProgram; +extern PFNGLATTACHSHADERPROC glAttachShader; +extern PFNGLLINKPROGRAMPROC glLinkProgram; +extern PFNGLGETPROGRAMIVPROC glGetProgramiv; +extern PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog; +extern PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation; +extern PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation; +extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; +extern PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex; +extern PFNGLGETPROGRAMRESOURCEINDEXPROC glGetProgramResourceIndex; +extern PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding; +extern PFNGLSHADERSTORAGEBLOCKBINDINGPROC glShaderStorageBlockBinding; +extern PFNGLPROGRAMUNIFORM1IPROC glProgramUniform1i; +extern PFNGLUNIFORM1IPROC glUniform1i; +extern PFNGLUNIFORM1IVPROC glUniform1iv; +extern PFNGLUNIFORM2IVPROC glUniform2iv; +extern PFNGLUNIFORM3IVPROC glUniform3iv; +extern PFNGLUNIFORM4IVPROC glUniform4iv; +extern PFNGLUNIFORM1FPROC glUniform1f; +extern PFNGLUNIFORM1FVPROC glUniform1fv; +extern PFNGLUNIFORM2FVPROC glUniform2fv; +extern PFNGLUNIFORM3FVPROC glUniform3fv; +extern PFNGLUNIFORM4FVPROC glUniform4fv; +extern PFNGLUNIFORMMATRIX2FVPROC glUniformMatrix2fv; +extern PFNGLUNIFORMMATRIX2X3FVPROC glUniformMatrix2x3fv; +extern PFNGLUNIFORMMATRIX2X4FVPROC glUniformMatrix2x4fv; +extern PFNGLUNIFORMMATRIX3X2FVPROC glUniformMatrix3x2fv; +extern PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv; +extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv; +extern PFNGLUNIFORMMATRIX4X2FVPROC glUniformMatrix4x2fv; +extern PFNGLUNIFORMMATRIX4X3FVPROC glUniformMatrix4x3fv; +extern PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv; + +extern PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced; +extern PFNGLDISPATCHCOMPUTEPROC glDispatchCompute; +extern PFNGLMEMORYBARRIERPROC glMemoryBarrier; + +extern PFNGLGENQUERIESPROC glGenQueries; +extern PFNGLDELETEQUERIESPROC glDeleteQueries; +extern PFNGLISQUERYPROC glIsQuery; +extern PFNGLBEGINQUERYPROC glBeginQuery; +extern PFNGLENDQUERYPROC glEndQuery; +extern PFNGLQUERYCOUNTERPROC glQueryCounter; +extern PFNGLGETQUERYIVPROC glGetQueryiv; +extern PFNGLGETQUERYOBJECTIVPROC glGetQueryObjectiv; +extern PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv; +extern PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v; +extern PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v; + +extern PFNGLFENCESYNCPROC glFenceSync; +extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync; +extern PFNGLDELETESYNCPROC glDeleteSync; +extern PFNGLISSYNCPROC glIsSync; + +extern PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate; +extern PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate; + +extern PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl; +extern PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback; + +#if defined(OS_WINDOWS) +extern PFNGLBLENDCOLORPROC glBlendColor; +extern PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB; +extern PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; +extern PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT; +extern PFNWGLDELAYBEFORESWAPNVPROC wglDelayBeforeSwapNV; +#elif defined(OS_LINUX) && !defined(OS_LINUX_WAYLAND) +extern PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB; +extern PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT; +extern PFNGLXDELAYBEFORESWAPNVPROC glXDelayBeforeSwapNV; +#endif + +#elif defined(OS_APPLE_MACOS) + +extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR; +extern PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC glFramebufferTextureMultisampleMultiviewOVR; +extern PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; +extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; + +#elif defined(OS_ANDROID) + +// GL_EXT_disjoint_timer_query without _EXT +#if !defined(GL_TIMESTAMP) +#define GL_QUERY_COUNTER_BITS GL_QUERY_COUNTER_BITS_EXT +#define GL_TIME_ELAPSED GL_TIME_ELAPSED_EXT +#define GL_TIMESTAMP GL_TIMESTAMP_EXT +#define GL_GPU_DISJOINT GL_GPU_DISJOINT_EXT +#endif + +// GL_EXT_buffer_storage without _EXT +#if !defined(GL_BUFFER_STORAGE_FLAGS) +#define GL_MAP_READ_BIT 0x0001 // GL_MAP_READ_BIT_EXT +#define GL_MAP_WRITE_BIT 0x0002 // GL_MAP_WRITE_BIT_EXT +#define GL_MAP_PERSISTENT_BIT 0x0040 // GL_MAP_PERSISTENT_BIT_EXT +#define GL_MAP_COHERENT_BIT 0x0080 // GL_MAP_COHERENT_BIT_EXT +#define GL_DYNAMIC_STORAGE_BIT 0x0100 // GL_DYNAMIC_STORAGE_BIT_EXT +#define GL_CLIENT_STORAGE_BIT 0x0200 // GL_CLIENT_STORAGE_BIT_EXT +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 // GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F // GL_BUFFER_IMMUTABLE_STORAGE_EXT +#define GL_BUFFER_STORAGE_FLAGS 0x8220 // GL_BUFFER_STORAGE_FLAGS_EXT +#endif + +typedef void(GL_APIENTRY *PFNGLBUFFERSTORAGEEXTPROC)(GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void(GL_APIENTRY *PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, + GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +// EGL_KHR_fence_sync, GL_OES_EGL_sync, VG_KHR_EGL_sync +extern PFNEGLCREATESYNCKHRPROC eglCreateSyncKHR; +extern PFNEGLDESTROYSYNCKHRPROC eglDestroySyncKHR; +extern PFNEGLCLIENTWAITSYNCKHRPROC eglClientWaitSyncKHR; +extern PFNEGLGETSYNCATTRIBKHRPROC eglGetSyncAttribKHR; + +// GL_EXT_disjoint_timer_query +extern PFNGLQUERYCOUNTEREXTPROC glQueryCounter; +extern PFNGLGETQUERYOBJECTI64VEXTPROC glGetQueryObjecti64v; +extern PFNGLGETQUERYOBJECTUI64VEXTPROC glGetQueryObjectui64v; + +// GL_EXT_buffer_storage +extern PFNGLBUFFERSTORAGEEXTPROC glBufferStorage; + +// GL_OVR_multiview +extern PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR; + +// GL_EXT_multisampled_render_to_texture +extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; +extern PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; + +// GL_OVR_multiview_multisampled_render_to_texture +extern PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC glFramebufferTextureMultisampleMultiviewOVR; + +#ifndef GL_ES_VERSION_3_2 +extern PFNGLTEXSTORAGE3DMULTISAMPLEPROC glTexStorage3DMultisample; +#endif + +#if !defined(EGL_OPENGL_ES3_BIT) +#define EGL_OPENGL_ES3_BIT 0x0040 +#endif + +// GL_EXT_texture_cube_map_array +#if !defined(GL_TEXTURE_CUBE_MAP_ARRAY) +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#endif + +// GL_EXT_texture_filter_anisotropic +#if !defined(GL_TEXTURE_MAX_ANISOTROPY_EXT) +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + +// GL_EXT_texture_border_clamp or GL_OES_texture_border_clamp +#if !defined(GL_CLAMP_TO_BORDER) +#define GL_CLAMP_TO_BORDER 0x812D +#endif + +// No 1D textures in OpenGL ES. +#if !defined(GL_TEXTURE_1D) +#define GL_TEXTURE_1D 0x0DE0 +#endif + +// No 1D texture arrays in OpenGL ES. +#if !defined(GL_TEXTURE_1D_ARRAY) +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#endif + +// No multi-sampled texture arrays in OpenGL ES. +#if !defined(GL_TEXTURE_2D_MULTISAMPLE_ARRAY) +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#endif + +#endif + +/* +================================================================================================================================ + +Driver Instance. + +ksDriverInstance + +bool ksDriverInstance_Create( ksDriverInstance * instance ); +void ksDriverInstance_Destroy( ksDriverInstance * instance ); + +================================================================================================================================ +*/ + +typedef struct { + int dummy; +} ksDriverInstance; + +bool ksDriverInstance_Create(ksDriverInstance *instance); +void ksDriverInstance_Destroy(ksDriverInstance *instance); + +/* +================================================================================================================================ + +GPU device. + +ksGpuQueueProperty +ksGpuQueuePriority +ksGpuQueueInfo +ksGpuDevice + +bool ksGpuDevice_Create( ksGpuDevice * device, ksDriverInstance * instance, const ksGpuQueueInfo * queueInfo ); +void ksGpuDevice_Destroy( ksGpuDevice * device ); + +================================================================================================================================ +*/ + +typedef enum { + KS_GPU_QUEUE_PROPERTY_GRAPHICS = BIT(0), + KS_GPU_QUEUE_PROPERTY_COMPUTE = BIT(1), + KS_GPU_QUEUE_PROPERTY_TRANSFER = BIT(2) +} ksGpuQueueProperty; + +typedef enum { KS_GPU_QUEUE_PRIORITY_LOW, KS_GPU_QUEUE_PRIORITY_MEDIUM, KS_GPU_QUEUE_PRIORITY_HIGH } ksGpuQueuePriority; + +#define MAX_QUEUES 16 + +typedef struct { + int queueCount; // number of queues + ksGpuQueueProperty queueProperties; // desired queue family properties + ksGpuQueuePriority queuePriorities[MAX_QUEUES]; // individual queue priorities +} ksGpuQueueInfo; + +typedef struct { + ksDriverInstance *instance; + ksGpuQueueInfo queueInfo; +} ksGpuDevice; + +bool ksGpuDevice_Create(ksGpuDevice *device, ksDriverInstance *instance, const ksGpuQueueInfo *queueInfo); +void ksGpuDevice_Destroy(ksGpuDevice *device); + +/* +================================================================================================================================ + +GPU context. + +A context encapsulates a queue that is used to submit command buffers. +A context can only be used by a single thread. +For optimal performance a context should only be created at load time, not at runtime. + +ksGpuContext +ksGpuSurfaceColorFormat +ksGpuSurfaceDepthFormat +ksGpuSampleCount + +bool ksGpuContext_CreateShared( ksGpuContext * context, const ksGpuContext * other, const int queueIndex ); +void ksGpuContext_Destroy( ksGpuContext * context ); +void ksGpuContext_WaitIdle( ksGpuContext * context ); +void ksGpuContext_SetCurrent( ksGpuContext * context ); +void ksGpuContext_UnsetCurrent( ksGpuContext * context ); +bool ksGpuContext_CheckCurrent( ksGpuContext * context ); + +bool ksGpuContext_CreateForSurface( ksGpuContext * context, const ksGpuDevice * device, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, + const ksGpuSurfaceDepthFormat depthFormat, + const ksGpuSampleCount sampleCount, + ... ); + +================================================================================================================================ +*/ + +typedef enum { + KS_GPU_SURFACE_COLOR_FORMAT_R5G6B5, + KS_GPU_SURFACE_COLOR_FORMAT_B5G6R5, + KS_GPU_SURFACE_COLOR_FORMAT_R8G8B8A8, + KS_GPU_SURFACE_COLOR_FORMAT_B8G8R8A8, + KS_GPU_SURFACE_COLOR_FORMAT_MAX +} ksGpuSurfaceColorFormat; + +typedef enum { + KS_GPU_SURFACE_DEPTH_FORMAT_NONE, + KS_GPU_SURFACE_DEPTH_FORMAT_D16, + KS_GPU_SURFACE_DEPTH_FORMAT_D24, + KS_GPU_SURFACE_DEPTH_FORMAT_MAX +} ksGpuSurfaceDepthFormat; + +typedef enum { + KS_GPU_SAMPLE_COUNT_1 = 1, + KS_GPU_SAMPLE_COUNT_2 = 2, + KS_GPU_SAMPLE_COUNT_4 = 4, + KS_GPU_SAMPLE_COUNT_8 = 8, + KS_GPU_SAMPLE_COUNT_16 = 16, + KS_GPU_SAMPLE_COUNT_32 = 32, + KS_GPU_SAMPLE_COUNT_64 = 64, +} ksGpuSampleCount; + +typedef struct ksGpuLimits { + size_t maxPushConstantsSize; + int maxSamples; +} ksGpuLimits; + +typedef struct { + const ksGpuDevice *device; +#if defined(OS_WINDOWS) + HDC hDC; + HGLRC hGLRC; +#elif defined(OS_LINUX_XLIB) || defined(OS_LINUX_XCB_GLX) + Display *xDisplay; + uint32_t visualid; + GLXFBConfig glxFBConfig; + GLXDrawable glxDrawable; + GLXContext glxContext; +#elif defined(OS_LINUX_XCB) + xcb_connection_t *connection; + uint32_t screen_number; + xcb_glx_fbconfig_t fbconfigid; + xcb_visualid_t visualid; + xcb_glx_drawable_t glxDrawable; + xcb_glx_context_t glxContext; + xcb_glx_context_tag_t glxContextTag; +#elif defined(OS_LINUX_WAYLAND) + EGLNativeWindowType native_window; + EGLDisplay display; + EGLContext context; + EGLConfig config; + EGLSurface mainSurface; +#elif defined(OS_APPLE_MACOS) + NSOpenGLContext *nsContext; + CGLContextObj cglContext; +#elif defined(OS_ANDROID) + EGLDisplay display; + EGLConfig config; + EGLSurface tinySurface; + EGLSurface mainSurface; + EGLContext context; +#endif +} ksGpuContext; + +typedef struct { + unsigned char redBits; + unsigned char greenBits; + unsigned char blueBits; + unsigned char alphaBits; + unsigned char colorBits; + unsigned char depthBits; +} ksGpuSurfaceBits; + +bool ksGpuContext_CreateShared(ksGpuContext *context, const ksGpuContext *other, int queueIndex); +void ksGpuContext_Destroy(ksGpuContext *context); +void ksGpuContext_WaitIdle(ksGpuContext *context); +void ksGpuContext_SetCurrent(ksGpuContext *context); +void ksGpuContext_UnsetCurrent(ksGpuContext *context); +bool ksGpuContext_CheckCurrent(ksGpuContext *context); + +/* +================================================================================================================================ + +GPU Window. + +Window with associated GPU context for GPU accelerated rendering. +For optimal performance a window should only be created at load time, not at runtime. +Because on some platforms the OS/drivers use thread local storage, ksGpuWindow *must* be created +and destroyed on the same thread that will actually render to the window and swap buffers. + +ksGpuWindow +ksGpuWindowEvent +ksGpuWindowInput +ksKeyboardKey +ksMouseButton + +bool ksGpuWindow_Create( ksGpuWindow * window, ksDriverInstance * instance, + const ksGpuQueueInfo * queueInfo, const int queueIndex, + const ksGpuSurfaceColorFormat colorFormat, const ksGpuSurfaceDepthFormat +depthFormat, + const ksGpuSampleCount sampleCount, const int width, const int height, const bool +fullscreen ); +void ksGpuWindow_Destroy( ksGpuWindow * window ); +void ksGpuWindow_Exit( ksGpuWindow * window ); +ksGpuWindowEvent ksGpuWindow_ProcessEvents( ksGpuWindow * window ); +void ksGpuWindow_SwapInterval( ksGpuWindow * window, const int swapInterval ); +void ksGpuWindow_SwapBuffers( ksGpuWindow * window ); +ksNanoseconds ksGpuWindow_GetNextSwapTimeNanoseconds( ksGpuWindow * window ); +ksNanoseconds ksGpuWindow_GetFrameTimeNanoseconds( ksGpuWindow * window ); + +================================================================================================================================ +*/ + +typedef enum { + KS_GPU_WINDOW_EVENT_NONE, + KS_GPU_WINDOW_EVENT_ACTIVATED, + KS_GPU_WINDOW_EVENT_DEACTIVATED, + KS_GPU_WINDOW_EVENT_EXIT +} ksGpuWindowEvent; + +typedef struct { + bool keyInput[256]; + bool mouseInput[8]; + int mouseInputX[8]; + int mouseInputY[8]; +} ksGpuWindowInput; + +typedef struct { + ksGpuDevice device; + ksGpuContext context; + ksGpuSurfaceColorFormat colorFormat; + ksGpuSurfaceDepthFormat depthFormat; + ksGpuSampleCount sampleCount; + int windowWidth; + int windowHeight; + int windowSwapInterval; + float windowRefreshRate; + bool windowFullscreen; + bool windowActive; + bool windowExit; + ksGpuWindowInput input; + ksNanoseconds lastSwapTime; + +#if defined(OS_WINDOWS) + HINSTANCE hInstance; + HDC hDC; + HWND hWnd; + bool windowActiveState; +#elif defined(OS_LINUX_XLIB) + Display *xDisplay; + int xScreen; + Window xRoot; + XVisualInfo *xVisual; + Colormap xColormap; + Window xWindow; + int desktopWidth; + int desktopHeight; + float desktopRefreshRate; +#elif defined(OS_LINUX_XCB) || defined(OS_LINUX_XCB_GLX) + Display *xDisplay; + xcb_connection_t *connection; + xcb_screen_t *screen; + xcb_colormap_t colormap; + xcb_window_t window; + xcb_atom_t wm_delete_window_atom; + xcb_key_symbols_t *key_symbols; + xcb_glx_window_t glxWindow; + int desktopWidth; + int desktopHeight; + float desktopRefreshRate; +#elif defined(OS_LINUX_WAYLAND) + struct wl_display *display; + + struct wl_surface *surface; + + struct wl_registry *registry; + struct wl_compositor *compositor; + struct zxdg_shell_v6 *shell; + struct zxdg_surface_v6 *shell_surface; + + struct wl_keyboard *keyboard; + struct wl_pointer *pointer; + struct wl_seat *seat; +#elif defined(OS_APPLE_MACOS) + CGDirectDisplayID display; + CGDisplayModeRef desktopDisplayMode; + NSWindow *nsWindow; + NSView *nsView; +#elif defined(OS_APPLE_IOS) + UIWindow *uiWindow; + UIView *uiView; +#elif defined(OS_ANDROID) + EGLDisplay display; + EGLint majorVersion; + EGLint minorVersion; + struct android_app *app; + Java_t java; + ANativeWindow *nativeWindow; + bool resumed; +#endif +} ksGpuWindow; + +bool ksGpuWindow_Create(ksGpuWindow *window, ksDriverInstance *instance, const ksGpuQueueInfo *queueInfo, int queueIndex, + ksGpuSurfaceColorFormat colorFormat, ksGpuSurfaceDepthFormat depthFormat, ksGpuSampleCount sampleCount, + int width, int height, bool fullscreen); +void ksGpuWindow_Destroy(ksGpuWindow *window); +void ksGpuWindow_Exit(ksGpuWindow *window); +ksGpuWindowEvent ksGpuWindow_ProcessEvents(ksGpuWindow *window); +void ksGpuWindow_SwapInterval(ksGpuWindow *window, int swapInterval); +void ksGpuWindow_SwapBuffers(ksGpuWindow *window); +ksNanoseconds ksGpuWindow_GetNextSwapTimeNanoseconds(ksGpuWindow *window); +ksNanoseconds ksGpuWindow_GetFrameTimeNanoseconds(ksGpuWindow *window); + +/* +================================================================================================================================ + +GPU timer. + +A timer is used to measure the amount of time it takes to complete GPU commands. +For optimal performance a timer should only be created at load time, not at runtime. +To avoid synchronization, ksGpuTimer_GetNanoseconds() reports the time from KS_GPU_TIMER_FRAMES_DELAYED frames ago. +Timer queries are allowed to overlap and can be nested. +Timer queries that are issued inside a render pass may not produce accurate times on tiling GPUs. + +ksGpuTimer + +static void ksGpuTimer_Create( ksGpuContext * context, ksGpuTimer * timer ); +static void ksGpuTimer_Destroy( ksGpuContext * context, ksGpuTimer * timer ); +static ksNanoseconds ksGpuTimer_GetNanoseconds( ksGpuTimer * timer ); + +================================================================================================================================ +*/ + +#define KS_GPU_TIMER_FRAMES_DELAYED 2 + +typedef struct { + GLuint beginQueries[KS_GPU_TIMER_FRAMES_DELAYED]; + GLuint endQueries[KS_GPU_TIMER_FRAMES_DELAYED]; + int queryIndex; + ksNanoseconds gpuTime; +} ksGpuTimer; + +void ksGpuTimer_Create(ksGpuContext *context, ksGpuTimer *timer); +void ksGpuTimer_Destroy(ksGpuContext *context, ksGpuTimer *timer); +ksNanoseconds ksGpuTimer_GetNanoseconds(ksGpuTimer *timer); + +#ifdef __cplusplus +} +#endif + +#endif // !KSGRAPHICSWRAPPER_OPENGL_H diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/hex_and_handles.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/hex_and_handles.h new file mode 100644 index 0000000..11170e1 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/hex_and_handles.h @@ -0,0 +1,108 @@ +// Copyright (c) 2017-2021, The Khronos Group Inc. +// Copyright (c) 2017-2019 Valve Corporation +// Copyright (c) 2017-2019 LunarG, Inc. +// Copyright (c) 2019 Collabora, Ltd. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +// +// Initial Author: Ryan Pavlik +// + +/*! + * @file + * + * Some utilities, primarily for working with OpenXR handles in a generic way. + */ + +#pragma once + +#include + +#include +#include + +inline std::string to_hex(const uint8_t* const data, size_t bytes) { + std::string out(2 + bytes * 2, '?'); + out[0] = '0'; + out[1] = 'x'; + static const char* hex = "0123456789abcdef"; + auto ch = out.end(); + for (size_t i = 0; i < bytes; ++i) { + auto b = data[i]; + *--ch = hex[(b >> 0) & 0xf]; + *--ch = hex[(b >> 4) & 0xf]; + } + return out; +} + +template +inline std::string to_hex(const T& data) { + return to_hex(reinterpret_cast(&data), sizeof(data)); +} + +#if XR_PTR_SIZE == 8 +/// Convert a handle into a same-sized integer. +template +static inline uint64_t MakeHandleGeneric(T handle) { + return reinterpret_cast(handle); +} + +/// Treat an integer as a handle +template +static inline T& TreatIntegerAsHandle(uint64_t& handle) { + return reinterpret_cast(handle); +} + +/// @overload +template +static inline T const& TreatIntegerAsHandle(uint64_t const& handle) { + return reinterpret_cast(handle); +} + +/// Does a correctly-sized integer represent a null handle? +static inline bool IsIntegerNullHandle(uint64_t handle) { return XR_NULL_HANDLE == reinterpret_cast(handle); } + +#else + +/// Convert a handle into a same-sized integer: no-op on 32-bit systems +static inline uint64_t MakeHandleGeneric(uint64_t handle) { return handle; } + +/// Treat an integer as a handle: no-op on 32-bit systems +template +static inline T& TreatIntegerAsHandle(uint64_t& handle) { + return handle; +} + +/// @overload +template +static inline T const& TreatIntegerAsHandle(uint64_t const& handle) { + return handle; +} + +/// Does a correctly-sized integer represent a null handle? +static inline bool IsIntegerNullHandle(uint64_t handle) { return XR_NULL_HANDLE == handle; } + +#endif + +/// Turns a uint64_t into a string formatted as hex. +/// +/// The core of the HandleToHexString implementation is in here. +inline std::string Uint64ToHexString(uint64_t val) { return to_hex(val); } + +/// Turns a uint32_t into a string formatted as hex. +inline std::string Uint32ToHexString(uint32_t val) { return to_hex(val); } + +/// Turns an OpenXR handle into a string formatted as hex. +template +inline std::string HandleToHexString(T handle) { + return to_hex(handle); +} + +/// Turns a pointer-sized integer into a string formatted as hex. +inline std::string UintptrToHexString(uintptr_t val) { return to_hex(val); } + +/// Convert a pointer to a string formatted as hex. +template +inline std::string PointerToHexString(T const* ptr) { + return to_hex(ptr); +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/loader_interfaces.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/loader_interfaces.h new file mode 100644 index 0000000..7ee4552 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/loader_interfaces.h @@ -0,0 +1,114 @@ +// Copyright (c) 2017-2021, The Khronos Group Inc. +// Copyright (c) 2017 Valve Corporation +// Copyright (c) 2017 LunarG, Inc. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +// +// Initial Author: Mark Young +// + +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// Forward declare. +typedef struct XrApiLayerCreateInfo XrApiLayerCreateInfo; + +// Function pointer prototype for the xrCreateApiLayerInstance function used in place of xrCreateInstance. +// This function allows us to pass special API layer information to each layer during the process of creating an Instance. +typedef XrResult(XRAPI_PTR *PFN_xrCreateApiLayerInstance)(const XrInstanceCreateInfo *info, + const XrApiLayerCreateInfo *apiLayerInfo, XrInstance *instance); + +// Loader/API Layer Interface versions +// 1 - First version, introduces negotiation structure and functions +#define XR_CURRENT_LOADER_API_LAYER_VERSION 1 + +// Loader/Runtime Interface versions +// 1 - First version, introduces negotiation structure and functions +#define XR_CURRENT_LOADER_RUNTIME_VERSION 1 + +// Version negotiation values +typedef enum XrLoaderInterfaceStructs { + XR_LOADER_INTERFACE_STRUCT_UNINTIALIZED = 0, + XR_LOADER_INTERFACE_STRUCT_LOADER_INFO, + XR_LOADER_INTERFACE_STRUCT_API_LAYER_REQUEST, + XR_LOADER_INTERFACE_STRUCT_RUNTIME_REQUEST, + XR_LOADER_INTERFACE_STRUCT_API_LAYER_CREATE_INFO, + XR_LOADER_INTERFACE_STRUCT_API_LAYER_NEXT_INFO, +} XrLoaderInterfaceStructs; + +#define XR_LOADER_INFO_STRUCT_VERSION 1 +typedef struct XrNegotiateLoaderInfo { + XrLoaderInterfaceStructs structType; // XR_LOADER_INTERFACE_STRUCT_LOADER_INFO + uint32_t structVersion; // XR_LOADER_INFO_STRUCT_VERSION + size_t structSize; // sizeof(XrNegotiateLoaderInfo) + uint32_t minInterfaceVersion; + uint32_t maxInterfaceVersion; + XrVersion minApiVersion; + XrVersion maxApiVersion; +} XrNegotiateLoaderInfo; + +#define XR_API_LAYER_INFO_STRUCT_VERSION 1 +typedef struct XrNegotiateApiLayerRequest { + XrLoaderInterfaceStructs structType; // XR_LOADER_INTERFACE_STRUCT_API_LAYER_REQUEST + uint32_t structVersion; // XR_API_LAYER_INFO_STRUCT_VERSION + size_t structSize; // sizeof(XrNegotiateApiLayerRequest) + uint32_t layerInterfaceVersion; // CURRENT_LOADER_API_LAYER_VERSION + XrVersion layerApiVersion; + PFN_xrGetInstanceProcAddr getInstanceProcAddr; + PFN_xrCreateApiLayerInstance createApiLayerInstance; +} XrNegotiateApiLayerRequest; + +#define XR_RUNTIME_INFO_STRUCT_VERSION 1 +typedef struct XrNegotiateRuntimeRequest { + XrLoaderInterfaceStructs structType; // XR_LOADER_INTERFACE_STRUCT_RUNTIME_REQUEST + uint32_t structVersion; // XR_RUNTIME_INFO_STRUCT_VERSION + size_t structSize; // sizeof(XrNegotiateRuntimeRequest) + uint32_t runtimeInterfaceVersion; // CURRENT_LOADER_RUNTIME_VERSION + XrVersion runtimeApiVersion; + PFN_xrGetInstanceProcAddr getInstanceProcAddr; +} XrNegotiateRuntimeRequest; + +// Function used to negotiate an interface betewen the loader and an API layer. Each library exposing one or +// more API layers needs to expose at least this function. +typedef XrResult(XRAPI_PTR *PFN_xrNegotiateLoaderApiLayerInterface)(const XrNegotiateLoaderInfo *loaderInfo, + const char *apiLayerName, + XrNegotiateApiLayerRequest *apiLayerRequest); + +// Function used to negotiate an interface betewen the loader and a runtime. Each runtime should expose +// at least this function. +typedef XrResult(XRAPI_PTR *PFN_xrNegotiateLoaderRuntimeInterface)(const XrNegotiateLoaderInfo *loaderInfo, + XrNegotiateRuntimeRequest *runtimeRequest); + +// Forward declare. +typedef struct XrApiLayerNextInfo XrApiLayerNextInfo; + +#define XR_API_LAYER_NEXT_INFO_STRUCT_VERSION 1 +struct XrApiLayerNextInfo { + XrLoaderInterfaceStructs structType; // XR_LOADER_INTERFACE_STRUCT_API_LAYER_NEXT_INFO + uint32_t structVersion; // XR_API_LAYER_NEXT_INFO_STRUCT_VERSION + size_t structSize; // sizeof(XrApiLayerNextInfo) + char layerName[XR_MAX_API_LAYER_NAME_SIZE]; // Name of API layer which should receive this info + PFN_xrGetInstanceProcAddr nextGetInstanceProcAddr; // Pointer to next API layer's xrGetInstanceProcAddr + PFN_xrCreateApiLayerInstance nextCreateApiLayerInstance; // Pointer to next API layer's xrCreateApiLayerInstance + XrApiLayerNextInfo *next; // Pointer to the next API layer info in the sequence +}; + +#define XR_API_LAYER_MAX_SETTINGS_PATH_SIZE 512 +#define XR_API_LAYER_CREATE_INFO_STRUCT_VERSION 1 +typedef struct XrApiLayerCreateInfo { + XrLoaderInterfaceStructs structType; // XR_LOADER_INTERFACE_STRUCT_API_LAYER_CREATE_INFO + uint32_t structVersion; // XR_API_LAYER_CREATE_INFO_STRUCT_VERSION + size_t structSize; // sizeof(XrApiLayerCreateInfo) + void *loaderInstance; // Pointer to the LoaderInstance class + char settings_file_location[XR_API_LAYER_MAX_SETTINGS_PATH_SIZE]; // Location to the found settings file (or empty '\0') + XrApiLayerNextInfo *nextInfo; // Pointer to the next API layer's Info +} XrApiLayerCreateInfo; + +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/object_info.cpp b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/object_info.cpp new file mode 100644 index 0000000..9e77f5c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/object_info.cpp @@ -0,0 +1,276 @@ +// Copyright (c) 2017-2021, The Khronos Group Inc. +// Copyright (c) 2017-2019 Valve Corporation +// Copyright (c) 2017-2019 LunarG, Inc. +// Copyright (c) 2019 Collabora, Ltd. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +// +// Initial Authors: Mark Young +// Ryan Pavlik +// Dave Houlton +// + +#include "object_info.h" + +#include "extra_algorithms.h" +#include "hex_and_handles.h" + +#include + +#include +#include +#include +#include +#include +#include + +#include "memory.h" + +std::string XrSdkLogObjectInfo::ToString() const { + std::ostringstream oss; + oss << Uint64ToHexString(handle); + if (!name.empty()) { + oss << " (" << name << ")"; + } + return oss.str(); +} + +void ObjectInfoCollection::AddObjectName(uint64_t object_handle, XrObjectType object_type, const std::string& object_name) { + // If name is empty, we should erase it + if (object_name.empty()) { + RemoveObject(object_handle, object_type); + return; + } + + // Otherwise, add it or update the name + XrSdkLogObjectInfo new_obj = {object_handle, object_type}; + + // If it already exists, update the name + auto lookup_info = LookUpStoredObjectInfo(new_obj); + if (lookup_info != nullptr) { + lookup_info->name = object_name; + return; + } + + // It doesn't exist, so add a new info block + new_obj.name = object_name; + object_info_.push_back(new_obj); +} + +void ObjectInfoCollection::RemoveObject(uint64_t object_handle, XrObjectType object_type) { + vector_remove_if_and_erase( + object_info_, [=](XrSdkLogObjectInfo const& info) { return info.handle == object_handle && info.type == object_type; }); +} + +XrSdkLogObjectInfo const* ObjectInfoCollection::LookUpStoredObjectInfo(XrSdkLogObjectInfo const& info) const { + auto e = object_info_.end(); + auto it = std::find_if(object_info_.begin(), e, [&](XrSdkLogObjectInfo const& stored) { return Equivalent(stored, info); }); + if (it != e) { + return &(*it); + } + return nullptr; +} + +XrSdkLogObjectInfo* ObjectInfoCollection::LookUpStoredObjectInfo(XrSdkLogObjectInfo const& info) { + auto e = object_info_.end(); + auto it = std::find_if(object_info_.begin(), e, [&](XrSdkLogObjectInfo const& stored) { return Equivalent(stored, info); }); + if (it != e) { + return &(*it); + } + return nullptr; +} + +bool ObjectInfoCollection::LookUpObjectName(XrDebugUtilsObjectNameInfoEXT& info) const { + auto info_lookup = LookUpStoredObjectInfo(info.objectHandle, info.objectType); + if (info_lookup != nullptr) { + info.objectName = info_lookup->name.c_str(); + return true; + } + return false; +} + +bool ObjectInfoCollection::LookUpObjectName(XrSdkLogObjectInfo& info) const { + auto info_lookup = LookUpStoredObjectInfo(info); + if (info_lookup != nullptr) { + info.name = info_lookup->name; + return true; + } + return false; +} + +static std::vector PopulateObjectNameInfo(std::vector const& obj) { + std::vector ret; + ret.reserve(obj.size()); + std::transform(obj.begin(), obj.end(), std::back_inserter(ret), [](XrSdkLogObjectInfo const& info) { + return XrDebugUtilsObjectNameInfoEXT{XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, nullptr, info.type, info.handle, + info.name.c_str()}; + }); + return ret; +} + +NamesAndLabels::NamesAndLabels(std::vector obj, std::vector lab) + : sdk_objects(std::move(obj)), objects(PopulateObjectNameInfo(sdk_objects)), labels(std::move(lab)) {} + +void NamesAndLabels::PopulateCallbackData(XrDebugUtilsMessengerCallbackDataEXT& callback_data) const { + callback_data.objects = objects.empty() ? nullptr : const_cast(objects.data()); + callback_data.objectCount = static_cast(objects.size()); + callback_data.sessionLabels = labels.empty() ? nullptr : const_cast(labels.data()); + callback_data.sessionLabelCount = static_cast(labels.size()); +} + +void DebugUtilsData::LookUpSessionLabels(XrSession session, std::vector& labels) const { + auto session_label_iterator = session_labels_.find(session); + if (session_label_iterator != session_labels_.end()) { + auto& XrSdkSessionLabels = *session_label_iterator->second; + // Copy the debug utils labels in reverse order in the the labels vector. + std::transform(XrSdkSessionLabels.rbegin(), XrSdkSessionLabels.rend(), std::back_inserter(labels), + [](XrSdkSessionLabelPtr const& label) { return label->debug_utils_label; }); + } +} + +XrSdkSessionLabel::XrSdkSessionLabel(const XrDebugUtilsLabelEXT& label_info, bool individual) + : label_name(label_info.labelName), debug_utils_label(label_info), is_individual_label(individual) { + // Update the c string pointer to the one we hold. + debug_utils_label.labelName = label_name.c_str(); +} + +XrSdkSessionLabelPtr XrSdkSessionLabel::make(const XrDebugUtilsLabelEXT& label_info, bool individual) { + XrSdkSessionLabelPtr ret(new XrSdkSessionLabel(label_info, individual)); + return ret; +} +void DebugUtilsData::AddObjectName(uint64_t object_handle, XrObjectType object_type, const std::string& object_name) { + object_info_.AddObjectName(object_handle, object_type, object_name); +} + +// We always want to remove the old individual label before we do anything else. +// So, do that in it's own method +void DebugUtilsData::RemoveIndividualLabel(XrSdkSessionLabelList& label_vec) { + if (!label_vec.empty() && label_vec.back()->is_individual_label) { + label_vec.pop_back(); + } +} + +XrSdkSessionLabelList* DebugUtilsData::GetSessionLabelList(XrSession session) { + auto session_label_iterator = session_labels_.find(session); + if (session_label_iterator == session_labels_.end()) { + return nullptr; + } + return session_label_iterator->second.get(); +} + +XrSdkSessionLabelList& DebugUtilsData::GetOrCreateSessionLabelList(XrSession session) { + XrSdkSessionLabelList* vec_ptr = GetSessionLabelList(session); + if (vec_ptr == nullptr) { + std::unique_ptr vec(new XrSdkSessionLabelList); + vec_ptr = vec.get(); + session_labels_[session] = std::move(vec); + } + return *vec_ptr; +} + +void DebugUtilsData::BeginLabelRegion(XrSession session, const XrDebugUtilsLabelEXT& label_info) { + auto& vec = GetOrCreateSessionLabelList(session); + + // Individual labels do not stay around in the transition into a new label region + RemoveIndividualLabel(vec); + + // Start the new label region + vec.emplace_back(XrSdkSessionLabel::make(label_info, false)); +} + +void DebugUtilsData::EndLabelRegion(XrSession session) { + XrSdkSessionLabelList* vec_ptr = GetSessionLabelList(session); + if (vec_ptr == nullptr) { + return; + } + + // Individual labels do not stay around in the transition out of label region + RemoveIndividualLabel(*vec_ptr); + + // Remove the last label region + if (!vec_ptr->empty()) { + vec_ptr->pop_back(); + } +} + +void DebugUtilsData::InsertLabel(XrSession session, const XrDebugUtilsLabelEXT& label_info) { + auto& vec = GetOrCreateSessionLabelList(session); + + // Remove any individual layer that might already be there + RemoveIndividualLabel(vec); + + // Insert a new individual label + vec.emplace_back(XrSdkSessionLabel::make(label_info, true)); +} + +void DebugUtilsData::DeleteObject(uint64_t object_handle, XrObjectType object_type) { + object_info_.RemoveObject(object_handle, object_type); + + if (object_type == XR_OBJECT_TYPE_SESSION) { + auto session = TreatIntegerAsHandle(object_handle); + XrSdkSessionLabelList* vec_ptr = GetSessionLabelList(session); + if (vec_ptr != nullptr) { + session_labels_.erase(session); + } + } +} + +void DebugUtilsData::DeleteSessionLabels(XrSession session) { session_labels_.erase(session); } + +NamesAndLabels DebugUtilsData::PopulateNamesAndLabels(std::vector objects) const { + std::vector labels; + for (auto& obj : objects) { + // Check for any names that have been associated with the objects and set them up here + object_info_.LookUpObjectName(obj); + // If this is a session, see if there are any labels associated with it for us to add + // to the callback content. + if (XR_OBJECT_TYPE_SESSION == obj.type) { + LookUpSessionLabels(obj.GetTypedHandle(), labels); + } + } + + return {objects, labels}; +} + +void DebugUtilsData::WrapCallbackData(AugmentedCallbackData* aug_data, + const XrDebugUtilsMessengerCallbackDataEXT* callback_data) const { + // If there's nothing to add, just return the original data as the augmented copy + aug_data->exported_data = callback_data; + if (object_info_.Empty() || callback_data->objectCount == 0) { + return; + } + + // Inspect each of the callback objects + bool name_found = false; + for (uint32_t obj = 0; obj < callback_data->objectCount; ++obj) { + auto& current_obj = callback_data->objects[obj]; + name_found |= (nullptr != object_info_.LookUpStoredObjectInfo(current_obj.objectHandle, current_obj.objectType)); + + // If this is a session, record any labels associated with it + if (XR_OBJECT_TYPE_SESSION == current_obj.objectType) { + XrSession session = TreatIntegerAsHandle(current_obj.objectHandle); + LookUpSessionLabels(session, aug_data->labels); + } + } + + // If we found nothing to add, return the original data + if (!name_found && aug_data->labels.empty()) { + return; + } + + // Found additional data - modify an internal copy and return that as the exported data + memcpy(&aug_data->modified_data, callback_data, sizeof(XrDebugUtilsMessengerCallbackDataEXT)); + aug_data->new_objects.assign(callback_data->objects, callback_data->objects + callback_data->objectCount); + + // Record (overwrite) the names of all incoming objects provided in our internal list + for (auto& obj : aug_data->new_objects) { + object_info_.LookUpObjectName(obj); + } + + // Update local copy & point export to it + aug_data->modified_data.objects = aug_data->new_objects.data(); + aug_data->modified_data.sessionLabelCount = static_cast(aug_data->labels.size()); + aug_data->modified_data.sessionLabels = aug_data->labels.empty() ? nullptr : aug_data->labels.data(); + aug_data->exported_data = &aug_data->modified_data; + return; +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/object_info.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/object_info.h new file mode 100644 index 0000000..1830fa8 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/object_info.h @@ -0,0 +1,229 @@ +// Copyright (c) 2017-2021, The Khronos Group Inc. +// Copyright (c) 2017-2019 Valve Corporation +// Copyright (c) 2017-2019 LunarG, Inc. +// Copyright (c) 2019 Collabora, Ltd. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +// +// Initial Authors: Mark Young , Ryan Pavlik + +#include +#include +#include +#include + +struct XrSdkGenericObject { + //! Type-erased handle value + uint64_t handle; + + //! Kind of object this handle refers to + XrObjectType type; + /// Un-erase the type of the handle and get it properly typed again. + /// + /// Note: Does not check the type before doing it! + template + HandleType& GetTypedHandle() { + return TreatIntegerAsHandle(handle); + } + + //! @overload + template + HandleType const& GetTypedHandle() const { + return TreatIntegerAsHandle(handle); + } + + //! Create from a typed handle and object type + template + XrSdkGenericObject(T h, XrObjectType t) : handle(MakeHandleGeneric(h)), type(t) {} + + //! Create from an untyped handle value (integer) and object type + XrSdkGenericObject(uint64_t h, XrObjectType t) : handle(h), type(t) {} +}; + +struct XrSdkLogObjectInfo { + //! Type-erased handle value + uint64_t handle; + + //! Kind of object this handle refers to + XrObjectType type; + + //! To be assigned by the application - not part of this object's identity + std::string name; + + /// Un-erase the type of the handle and get it properly typed again. + /// + /// Note: Does not check the type before doing it! + template + HandleType& GetTypedHandle() { + return TreatIntegerAsHandle(handle); + } + + //! @overload + template + HandleType const& GetTypedHandle() const { + return TreatIntegerAsHandle(handle); + } + + XrSdkLogObjectInfo() = default; + + //! Create from a typed handle and object type + template + XrSdkLogObjectInfo(T h, XrObjectType t) : handle(MakeHandleGeneric(h)), type(t) {} + + //! Create from an untyped handle value (integer) and object type + XrSdkLogObjectInfo(uint64_t h, XrObjectType t) : handle(h), type(t) {} + //! Create from an untyped handle value (integer), object type, and name + XrSdkLogObjectInfo(uint64_t h, XrObjectType t, const char* n) : handle(h), type(t), name(n == nullptr ? "" : n) {} + + std::string ToString() const; +}; + +//! True if the two object infos have the same handle value and handle type +static inline bool Equivalent(XrSdkLogObjectInfo const& a, XrSdkLogObjectInfo const& b) { + return a.handle == b.handle && a.type == b.type; +} + +//! @overload +static inline bool Equivalent(XrDebugUtilsObjectNameInfoEXT const& a, XrSdkLogObjectInfo const& b) { + return a.objectHandle == b.handle && a.objectType == b.type; +} + +//! @overload +static inline bool Equivalent(XrSdkLogObjectInfo const& a, XrDebugUtilsObjectNameInfoEXT const& b) { return Equivalent(b, a); } + +/// Object info registered with calls to xrSetDebugUtilsObjectNameEXT +class ObjectInfoCollection { + public: + void AddObjectName(uint64_t object_handle, XrObjectType object_type, const std::string& object_name); + + void RemoveObject(uint64_t object_handle, XrObjectType object_type); + + //! Find the stored object info, if any, matching handle and type. + //! Return nullptr if not found. + XrSdkLogObjectInfo const* LookUpStoredObjectInfo(XrSdkLogObjectInfo const& info) const; + + //! Find the stored object info, if any, matching handle and type. + //! Return nullptr if not found. + XrSdkLogObjectInfo* LookUpStoredObjectInfo(XrSdkLogObjectInfo const& info); + + //! Find the stored object info, if any. + //! Return nullptr if not found. + XrSdkLogObjectInfo const* LookUpStoredObjectInfo(uint64_t handle, XrObjectType type) const { + return LookUpStoredObjectInfo({handle, type}); + } + + //! Find the object name, if any, and update debug utils info accordingly. + //! Return true if found and updated. + bool LookUpObjectName(XrDebugUtilsObjectNameInfoEXT& info) const; + + //! Find the object name, if any, and update logging info accordingly. + //! Return true if found and updated. + bool LookUpObjectName(XrSdkLogObjectInfo& info) const; + + //! Is the collection empty? + bool Empty() const { return object_info_.empty(); } + + private: + // Object names that have been set for given objects + std::vector object_info_; +}; + +struct XrSdkSessionLabel; +using XrSdkSessionLabelPtr = std::unique_ptr; +using XrSdkSessionLabelList = std::vector; + +struct XrSdkSessionLabel { + static XrSdkSessionLabelPtr make(const XrDebugUtilsLabelEXT& label_info, bool individual); + + std::string label_name; + XrDebugUtilsLabelEXT debug_utils_label; + bool is_individual_label; + + private: + XrSdkSessionLabel(const XrDebugUtilsLabelEXT& label_info, bool individual); +}; + +/// The metadata for a collection of objects. Must persist unmodified during the entire debug messenger call! +struct NamesAndLabels { + NamesAndLabels() = default; + NamesAndLabels(std::vector obj, std::vector lab); + /// C++ structure owning the data (strings) backing the objects vector. + std::vector sdk_objects; + + std::vector objects; + std::vector labels; + + /// Populate the debug utils callback data structure. + void PopulateCallbackData(XrDebugUtilsMessengerCallbackDataEXT& data) const; + // XrDebugUtilsMessengerCallbackDataEXT MakeCallbackData() const; +}; + +struct AugmentedCallbackData { + std::vector labels; + std::vector new_objects; + XrDebugUtilsMessengerCallbackDataEXT modified_data; + const XrDebugUtilsMessengerCallbackDataEXT* exported_data; +}; + +/// Tracks all the data (handle names and session labels) required to fully augment XR_EXT_debug_utils-related calls. +class DebugUtilsData { + public: + DebugUtilsData() = default; + + DebugUtilsData(const DebugUtilsData&) = delete; + DebugUtilsData& operator=(const DebugUtilsData&) = delete; + + bool Empty() const { return object_info_.Empty() && session_labels_.empty(); } + + //! Core of implementation for xrSetDebugUtilsObjectNameEXT + void AddObjectName(uint64_t object_handle, XrObjectType object_type, const std::string& object_name); + + /// Core of implementation for xrSessionBeginDebugUtilsLabelRegionEXT + void BeginLabelRegion(XrSession session, const XrDebugUtilsLabelEXT& label_info); + + /// Core of implementation for xrSessionEndDebugUtilsLabelRegionEXT + void EndLabelRegion(XrSession session); + + /// Core of implementation for xrSessionInsertDebugUtilsLabelEXT + void InsertLabel(XrSession session, const XrDebugUtilsLabelEXT& label_info); + + /// Removes all labels associated with a session - call in xrDestroySession and xrDestroyInstance (for all child sessions) + void DeleteSessionLabels(XrSession session); + + /// Retrieve labels for the given session, if any, and push them in reverse order on the vector. + void LookUpSessionLabels(XrSession session, std::vector& labels) const; + + /// Removes all data related to this object - including session labels if it's a session. + /// + /// Does not take care of handling child objects - you must do this yourself. + void DeleteObject(uint64_t object_handle, XrObjectType object_type); + + /// Given the collection of objects, populate their names and list of labels + NamesAndLabels PopulateNamesAndLabels(std::vector objects) const; + + void WrapCallbackData(AugmentedCallbackData* aug_data, + const XrDebugUtilsMessengerCallbackDataEXT* provided_callback_data) const; + + private: + void RemoveIndividualLabel(XrSdkSessionLabelList& label_vec); + XrSdkSessionLabelList* GetSessionLabelList(XrSession session); + XrSdkSessionLabelList& GetOrCreateSessionLabelList(XrSession session); + + // Session labels: one vector of them per session. + std::unordered_map> session_labels_; + + // Names for objects. + ObjectInfoCollection object_info_; +}; diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/platform_utils.hpp b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/platform_utils.hpp new file mode 100644 index 0000000..cafaa79 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/platform_utils.hpp @@ -0,0 +1,345 @@ +// Copyright (c) 2017-2021, The Khronos Group Inc. +// Copyright (c) 2017-2019 Valve Corporation +// Copyright (c) 2017-2019 LunarG, Inc. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +// +// Initial Authors: Mark Young , Dave Houlton +// + +#pragma once + +#include "xr_dependencies.h" +#include +#include + +// OpenXR paths and registry key locations +#define OPENXR_RELATIVE_PATH "openxr/" +#define OPENXR_IMPLICIT_API_LAYER_RELATIVE_PATH "/api_layers/implicit.d" +#define OPENXR_EXPLICIT_API_LAYER_RELATIVE_PATH "/api_layers/explicit.d" +#ifdef XR_OS_WINDOWS +#define OPENXR_REGISTRY_LOCATION "SOFTWARE\\Khronos\\OpenXR\\" +#define OPENXR_IMPLICIT_API_LAYER_REGISTRY_LOCATION "\\ApiLayers\\Implicit" +#define OPENXR_EXPLICIT_API_LAYER_REGISTRY_LOCATION "\\ApiLayers\\Explicit" +#endif + +// OpenXR Loader environment variables of interest +#define OPENXR_RUNTIME_JSON_ENV_VAR "XR_RUNTIME_JSON" +#define OPENXR_API_LAYER_PATH_ENV_VAR "XR_API_LAYER_PATH" + +// This is a CMake generated file with #defines for any functions/includes +// that it found present and build-time configuration. +// If you don't have this file, on non-Windows you'll need to define +// one of HAVE_SECURE_GETENV or HAVE___SECURE_GETENV depending on which +// of secure_getenv or __secure_getenv are present +#ifdef OPENXR_HAVE_COMMON_CONFIG +#include "common_config.h" +#endif // OPENXR_HAVE_COMMON_CONFIG + +// Environment variables +#if defined(XR_OS_LINUX) || defined(XR_OS_APPLE) + +#include +#include +#include + +namespace detail { + +static inline char* ImplGetEnv(const char* name) { return getenv(name); } + +static inline int ImplSetEnv(const char* name, const char* value, int overwrite) { return setenv(name, value, overwrite); } + +static inline char* ImplGetSecureEnv(const char* name) { +#ifdef HAVE_SECURE_GETENV + return secure_getenv(name); +#elif defined(HAVE___SECURE_GETENV) + return __secure_getenv(name); +#else +#pragma message( \ + "Warning: Falling back to non-secure getenv for environmental" \ + "lookups! Consider updating to a different libc.") + + return ImplGetEnv(name); +#endif +} +} // namespace detail + +#endif // defined(XR_OS_LINUX) || defined(XR_OS_APPLE) +#if defined(XR_OS_LINUX) + +static inline std::string PlatformUtilsGetEnv(const char* name) { + auto str = detail::ImplGetEnv(name); + if (str == nullptr) { + return {}; + } + return str; +} + +static inline std::string PlatformUtilsGetSecureEnv(const char* name) { + auto str = detail::ImplGetSecureEnv(name); + if (str == nullptr) { + return {}; + } + return str; +} + +static inline bool PlatformUtilsGetEnvSet(const char* name) { return detail::ImplGetEnv(name) != nullptr; } + +static inline bool PlatformUtilsSetEnv(const char* name, const char* value) { + const int shouldOverwrite = 1; + int result = detail::ImplSetEnv(name, value, shouldOverwrite); + return (result == 0); +} + +#elif defined(XR_OS_APPLE) + +static inline std::string PlatformUtilsGetEnv(const char* name) { + auto str = detail::ImplGetEnv(name); + if (str == nullptr) { + return {}; + } + return str; +} + +static inline std::string PlatformUtilsGetSecureEnv(const char* name) { + auto str = detail::ImplGetSecureEnv(name); + if (str == nullptr) { + return {}; + } + return str; +} + +static inline bool PlatformUtilsGetEnvSet(const char* name) { return detail::ImplGetEnv(name) != nullptr; } + +static inline bool PlatformUtilsSetEnv(const char* name, const char* value) { + const int shouldOverwrite = 1; + int result = detail::ImplSetEnv(name, value, shouldOverwrite); + return (result == 0); +} + +// Prefix for the Apple global runtime JSON file name +static const std::string rt_dir_prefix = "/usr/local/share/openxr/"; +static const std::string rt_filename = "/active_runtime.json"; + +static inline bool PlatformGetGlobalRuntimeFileName(uint16_t major_version, std::string& file_name) { + file_name = rt_dir_prefix; + file_name += std::to_string(major_version); + file_name += rt_filename; + return true; +} + +#elif defined(XR_OS_WINDOWS) + +#if !defined(NDEBUG) +inline void LogError(const std::string& error) { OutputDebugStringA(error.c_str()); } +#else +#define LogError(x) +#endif + +inline std::wstring utf8_to_wide(const std::string& utf8Text) { + if (utf8Text.empty()) { + return {}; + } + + std::wstring wideText; + const int wideLength = ::MultiByteToWideChar(CP_UTF8, 0, utf8Text.data(), (int)utf8Text.size(), nullptr, 0); + if (wideLength == 0) { + LogError("utf8_to_wide get size error: " + std::to_string(::GetLastError())); + return {}; + } + + // MultiByteToWideChar returns number of chars of the input buffer, regardless of null terminitor + wideText.resize(wideLength, 0); + wchar_t* wideString = const_cast(wideText.data()); // mutable data() only exists in c++17 + const int length = ::MultiByteToWideChar(CP_UTF8, 0, utf8Text.data(), (int)utf8Text.size(), wideString, wideLength); + if (length != wideLength) { + LogError("utf8_to_wide convert string error: " + std::to_string(::GetLastError())); + return {}; + } + + return wideText; +} + +inline std::string wide_to_utf8(const std::wstring& wideText) { + if (wideText.empty()) { + return {}; + } + + std::string narrowText; + int narrowLength = ::WideCharToMultiByte(CP_UTF8, 0, wideText.data(), (int)wideText.size(), nullptr, 0, nullptr, nullptr); + if (narrowLength == 0) { + LogError("wide_to_utf8 get size error: " + std::to_string(::GetLastError())); + return {}; + } + + // WideCharToMultiByte returns number of chars of the input buffer, regardless of null terminitor + narrowText.resize(narrowLength, 0); + char* narrowString = const_cast(narrowText.data()); // mutable data() only exists in c++17 + const int length = + ::WideCharToMultiByte(CP_UTF8, 0, wideText.data(), (int)wideText.size(), narrowString, narrowLength, nullptr, nullptr); + if (length != narrowLength) { + LogError("wide_to_utf8 convert string error: " + std::to_string(::GetLastError())); + return {}; + } + + return narrowText; +} + +// Returns true if the current process has an integrity level > SECURITY_MANDATORY_MEDIUM_RID. +static inline bool IsHighIntegrityLevel() { + // Execute this check once and save the value as a static bool. + static bool isHighIntegrityLevel = ([] { + HANDLE processToken; + if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_QUERY_SOURCE, &processToken)) { + // Maximum possible size of SID_AND_ATTRIBUTES is maximum size of a SID + size of attributes DWORD. + uint8_t mandatoryLabelBuffer[SECURITY_MAX_SID_SIZE + sizeof(DWORD)]{}; + DWORD bufferSize; + if (GetTokenInformation(processToken, TokenIntegrityLevel, mandatoryLabelBuffer, sizeof(mandatoryLabelBuffer), + &bufferSize) != 0) { + const auto mandatoryLabel = reinterpret_cast(mandatoryLabelBuffer); + if (mandatoryLabel->Label.Sid != 0) { + const DWORD subAuthorityCount = *GetSidSubAuthorityCount(mandatoryLabel->Label.Sid); + const DWORD integrityLevel = *GetSidSubAuthority(mandatoryLabel->Label.Sid, subAuthorityCount - 1); + CloseHandle(processToken); + return integrityLevel > SECURITY_MANDATORY_MEDIUM_RID; + } + } + + CloseHandle(processToken); + } + + return false; + })(); + + return isHighIntegrityLevel; +} + +// Returns true if the given environment variable exists. +// The name is a case-sensitive UTF8 string. +static inline bool PlatformUtilsGetEnvSet(const char* name) { + const std::wstring wname = utf8_to_wide(name); + const DWORD valSize = ::GetEnvironmentVariableW(wname.c_str(), nullptr, 0); + // GetEnvironmentVariable returns 0 when environment variable does not exist or there is an error. + return 0 != valSize; +} + +// Returns the environment variable value for the given name. +// Returns an empty string if the environment variable doesn't exist or if it exists but is empty. +// Use PlatformUtilsGetEnvSet to tell if it exists. +// The name is a case-sensitive UTF8 string. +static inline std::string PlatformUtilsGetEnv(const char* name) { + const std::wstring wname = utf8_to_wide(name); + const DWORD valSize = ::GetEnvironmentVariableW(wname.c_str(), nullptr, 0); + // GetEnvironmentVariable returns 0 when environment variable does not exist or there is an error. + // The size includes the null-terminator, so a size of 1 is means the variable was explicitly set to empty. + if (valSize == 0 || valSize == 1) { + return {}; + } + + // GetEnvironmentVariable returns size including null terminator for "query size" call. + std::wstring wValue(valSize, 0); + wchar_t* wValueData = &wValue[0]; + + // GetEnvironmentVariable returns string length, excluding null terminator for "get value" + // call if there was enough capacity. Else it returns the required capacity (including null terminator). + const DWORD length = ::GetEnvironmentVariableW(wname.c_str(), wValueData, (DWORD)wValue.size()); + if ((length == 0) || (length >= wValue.size())) { // If error or the variable increased length between calls... + LogError("GetEnvironmentVariable get value error: " + std::to_string(::GetLastError())); + return {}; + } + + wValue.resize(length); // Strip the null terminator. + + return wide_to_utf8(wValue); +} + +// Acts the same as PlatformUtilsGetEnv except returns an empty string if IsHighIntegrityLevel. +static inline std::string PlatformUtilsGetSecureEnv(const char* name) { + // Do not allow high integrity processes to act on data that can be controlled by medium integrity processes. + if (IsHighIntegrityLevel()) { + return {}; + } + + // No secure version for Windows so the above integrity check is needed. + return PlatformUtilsGetEnv(name); +} + +// Sets an environment variable via UTF8 strings. +// The name is case-sensitive. +// Overwrites the variable if it already exists. +// Returns true if it could be set. +static inline bool PlatformUtilsSetEnv(const char* name, const char* value) { + const std::wstring wname = utf8_to_wide(name); + const std::wstring wvalue = utf8_to_wide(value); + BOOL result = ::SetEnvironmentVariableW(wname.c_str(), wvalue.c_str()); + return (result != 0); +} + +#elif defined(XR_OS_ANDROID) + +static inline bool PlatformUtilsGetEnvSet(const char* /* name */) { + // Stub func + return false; +} + +static inline std::string PlatformUtilsGetEnv(const char* /* name */) { + // Stub func + return {}; +} + +static inline std::string PlatformUtilsGetSecureEnv(const char* /* name */) { + // Stub func + return {}; +} + +static inline bool PlatformUtilsSetEnv(const char* /* name */, const char* /* value */) { + // Stub func + return false; +} + +#include + +// Intended to be only used as a fallback on Android, with a more open, "native" technique used in most cases +static inline bool PlatformGetGlobalRuntimeFileName(uint16_t major_version, std::string& file_name) { + // Prefix for the runtime JSON file name + static const char* rt_dir_prefixes[] = {"/oem", "/vendor"}; + static const std::string rt_filename = "/active_runtime.json"; + static const std::string subdir = "/etc/openxr/"; + for (const auto prefix : rt_dir_prefixes) { + auto path = prefix + subdir + std::to_string(major_version) + rt_filename; + struct stat buf; + if (0 == stat(path.c_str(), &buf)) { + file_name = path; + return true; + } + } + return false; +} +#else // Not Linux, Apple, nor Windows + +static inline bool PlatformUtilsGetEnvSet(const char* /* name */) { + // Stub func + return false; +} + +static inline std::string PlatformUtilsGetEnv(const char* /* name */) { + // Stub func + return {}; +} + +static inline std::string PlatformUtilsGetSecureEnv(const char* /* name */) { + // Stub func + return {}; +} + +static inline bool PlatformUtilsSetEnv(const char* /* name */, const char* /* value */) { + // Stub func + return false; +} + +static inline bool PlatformGetGlobalRuntimeFileName(uint16_t /* major_version */, std::string const& /* file_name */) { + // Stub func + return false; +} + +#endif diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/xr_dependencies.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/xr_dependencies.h new file mode 100644 index 0000000..e0d2896 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/xr_dependencies.h @@ -0,0 +1,89 @@ +// Copyright (c) 2018-2021, The Khronos Group Inc. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT +// +// This file includes headers with types which openxr.h depends on in order +// to compile when platforms, graphics apis, and the like are enabled. + +#pragma once + +#ifdef XR_USE_PLATFORM_ANDROID +#include +#include +#include +#endif // XR_USE_PLATFORM_ANDROID + +#ifdef XR_USE_PLATFORM_WIN32 + +#include +#if !(WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)) +// Enable desktop partition APIs, such as RegOpenKeyEx, LoadLibraryEx, PathFileExists etc. +#undef WINAPI_PARTITION_DESKTOP +#define WINAPI_PARTITION_DESKTOP 1 +#endif + +#ifndef NOMINMAX +#define NOMINMAX +#endif // !NOMINMAX + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif // !WIN32_LEAN_AND_MEAN + +#include +#include + +#endif // XR_USE_PLATFORM_WIN32 + +#ifdef XR_USE_GRAPHICS_API_D3D11 +#include +#endif // XR_USE_GRAPHICS_API_D3D11 + +#ifdef XR_USE_GRAPHICS_API_D3D12 +#include +#endif // XR_USE_GRAPHICS_API_D3D12 + +#ifdef XR_USE_PLATFORM_XLIB +#include +#include + +#ifdef Success +#undef Success +#endif // Success + +#ifdef Always +#undef Always +#endif // Always + +#ifdef None +#undef None +#endif // None +#endif // XR_USE_PLATFORM_XLIB + +#ifdef XR_USE_PLATFORM_XCB +#include +#endif // XR_USE_PLATFORM_XCB + +#ifdef XR_USE_GRAPHICS_API_OPENGL +#if defined(XR_USE_PLATFORM_XLIB) || defined(XR_USE_PLATFORM_XCB) +#include +#endif // (XR_USE_PLATFORM_XLIB || XR_USE_PLATFORM_XCB) +#ifdef XR_USE_PLATFORM_XCB +#include +#endif // XR_USE_PLATFORM_XCB +#ifdef XR_USE_PLATFORM_MACOS +#include +#endif // XR_USE_PLATFORM_MACOS +#endif // XR_USE_GRAPHICS_API_OPENGL + +#ifdef XR_USE_GRAPHICS_API_OPENGL_ES +#include +#endif // XR_USE_GRAPHICS_API_OPENGL_ES + +#ifdef XR_USE_GRAPHICS_API_VULKAN +#include +#endif // XR_USE_GRAPHICS_API_VULKAN + +#ifdef XR_USE_PLATFORM_WAYLAND +#include "wayland-client.h" +#endif // XR_USE_PLATFORM_WAYLAND diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/xr_linear.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/xr_linear.h new file mode 100644 index 0000000..16dfea2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/common/xr_linear.h @@ -0,0 +1,787 @@ +// Copyright (c) 2017 The Khronos Group Inc. +// Copyright (c) 2016 Oculus VR, LLC. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Author: J.M.P. van Waveren +// + +#ifndef XR_LINEAR_H_ +#define XR_LINEAR_H_ + +#if defined(OS_LINUX_XCB) || defined(OS_LINUX_XCB_GLX) || defined(OS_LINUX_WAYLAND) +#pragma GCC diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wunused-function" +#endif + +#include + +/* +================================================================================================ + +Description : Vector, matrix and quaternion math. +Author : J.M.P. van Waveren +Date : 12/10/2016 +Language : C99 +Format : Indent 4 spaces - no tabs. +Copyright : Copyright (c) 2016 Oculus VR, LLC. All Rights reserved. + + +DESCRIPTION +=========== + +All matrices are column-major. + +INTERFACE +========= + +XrVector2f +XrVector3f +XrVector4f +XrQuaternionf +XrMatrix4x4f + +inline static void XrVector3f_Set(XrVector3f* v, const float value); +inline static void XrVector3f_Add(XrVector3f* result, const XrVector3f* a, const XrVector3f* b); +inline static void XrVector3f_Sub(XrVector3f* result, const XrVector3f* a, const XrVector3f* b); +inline static void XrVector3f_Min(XrVector3f* result, const XrVector3f* a, const XrVector3f* b); +inline static void XrVector3f_Max(XrVector3f* result, const XrVector3f* a, const XrVector3f* b); +inline static void XrVector3f_Decay(XrVector3f* result, const XrVector3f* a, const float value); +inline static void XrVector3f_Lerp(XrVector3f* result, const XrVector3f* a, const XrVector3f* b, const float fraction); +inline static void XrVector3f_Scale(XrVector3f* result, const XrVector3f* a, const float scaleFactor); +inline static void XrVector3f_Normalize(XrVector3f* v); +inline static float XrVector3f_Length(const XrVector3f* v); + +inline static void XrQuaternionf_Lerp(XrQuaternionf* result, const XrQuaternionf* a, const XrQuaternionf* b, const float fraction); +inline static void XrQuaternionf_Multiply(XrQuaternionf* result, const XrQuaternionf* a, const XrQuaternionf* b; + +inline static void XrMatrix4x4f_CreateIdentity(XrMatrix4x4f* result); +inline static void XrMatrix4x4f_CreateTranslation(XrMatrix4x4f* result, const float x, const float y, const float z); +inline static void XrMatrix4x4f_CreateRotation(XrMatrix4x4f* result, const float degreesX, const float degreesY, + const float degreesZ); +inline static void XrMatrix4x4f_CreateScale(XrMatrix4x4f* result, const float x, const float y, const float z); +inline static void XrMatrix4x4f_CreateTranslationRotationScale(XrMatrix4x4f* result, const XrVector3f* translation, + const XrQuaternionf* rotation, const XrVector3f* scale); +inline static void XrMatrix4x4f_CreateProjection(XrMatrix4x4f* result, const float tanAngleLeft, const float tanAngleRight, + const float tanAngleUp, float const tanAngleDown, const float nearZ, + const float farZ); +inline static void XrMatrix4x4f_CreateProjectionFov(XrMatrix4x4f* result, const float fovDegreesLeft, const float fovDegreesRight, + const float fovDegreeUp, const float fovDegreesDown, const float nearZ, + const float farZ); +inline static void XrMatrix4x4f_CreateFromQuaternion(XrMatrix4x4f* result, const XrQuaternionf* src); +inline static void XrMatrix4x4f_CreateOffsetScaleForBounds(XrMatrix4x4f* result, const XrMatrix4x4f* matrix, const XrVector3f* mins, + const XrVector3f* maxs); + +inline static bool XrMatrix4x4f_IsAffine(const XrMatrix4x4f* matrix, const float epsilon); +inline static bool XrMatrix4x4f_IsOrthogonal(const XrMatrix4x4f* matrix, const float epsilon); +inline static bool XrMatrix4x4f_IsOrthonormal(const XrMatrix4x4f* matrix, const float epsilon); +inline static bool XrMatrix4x4f_IsRigidBody(const XrMatrix4x4f* matrix, const float epsilon); + +inline static void XrMatrix4x4f_GetTranslation(XrVector3f* result, const XrMatrix4x4f* src); +inline static void XrMatrix4x4f_GetRotation(XrQuaternionf* result, const XrMatrix4x4f* src); +inline static void XrMatrix4x4f_GetScale(XrVector3f* result, const XrMatrix4x4f* src); + +inline static void XrMatrix4x4f_Multiply(XrMatrix4x4f* result, const XrMatrix4x4f* a, const XrMatrix4x4f* b); +inline static void XrMatrix4x4f_Transpose(XrMatrix4x4f* result, const XrMatrix4x4f* src); +inline static void XrMatrix4x4f_Invert(XrMatrix4x4f* result, const XrMatrix4x4f* src); +inline static void XrMatrix4x4f_InvertRigidBody(XrMatrix4x4f* result, const XrMatrix4x4f* src); + +inline static void XrMatrix4x4f_TransformVector3f(XrVector3f* result, const XrMatrix4x4f* m, const XrVector3f* v); +inline static void XrMatrix4x4f_TransformVector4f(XrVector4f* result, const XrMatrix4x4f* m, const XrVector4f* v); + +inline static void XrMatrix4x4f_TransformBounds(XrVector3f* resultMins, XrVector3f* resultMaxs, const XrMatrix4x4f* matrix, + const XrVector3f* mins, const XrVector3f* maxs); +inline static bool XrMatrix4x4f_CullBounds(const XrMatrix4x4f* mvp, const XrVector3f* mins, const XrVector3f* maxs); + +================================================================================================ +*/ + +#include +#include +#include + +#define MATH_PI 3.14159265358979323846f + +#define DEFAULT_NEAR_Z 0.015625f // exact floating point representation +#define INFINITE_FAR_Z 0.0f + +static const XrColor4f XrColorRed = {1.0f, 0.0f, 0.0f, 1.0f}; +static const XrColor4f XrColorGreen = {0.0f, 1.0f, 0.0f, 1.0f}; +static const XrColor4f XrColorBlue = {0.0f, 0.0f, 1.0f, 1.0f}; +static const XrColor4f XrColorYellow = {1.0f, 1.0f, 0.0f, 1.0f}; +static const XrColor4f XrColorPurple = {1.0f, 0.0f, 1.0f, 1.0f}; +static const XrColor4f XrColorCyan = {0.0f, 1.0f, 1.0f, 1.0f}; +static const XrColor4f XrColorLightGrey = {0.7f, 0.7f, 0.7f, 1.0f}; +static const XrColor4f XrColorDarkGrey = {0.3f, 0.3f, 0.3f, 1.0f}; + +enum GraphicsAPI { GRAPHICS_VULKAN, GRAPHICS_OPENGL, GRAPHICS_OPENGL_ES, GRAPHICS_D3D }; + +// Column-major, pre-multiplied. This type does not exist in the OpenXR API and is provided for convenience. +struct XrMatrix4x4f { + float m[16]; +}; + +inline static float XrRcpSqrt(const float x) { + const float SMALLEST_NON_DENORMAL = 1.1754943508222875e-038f; // ( 1U << 23 ) + const float rcp = (x >= SMALLEST_NON_DENORMAL) ? 1.0f / sqrtf(x) : 1.0f; + return rcp; +} + +inline static void XrVector3f_Set(XrVector3f* v, const float value) { + v->x = value; + v->y = value; + v->z = value; +} + +inline static void XrVector3f_Add(XrVector3f* result, const XrVector3f* a, const XrVector3f* b) { + result->x = a->x + b->x; + result->y = a->y + b->y; + result->z = a->z + b->z; +} + +inline static void XrVector3f_Sub(XrVector3f* result, const XrVector3f* a, const XrVector3f* b) { + result->x = a->x - b->x; + result->y = a->y - b->y; + result->z = a->z - b->z; +} + +inline static void XrVector3f_Min(XrVector3f* result, const XrVector3f* a, const XrVector3f* b) { + result->x = (a->x < b->x) ? a->x : b->x; + result->y = (a->y < b->y) ? a->y : b->y; + result->z = (a->z < b->z) ? a->z : b->z; +} + +inline static void XrVector3f_Max(XrVector3f* result, const XrVector3f* a, const XrVector3f* b) { + result->x = (a->x > b->x) ? a->x : b->x; + result->y = (a->y > b->y) ? a->y : b->y; + result->z = (a->z > b->z) ? a->z : b->z; +} + +inline static void XrVector3f_Decay(XrVector3f* result, const XrVector3f* a, const float value) { + result->x = (fabsf(a->x) > value) ? ((a->x > 0.0f) ? (a->x - value) : (a->x + value)) : 0.0f; + result->y = (fabsf(a->y) > value) ? ((a->y > 0.0f) ? (a->y - value) : (a->y + value)) : 0.0f; + result->z = (fabsf(a->z) > value) ? ((a->z > 0.0f) ? (a->z - value) : (a->z + value)) : 0.0f; +} + +inline static void XrVector3f_Lerp(XrVector3f* result, const XrVector3f* a, const XrVector3f* b, const float fraction) { + result->x = a->x + fraction * (b->x - a->x); + result->y = a->y + fraction * (b->y - a->y); + result->z = a->z + fraction * (b->z - a->z); +} + +inline static void XrVector3f_Scale(XrVector3f* result, const XrVector3f* a, const float scaleFactor) { + result->x = a->x * scaleFactor; + result->y = a->y * scaleFactor; + result->z = a->z * scaleFactor; +} + +inline static float XrVector3f_Dot(const XrVector3f* a, const XrVector3f* b) { return a->x * b->x + a->y * b->y + a->z * b->z; } + +// Compute cross product, which generates a normal vector. +// Direction vector can be determined by right-hand rule: Pointing index finder in +// direction a and middle finger in direction b, thumb will point in Cross(a, b). +inline static void XrVector3f_Cross(XrVector3f* result, const XrVector3f* a, const XrVector3f* b) { + result->x = a->y * b->z - a->z * b->y; + result->y = a->z * b->x - a->x * b->z; + result->x = a->x * b->y - a->y * b->x; +} + +inline static void XrVector3f_Normalize(XrVector3f* v) { + const float lengthRcp = XrRcpSqrt(v->x * v->x + v->y * v->y + v->z * v->z); + v->x *= lengthRcp; + v->y *= lengthRcp; + v->z *= lengthRcp; +} + +inline static float XrVector3f_Length(const XrVector3f* v) { return sqrtf(v->x * v->x + v->y * v->y + v->z * v->z); } + +inline static void XrQuaternionf_CreateFromAxisAngle(XrQuaternionf* result, const XrVector3f* axis, const float angleInRadians) { + float s = sinf(angleInRadians / 2.0f); + float lengthRcp = XrRcpSqrt(axis->x * axis->x + axis->y * axis->y + axis->z * axis->z); + result->x = s * axis->x * lengthRcp; + result->y = s * axis->y * lengthRcp; + result->z = s * axis->z * lengthRcp; + result->w = cosf(angleInRadians / 2.0f); +} + +inline static void XrQuaternionf_Lerp(XrQuaternionf* result, const XrQuaternionf* a, const XrQuaternionf* b, const float fraction) { + const float s = a->x * b->x + a->y * b->y + a->z * b->z + a->w * b->w; + const float fa = 1.0f - fraction; + const float fb = (s < 0.0f) ? -fraction : fraction; + const float x = a->x * fa + b->x * fb; + const float y = a->y * fa + b->y * fb; + const float z = a->z * fa + b->z * fb; + const float w = a->w * fa + b->w * fb; + const float lengthRcp = XrRcpSqrt(x * x + y * y + z * z + w * w); + result->x = x * lengthRcp; + result->y = y * lengthRcp; + result->z = z * lengthRcp; + result->w = w * lengthRcp; +} + +inline static void XrQuaternionf_Multiply(XrQuaternionf* result, const XrQuaternionf* a, const XrQuaternionf* b) { + result->x = (b->w * a->x) + (b->x * a->w) + (b->y * a->z) - (b->z * a->y); + result->y = (b->w * a->y) - (b->x * a->z) + (b->y * a->w) + (b->z * a->x); + result->z = (b->w * a->z) + (b->x * a->y) - (b->y * a->x) + (b->z * a->w); + result->w = (b->w * a->w) - (b->x * a->x) - (b->y * a->y) - (b->z * a->z); +} + +// Use left-multiplication to accumulate transformations. +inline static void XrMatrix4x4f_Multiply(XrMatrix4x4f* result, const XrMatrix4x4f* a, const XrMatrix4x4f* b) { + result->m[0] = a->m[0] * b->m[0] + a->m[4] * b->m[1] + a->m[8] * b->m[2] + a->m[12] * b->m[3]; + result->m[1] = a->m[1] * b->m[0] + a->m[5] * b->m[1] + a->m[9] * b->m[2] + a->m[13] * b->m[3]; + result->m[2] = a->m[2] * b->m[0] + a->m[6] * b->m[1] + a->m[10] * b->m[2] + a->m[14] * b->m[3]; + result->m[3] = a->m[3] * b->m[0] + a->m[7] * b->m[1] + a->m[11] * b->m[2] + a->m[15] * b->m[3]; + + result->m[4] = a->m[0] * b->m[4] + a->m[4] * b->m[5] + a->m[8] * b->m[6] + a->m[12] * b->m[7]; + result->m[5] = a->m[1] * b->m[4] + a->m[5] * b->m[5] + a->m[9] * b->m[6] + a->m[13] * b->m[7]; + result->m[6] = a->m[2] * b->m[4] + a->m[6] * b->m[5] + a->m[10] * b->m[6] + a->m[14] * b->m[7]; + result->m[7] = a->m[3] * b->m[4] + a->m[7] * b->m[5] + a->m[11] * b->m[6] + a->m[15] * b->m[7]; + + result->m[8] = a->m[0] * b->m[8] + a->m[4] * b->m[9] + a->m[8] * b->m[10] + a->m[12] * b->m[11]; + result->m[9] = a->m[1] * b->m[8] + a->m[5] * b->m[9] + a->m[9] * b->m[10] + a->m[13] * b->m[11]; + result->m[10] = a->m[2] * b->m[8] + a->m[6] * b->m[9] + a->m[10] * b->m[10] + a->m[14] * b->m[11]; + result->m[11] = a->m[3] * b->m[8] + a->m[7] * b->m[9] + a->m[11] * b->m[10] + a->m[15] * b->m[11]; + + result->m[12] = a->m[0] * b->m[12] + a->m[4] * b->m[13] + a->m[8] * b->m[14] + a->m[12] * b->m[15]; + result->m[13] = a->m[1] * b->m[12] + a->m[5] * b->m[13] + a->m[9] * b->m[14] + a->m[13] * b->m[15]; + result->m[14] = a->m[2] * b->m[12] + a->m[6] * b->m[13] + a->m[10] * b->m[14] + a->m[14] * b->m[15]; + result->m[15] = a->m[3] * b->m[12] + a->m[7] * b->m[13] + a->m[11] * b->m[14] + a->m[15] * b->m[15]; +} + +// Creates the transpose of the given matrix. +inline static void XrMatrix4x4f_Transpose(XrMatrix4x4f* result, const XrMatrix4x4f* src) { + result->m[0] = src->m[0]; + result->m[1] = src->m[4]; + result->m[2] = src->m[8]; + result->m[3] = src->m[12]; + + result->m[4] = src->m[1]; + result->m[5] = src->m[5]; + result->m[6] = src->m[9]; + result->m[7] = src->m[13]; + + result->m[8] = src->m[2]; + result->m[9] = src->m[6]; + result->m[10] = src->m[10]; + result->m[11] = src->m[14]; + + result->m[12] = src->m[3]; + result->m[13] = src->m[7]; + result->m[14] = src->m[11]; + result->m[15] = src->m[15]; +} + +// Returns a 3x3 minor of a 4x4 matrix. +inline static float XrMatrix4x4f_Minor(const XrMatrix4x4f* matrix, int r0, int r1, int r2, int c0, int c1, int c2) { + return matrix->m[4 * r0 + c0] * + (matrix->m[4 * r1 + c1] * matrix->m[4 * r2 + c2] - matrix->m[4 * r2 + c1] * matrix->m[4 * r1 + c2]) - + matrix->m[4 * r0 + c1] * + (matrix->m[4 * r1 + c0] * matrix->m[4 * r2 + c2] - matrix->m[4 * r2 + c0] * matrix->m[4 * r1 + c2]) + + matrix->m[4 * r0 + c2] * + (matrix->m[4 * r1 + c0] * matrix->m[4 * r2 + c1] - matrix->m[4 * r2 + c0] * matrix->m[4 * r1 + c1]); +} + +// Calculates the inverse of a 4x4 matrix. +inline static void XrMatrix4x4f_Invert(XrMatrix4x4f* result, const XrMatrix4x4f* src) { + const float rcpDet = + 1.0f / (src->m[0] * XrMatrix4x4f_Minor(src, 1, 2, 3, 1, 2, 3) - src->m[1] * XrMatrix4x4f_Minor(src, 1, 2, 3, 0, 2, 3) + + src->m[2] * XrMatrix4x4f_Minor(src, 1, 2, 3, 0, 1, 3) - src->m[3] * XrMatrix4x4f_Minor(src, 1, 2, 3, 0, 1, 2)); + + result->m[0] = XrMatrix4x4f_Minor(src, 1, 2, 3, 1, 2, 3) * rcpDet; + result->m[1] = -XrMatrix4x4f_Minor(src, 0, 2, 3, 1, 2, 3) * rcpDet; + result->m[2] = XrMatrix4x4f_Minor(src, 0, 1, 3, 1, 2, 3) * rcpDet; + result->m[3] = -XrMatrix4x4f_Minor(src, 0, 1, 2, 1, 2, 3) * rcpDet; + result->m[4] = -XrMatrix4x4f_Minor(src, 1, 2, 3, 0, 2, 3) * rcpDet; + result->m[5] = XrMatrix4x4f_Minor(src, 0, 2, 3, 0, 2, 3) * rcpDet; + result->m[6] = -XrMatrix4x4f_Minor(src, 0, 1, 3, 0, 2, 3) * rcpDet; + result->m[7] = XrMatrix4x4f_Minor(src, 0, 1, 2, 0, 2, 3) * rcpDet; + result->m[8] = XrMatrix4x4f_Minor(src, 1, 2, 3, 0, 1, 3) * rcpDet; + result->m[9] = -XrMatrix4x4f_Minor(src, 0, 2, 3, 0, 1, 3) * rcpDet; + result->m[10] = XrMatrix4x4f_Minor(src, 0, 1, 3, 0, 1, 3) * rcpDet; + result->m[11] = -XrMatrix4x4f_Minor(src, 0, 1, 2, 0, 1, 3) * rcpDet; + result->m[12] = -XrMatrix4x4f_Minor(src, 1, 2, 3, 0, 1, 2) * rcpDet; + result->m[13] = XrMatrix4x4f_Minor(src, 0, 2, 3, 0, 1, 2) * rcpDet; + result->m[14] = -XrMatrix4x4f_Minor(src, 0, 1, 3, 0, 1, 2) * rcpDet; + result->m[15] = XrMatrix4x4f_Minor(src, 0, 1, 2, 0, 1, 2) * rcpDet; +} + +// Calculates the inverse of a rigid body transform. +inline static void XrMatrix4x4f_InvertRigidBody(XrMatrix4x4f* result, const XrMatrix4x4f* src) { + result->m[0] = src->m[0]; + result->m[1] = src->m[4]; + result->m[2] = src->m[8]; + result->m[3] = 0.0f; + result->m[4] = src->m[1]; + result->m[5] = src->m[5]; + result->m[6] = src->m[9]; + result->m[7] = 0.0f; + result->m[8] = src->m[2]; + result->m[9] = src->m[6]; + result->m[10] = src->m[10]; + result->m[11] = 0.0f; + result->m[12] = -(src->m[0] * src->m[12] + src->m[1] * src->m[13] + src->m[2] * src->m[14]); + result->m[13] = -(src->m[4] * src->m[12] + src->m[5] * src->m[13] + src->m[6] * src->m[14]); + result->m[14] = -(src->m[8] * src->m[12] + src->m[9] * src->m[13] + src->m[10] * src->m[14]); + result->m[15] = 1.0f; +} + +// Creates an identity matrix. +inline static void XrMatrix4x4f_CreateIdentity(XrMatrix4x4f* result) { + result->m[0] = 1.0f; + result->m[1] = 0.0f; + result->m[2] = 0.0f; + result->m[3] = 0.0f; + result->m[4] = 0.0f; + result->m[5] = 1.0f; + result->m[6] = 0.0f; + result->m[7] = 0.0f; + result->m[8] = 0.0f; + result->m[9] = 0.0f; + result->m[10] = 1.0f; + result->m[11] = 0.0f; + result->m[12] = 0.0f; + result->m[13] = 0.0f; + result->m[14] = 0.0f; + result->m[15] = 1.0f; +} + +// Creates a translation matrix. +inline static void XrMatrix4x4f_CreateTranslation(XrMatrix4x4f* result, const float x, const float y, const float z) { + result->m[0] = 1.0f; + result->m[1] = 0.0f; + result->m[2] = 0.0f; + result->m[3] = 0.0f; + result->m[4] = 0.0f; + result->m[5] = 1.0f; + result->m[6] = 0.0f; + result->m[7] = 0.0f; + result->m[8] = 0.0f; + result->m[9] = 0.0f; + result->m[10] = 1.0f; + result->m[11] = 0.0f; + result->m[12] = x; + result->m[13] = y; + result->m[14] = z; + result->m[15] = 1.0f; +} + +// Creates a rotation matrix. +// If -Z=forward, +Y=up, +X=right, then degreesX=pitch, degreesY=yaw, degreesZ=roll. +inline static void XrMatrix4x4f_CreateRotation(XrMatrix4x4f* result, const float degreesX, const float degreesY, + const float degreesZ) { + const float sinX = sinf(degreesX * (MATH_PI / 180.0f)); + const float cosX = cosf(degreesX * (MATH_PI / 180.0f)); + const XrMatrix4x4f rotationX = {{1, 0, 0, 0, 0, cosX, sinX, 0, 0, -sinX, cosX, 0, 0, 0, 0, 1}}; + const float sinY = sinf(degreesY * (MATH_PI / 180.0f)); + const float cosY = cosf(degreesY * (MATH_PI / 180.0f)); + const XrMatrix4x4f rotationY = {{cosY, 0, -sinY, 0, 0, 1, 0, 0, sinY, 0, cosY, 0, 0, 0, 0, 1}}; + const float sinZ = sinf(degreesZ * (MATH_PI / 180.0f)); + const float cosZ = cosf(degreesZ * (MATH_PI / 180.0f)); + const XrMatrix4x4f rotationZ = {{cosZ, sinZ, 0, 0, -sinZ, cosZ, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}}; + XrMatrix4x4f rotationXY; + XrMatrix4x4f_Multiply(&rotationXY, &rotationY, &rotationX); + XrMatrix4x4f_Multiply(result, &rotationZ, &rotationXY); +} + +// Creates a scale matrix. +inline static void XrMatrix4x4f_CreateScale(XrMatrix4x4f* result, const float x, const float y, const float z) { + result->m[0] = x; + result->m[1] = 0.0f; + result->m[2] = 0.0f; + result->m[3] = 0.0f; + result->m[4] = 0.0f; + result->m[5] = y; + result->m[6] = 0.0f; + result->m[7] = 0.0f; + result->m[8] = 0.0f; + result->m[9] = 0.0f; + result->m[10] = z; + result->m[11] = 0.0f; + result->m[12] = 0.0f; + result->m[13] = 0.0f; + result->m[14] = 0.0f; + result->m[15] = 1.0f; +} + +// Creates a matrix from a quaternion. +inline static void XrMatrix4x4f_CreateFromQuaternion(XrMatrix4x4f* result, const XrQuaternionf* quat) { + const float x2 = quat->x + quat->x; + const float y2 = quat->y + quat->y; + const float z2 = quat->z + quat->z; + + const float xx2 = quat->x * x2; + const float yy2 = quat->y * y2; + const float zz2 = quat->z * z2; + + const float yz2 = quat->y * z2; + const float wx2 = quat->w * x2; + const float xy2 = quat->x * y2; + const float wz2 = quat->w * z2; + const float xz2 = quat->x * z2; + const float wy2 = quat->w * y2; + + result->m[0] = 1.0f - yy2 - zz2; + result->m[1] = xy2 + wz2; + result->m[2] = xz2 - wy2; + result->m[3] = 0.0f; + + result->m[4] = xy2 - wz2; + result->m[5] = 1.0f - xx2 - zz2; + result->m[6] = yz2 + wx2; + result->m[7] = 0.0f; + + result->m[8] = xz2 + wy2; + result->m[9] = yz2 - wx2; + result->m[10] = 1.0f - xx2 - yy2; + result->m[11] = 0.0f; + + result->m[12] = 0.0f; + result->m[13] = 0.0f; + result->m[14] = 0.0f; + result->m[15] = 1.0f; +} + +// Creates a combined translation(rotation(scale(object))) matrix. +inline static void XrMatrix4x4f_CreateTranslationRotationScale(XrMatrix4x4f* result, const XrVector3f* translation, + const XrQuaternionf* rotation, const XrVector3f* scale) { + XrMatrix4x4f scaleMatrix; + XrMatrix4x4f_CreateScale(&scaleMatrix, scale->x, scale->y, scale->z); + + XrMatrix4x4f rotationMatrix; + XrMatrix4x4f_CreateFromQuaternion(&rotationMatrix, rotation); + + XrMatrix4x4f translationMatrix; + XrMatrix4x4f_CreateTranslation(&translationMatrix, translation->x, translation->y, translation->z); + + XrMatrix4x4f combinedMatrix; + XrMatrix4x4f_Multiply(&combinedMatrix, &rotationMatrix, &scaleMatrix); + XrMatrix4x4f_Multiply(result, &translationMatrix, &combinedMatrix); +} + +// Creates a projection matrix based on the specified dimensions. +// The projection matrix transforms -Z=forward, +Y=up, +X=right to the appropriate clip space for the graphics API. +// The far plane is placed at infinity if farZ <= nearZ. +// An infinite projection matrix is preferred for rasterization because, except for +// things *right* up against the near plane, it always provides better precision: +// "Tightening the Precision of Perspective Rendering" +// Paul Upchurch, Mathieu Desbrun +// Journal of Graphics Tools, Volume 16, Issue 1, 2012 +inline static void XrMatrix4x4f_CreateProjection(XrMatrix4x4f* result, GraphicsAPI graphicsApi, const float tanAngleLeft, + const float tanAngleRight, const float tanAngleUp, float const tanAngleDown, + const float nearZ, const float farZ) { + const float tanAngleWidth = tanAngleRight - tanAngleLeft; + + // Set to tanAngleDown - tanAngleUp for a clip space with positive Y down (Vulkan). + // Set to tanAngleUp - tanAngleDown for a clip space with positive Y up (OpenGL / D3D / Metal). + const float tanAngleHeight = graphicsApi == GRAPHICS_VULKAN ? (tanAngleDown - tanAngleUp) : (tanAngleUp - tanAngleDown); + + // Set to nearZ for a [-1,1] Z clip space (OpenGL / OpenGL ES). + // Set to zero for a [0,1] Z clip space (Vulkan / D3D / Metal). + const float offsetZ = (graphicsApi == GRAPHICS_OPENGL || graphicsApi == GRAPHICS_OPENGL_ES) ? nearZ : 0; + + if (farZ <= nearZ) { + // place the far plane at infinity + result->m[0] = 2.0f / tanAngleWidth; + result->m[4] = 0.0f; + result->m[8] = (tanAngleRight + tanAngleLeft) / tanAngleWidth; + result->m[12] = 0.0f; + + result->m[1] = 0.0f; + result->m[5] = 2.0f / tanAngleHeight; + result->m[9] = (tanAngleUp + tanAngleDown) / tanAngleHeight; + result->m[13] = 0.0f; + + result->m[2] = 0.0f; + result->m[6] = 0.0f; + result->m[10] = -1.0f; + result->m[14] = -(nearZ + offsetZ); + + result->m[3] = 0.0f; + result->m[7] = 0.0f; + result->m[11] = -1.0f; + result->m[15] = 0.0f; + } else { + // normal projection + result->m[0] = 2.0f / tanAngleWidth; + result->m[4] = 0.0f; + result->m[8] = (tanAngleRight + tanAngleLeft) / tanAngleWidth; + result->m[12] = 0.0f; + + result->m[1] = 0.0f; + result->m[5] = 2.0f / tanAngleHeight; + result->m[9] = (tanAngleUp + tanAngleDown) / tanAngleHeight; + result->m[13] = 0.0f; + + result->m[2] = 0.0f; + result->m[6] = 0.0f; + result->m[10] = -(farZ + offsetZ) / (farZ - nearZ); + result->m[14] = -(farZ * (nearZ + offsetZ)) / (farZ - nearZ); + + result->m[3] = 0.0f; + result->m[7] = 0.0f; + result->m[11] = -1.0f; + result->m[15] = 0.0f; + } +} + +// Creates a projection matrix based on the specified FOV. +inline static void XrMatrix4x4f_CreateProjectionFov(XrMatrix4x4f* result, GraphicsAPI graphicsApi, const XrFovf fov, + const float nearZ, const float farZ) { + const float tanLeft = tanf(fov.angleLeft); + const float tanRight = tanf(fov.angleRight); + + const float tanDown = tanf(fov.angleDown); + const float tanUp = tanf(fov.angleUp); + + XrMatrix4x4f_CreateProjection(result, graphicsApi, tanLeft, tanRight, tanUp, tanDown, nearZ, farZ); +} + +// Creates a matrix that transforms the -1 to 1 cube to cover the given 'mins' and 'maxs' transformed with the given 'matrix'. +inline static void XrMatrix4x4f_CreateOffsetScaleForBounds(XrMatrix4x4f* result, const XrMatrix4x4f* matrix, const XrVector3f* mins, + const XrVector3f* maxs) { + const XrVector3f offset = {(maxs->x + mins->x) * 0.5f, (maxs->y + mins->y) * 0.5f, (maxs->z + mins->z) * 0.5f}; + const XrVector3f scale = {(maxs->x - mins->x) * 0.5f, (maxs->y - mins->y) * 0.5f, (maxs->z - mins->z) * 0.5f}; + + result->m[0] = matrix->m[0] * scale.x; + result->m[1] = matrix->m[1] * scale.x; + result->m[2] = matrix->m[2] * scale.x; + result->m[3] = matrix->m[3] * scale.x; + + result->m[4] = matrix->m[4] * scale.y; + result->m[5] = matrix->m[5] * scale.y; + result->m[6] = matrix->m[6] * scale.y; + result->m[7] = matrix->m[7] * scale.y; + + result->m[8] = matrix->m[8] * scale.z; + result->m[9] = matrix->m[9] * scale.z; + result->m[10] = matrix->m[10] * scale.z; + result->m[11] = matrix->m[11] * scale.z; + + result->m[12] = matrix->m[12] + matrix->m[0] * offset.x + matrix->m[4] * offset.y + matrix->m[8] * offset.z; + result->m[13] = matrix->m[13] + matrix->m[1] * offset.x + matrix->m[5] * offset.y + matrix->m[9] * offset.z; + result->m[14] = matrix->m[14] + matrix->m[2] * offset.x + matrix->m[6] * offset.y + matrix->m[10] * offset.z; + result->m[15] = matrix->m[15] + matrix->m[3] * offset.x + matrix->m[7] * offset.y + matrix->m[11] * offset.z; +} + +// Returns true if the given matrix is affine. +inline static bool XrMatrix4x4f_IsAffine(const XrMatrix4x4f* matrix, const float epsilon) { + return fabsf(matrix->m[3]) <= epsilon && fabsf(matrix->m[7]) <= epsilon && fabsf(matrix->m[11]) <= epsilon && + fabsf(matrix->m[15] - 1.0f) <= epsilon; +} + +// Returns true if the given matrix is orthogonal. +inline static bool XrMatrix4x4f_IsOrthogonal(const XrMatrix4x4f* matrix, const float epsilon) { + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (i != j) { + if (fabsf(matrix->m[4 * i + 0] * matrix->m[4 * j + 0] + matrix->m[4 * i + 1] * matrix->m[4 * j + 1] + + matrix->m[4 * i + 2] * matrix->m[4 * j + 2]) > epsilon) { + return false; + } + if (fabsf(matrix->m[4 * 0 + i] * matrix->m[4 * 0 + j] + matrix->m[4 * 1 + i] * matrix->m[4 * 1 + j] + + matrix->m[4 * 2 + i] * matrix->m[4 * 2 + j]) > epsilon) { + return false; + } + } + } + } + return true; +} + +// Returns true if the given matrix is orthonormal. +inline static bool XrMatrix4x4f_IsOrthonormal(const XrMatrix4x4f* matrix, const float epsilon) { + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + const float kd = (i == j) ? 1.0f : 0.0f; // Kronecker delta + if (fabsf(kd - (matrix->m[4 * i + 0] * matrix->m[4 * j + 0] + matrix->m[4 * i + 1] * matrix->m[4 * j + 1] + + matrix->m[4 * i + 2] * matrix->m[4 * j + 2])) > epsilon) { + return false; + } + if (fabsf(kd - (matrix->m[4 * 0 + i] * matrix->m[4 * 0 + j] + matrix->m[4 * 1 + i] * matrix->m[4 * 1 + j] + + matrix->m[4 * 2 + i] * matrix->m[4 * 2 + j])) > epsilon) { + return false; + } + } + } + return true; +} + +// Returns true if the given matrix is a rigid body transform. +inline static bool XrMatrix4x4f_IsRigidBody(const XrMatrix4x4f* matrix, const float epsilon) { + return XrMatrix4x4f_IsAffine(matrix, epsilon) && XrMatrix4x4f_IsOrthonormal(matrix, epsilon); +} + +// Get the translation from a combined translation(rotation(scale(object))) matrix. +inline static void XrMatrix4x4f_GetTranslation(XrVector3f* result, const XrMatrix4x4f* src) { + assert(XrMatrix4x4f_IsAffine(src, 1e-4f)); + assert(XrMatrix4x4f_IsOrthogonal(src, 1e-4f)); + + result->x = src->m[12]; + result->y = src->m[13]; + result->z = src->m[14]; +} + +// Get the rotation from a combined translation(rotation(scale(object))) matrix. +inline static void XrMatrix4x4f_GetRotation(XrQuaternionf* result, const XrMatrix4x4f* src) { + assert(XrMatrix4x4f_IsAffine(src, 1e-4f)); + assert(XrMatrix4x4f_IsOrthogonal(src, 1e-4f)); + + const float rcpScaleX = XrRcpSqrt(src->m[0] * src->m[0] + src->m[1] * src->m[1] + src->m[2] * src->m[2]); + const float rcpScaleY = XrRcpSqrt(src->m[4] * src->m[4] + src->m[5] * src->m[5] + src->m[6] * src->m[6]); + const float rcpScaleZ = XrRcpSqrt(src->m[8] * src->m[8] + src->m[9] * src->m[9] + src->m[10] * src->m[10]); + const float m[9] = {src->m[0] * rcpScaleX, src->m[1] * rcpScaleX, src->m[2] * rcpScaleX, + src->m[4] * rcpScaleY, src->m[5] * rcpScaleY, src->m[6] * rcpScaleY, + src->m[8] * rcpScaleZ, src->m[9] * rcpScaleZ, src->m[10] * rcpScaleZ}; + if (m[0 * 3 + 0] + m[1 * 3 + 1] + m[2 * 3 + 2] > 0.0f) { + float t = +m[0 * 3 + 0] + m[1 * 3 + 1] + m[2 * 3 + 2] + 1.0f; + float s = XrRcpSqrt(t) * 0.5f; + result->w = s * t; + result->z = (m[0 * 3 + 1] - m[1 * 3 + 0]) * s; + result->y = (m[2 * 3 + 0] - m[0 * 3 + 2]) * s; + result->x = (m[1 * 3 + 2] - m[2 * 3 + 1]) * s; + } else if (m[0 * 3 + 0] > m[1 * 3 + 1] && m[0 * 3 + 0] > m[2 * 3 + 2]) { + float t = +m[0 * 3 + 0] - m[1 * 3 + 1] - m[2 * 3 + 2] + 1.0f; + float s = XrRcpSqrt(t) * 0.5f; + result->x = s * t; + result->y = (m[0 * 3 + 1] + m[1 * 3 + 0]) * s; + result->z = (m[2 * 3 + 0] + m[0 * 3 + 2]) * s; + result->w = (m[1 * 3 + 2] - m[2 * 3 + 1]) * s; + } else if (m[1 * 3 + 1] > m[2 * 3 + 2]) { + float t = -m[0 * 3 + 0] + m[1 * 3 + 1] - m[2 * 3 + 2] + 1.0f; + float s = XrRcpSqrt(t) * 0.5f; + result->y = s * t; + result->x = (m[0 * 3 + 1] + m[1 * 3 + 0]) * s; + result->w = (m[2 * 3 + 0] - m[0 * 3 + 2]) * s; + result->z = (m[1 * 3 + 2] + m[2 * 3 + 1]) * s; + } else { + float t = -m[0 * 3 + 0] - m[1 * 3 + 1] + m[2 * 3 + 2] + 1.0f; + float s = XrRcpSqrt(t) * 0.5f; + result->z = s * t; + result->w = (m[0 * 3 + 1] - m[1 * 3 + 0]) * s; + result->x = (m[2 * 3 + 0] + m[0 * 3 + 2]) * s; + result->y = (m[1 * 3 + 2] + m[2 * 3 + 1]) * s; + } +} + +// Get the scale from a combined translation(rotation(scale(object))) matrix. +inline static void XrMatrix4x4f_GetScale(XrVector3f* result, const XrMatrix4x4f* src) { + assert(XrMatrix4x4f_IsAffine(src, 1e-4f)); + assert(XrMatrix4x4f_IsOrthogonal(src, 1e-4f)); + + result->x = sqrtf(src->m[0] * src->m[0] + src->m[1] * src->m[1] + src->m[2] * src->m[2]); + result->y = sqrtf(src->m[4] * src->m[4] + src->m[5] * src->m[5] + src->m[6] * src->m[6]); + result->z = sqrtf(src->m[8] * src->m[8] + src->m[9] * src->m[9] + src->m[10] * src->m[10]); +} + +// Transforms a 3D vector. +inline static void XrMatrix4x4f_TransformVector3f(XrVector3f* result, const XrMatrix4x4f* m, const XrVector3f* v) { + const float w = m->m[3] * v->x + m->m[7] * v->y + m->m[11] * v->z + m->m[15]; + const float rcpW = 1.0f / w; + result->x = (m->m[0] * v->x + m->m[4] * v->y + m->m[8] * v->z + m->m[12]) * rcpW; + result->y = (m->m[1] * v->x + m->m[5] * v->y + m->m[9] * v->z + m->m[13]) * rcpW; + result->z = (m->m[2] * v->x + m->m[6] * v->y + m->m[10] * v->z + m->m[14]) * rcpW; +} + +// Transforms a 4D vector. +inline static void XrMatrix4x4f_TransformVector4f(XrVector4f* result, const XrMatrix4x4f* m, const XrVector4f* v) { + result->x = m->m[0] * v->x + m->m[4] * v->y + m->m[8] * v->z + m->m[12] * v->w; + result->y = m->m[1] * v->x + m->m[5] * v->y + m->m[9] * v->z + m->m[13] * v->w; + result->z = m->m[2] * v->x + m->m[6] * v->y + m->m[10] * v->z + m->m[14] * v->w; + result->w = m->m[3] * v->x + m->m[7] * v->y + m->m[11] * v->z + m->m[15] * v->w; +} + +// Transforms the 'mins' and 'maxs' bounds with the given 'matrix'. +inline static void XrMatrix4x4f_TransformBounds(XrVector3f* resultMins, XrVector3f* resultMaxs, const XrMatrix4x4f* matrix, + const XrVector3f* mins, const XrVector3f* maxs) { + assert(XrMatrix4x4f_IsAffine(matrix, 1e-4f)); + + const XrVector3f center = {(mins->x + maxs->x) * 0.5f, (mins->y + maxs->y) * 0.5f, (mins->z + maxs->z) * 0.5f}; + const XrVector3f extents = {maxs->x - center.x, maxs->y - center.y, maxs->z - center.z}; + const XrVector3f newCenter = {matrix->m[0] * center.x + matrix->m[4] * center.y + matrix->m[8] * center.z + matrix->m[12], + matrix->m[1] * center.x + matrix->m[5] * center.y + matrix->m[9] * center.z + matrix->m[13], + matrix->m[2] * center.x + matrix->m[6] * center.y + matrix->m[10] * center.z + matrix->m[14]}; + const XrVector3f newExtents = { + fabsf(extents.x * matrix->m[0]) + fabsf(extents.y * matrix->m[4]) + fabsf(extents.z * matrix->m[8]), + fabsf(extents.x * matrix->m[1]) + fabsf(extents.y * matrix->m[5]) + fabsf(extents.z * matrix->m[9]), + fabsf(extents.x * matrix->m[2]) + fabsf(extents.y * matrix->m[6]) + fabsf(extents.z * matrix->m[10])}; + XrVector3f_Sub(resultMins, &newCenter, &newExtents); + XrVector3f_Add(resultMaxs, &newCenter, &newExtents); +} + +// Returns true if the 'mins' and 'maxs' bounds is completely off to one side of the projection matrix. +inline static bool XrMatrix4x4f_CullBounds(const XrMatrix4x4f* mvp, const XrVector3f* mins, const XrVector3f* maxs) { + if (maxs->x <= mins->x && maxs->y <= mins->y && maxs->z <= mins->z) { + return false; + } + + XrVector4f c[8]; + for (int i = 0; i < 8; i++) { + const XrVector4f corner = {(i & 1) != 0 ? maxs->x : mins->x, (i & 2) != 0 ? maxs->y : mins->y, + (i & 4) != 0 ? maxs->z : mins->z, 1.0f}; + XrMatrix4x4f_TransformVector4f(&c[i], mvp, &corner); + } + + int i; + for (i = 0; i < 8; i++) { + if (c[i].x > -c[i].w) { + break; + } + } + if (i == 8) { + return true; + } + for (i = 0; i < 8; i++) { + if (c[i].x < c[i].w) { + break; + } + } + if (i == 8) { + return true; + } + + for (i = 0; i < 8; i++) { + if (c[i].y > -c[i].w) { + break; + } + } + if (i == 8) { + return true; + } + for (i = 0; i < 8; i++) { + if (c[i].y < c[i].w) { + break; + } + } + if (i == 8) { + return true; + } + for (i = 0; i < 8; i++) { + if (c[i].z > -c[i].w) { + break; + } + } + if (i == 8) { + return true; + } + for (i = 0; i < 8; i++) { + if (c[i].z < c[i].w) { + break; + } + } + return i == 8; +} + +#endif // XR_LINEAR_H_ diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr.h new file mode 100644 index 0000000..ae231ec --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr.h @@ -0,0 +1,3212 @@ +#ifndef OPENXR_H_ +#define OPENXR_H_ 1 + +/* +** Copyright (c) 2017-2021, The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 OR MIT +*/ + +/* +** This header is generated from the Khronos OpenXR XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define XR_VERSION_1_0 1 +#include "openxr_platform_defines.h" +#define XR_MAKE_VERSION(major, minor, patch) \ + ((((major) & 0xffffULL) << 48) | (((minor) & 0xffffULL) << 32) | ((patch) & 0xffffffffULL)) + +// OpenXR current version number. +#define XR_CURRENT_API_VERSION XR_MAKE_VERSION(1, 0, 17) + +#define XR_VERSION_MAJOR(version) (uint16_t)(((uint64_t)(version) >> 48)& 0xffffULL) +#define XR_VERSION_MINOR(version) (uint16_t)(((uint64_t)(version) >> 32) & 0xffffULL) +#define XR_VERSION_PATCH(version) (uint32_t)((uint64_t)(version) & 0xffffffffULL) + +#if !defined(XR_NULL_HANDLE) +#if (XR_PTR_SIZE == 8) && XR_CPP_NULLPTR_SUPPORTED + #define XR_NULL_HANDLE nullptr +#else + #define XR_NULL_HANDLE 0 +#endif +#endif + + + +#define XR_NULL_SYSTEM_ID 0 + + +#define XR_NULL_PATH 0 + + +#define XR_SUCCEEDED(result) ((result) >= 0) + + +#define XR_FAILED(result) ((result) < 0) + + +#define XR_UNQUALIFIED_SUCCESS(result) ((result) == 0) + + +#define XR_NO_DURATION 0 + + +#define XR_INFINITE_DURATION 0x7fffffffffffffffLL + + +#define XR_MIN_HAPTIC_DURATION -1 + + +#define XR_FREQUENCY_UNSPECIFIED 0 + + +#define XR_MAX_EVENT_DATA_SIZE sizeof(XrEventDataBuffer) + + +#if !defined(XR_MAY_ALIAS) +#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4)) +#define XR_MAY_ALIAS __attribute__((__may_alias__)) +#else +#define XR_MAY_ALIAS +#endif +#endif + + +#if !defined(XR_DEFINE_HANDLE) +#if (XR_PTR_SIZE == 8) + #define XR_DEFINE_HANDLE(object) typedef struct object##_T* object; +#else + #define XR_DEFINE_HANDLE(object) typedef uint64_t object; +#endif +#endif + + + +#if !defined(XR_DEFINE_ATOM) + #define XR_DEFINE_ATOM(object) typedef uint64_t object; +#endif + + +typedef uint64_t XrVersion; +typedef uint64_t XrFlags64; +XR_DEFINE_ATOM(XrSystemId) +typedef uint32_t XrBool32; +XR_DEFINE_ATOM(XrPath) +typedef int64_t XrTime; +typedef int64_t XrDuration; +XR_DEFINE_HANDLE(XrInstance) +XR_DEFINE_HANDLE(XrSession) +XR_DEFINE_HANDLE(XrSpace) +XR_DEFINE_HANDLE(XrAction) +XR_DEFINE_HANDLE(XrSwapchain) +XR_DEFINE_HANDLE(XrActionSet) +#define XR_TRUE 1 +#define XR_FALSE 0 +#define XR_MAX_EXTENSION_NAME_SIZE 128 +#define XR_MAX_API_LAYER_NAME_SIZE 256 +#define XR_MAX_API_LAYER_DESCRIPTION_SIZE 256 +#define XR_MAX_SYSTEM_NAME_SIZE 256 +#define XR_MAX_APPLICATION_NAME_SIZE 128 +#define XR_MAX_ENGINE_NAME_SIZE 128 +#define XR_MAX_RUNTIME_NAME_SIZE 128 +#define XR_MAX_PATH_LENGTH 256 +#define XR_MAX_STRUCTURE_NAME_SIZE 64 +#define XR_MAX_RESULT_STRING_SIZE 64 +#define XR_MIN_COMPOSITION_LAYERS_SUPPORTED 16 +#define XR_MAX_ACTION_SET_NAME_SIZE 64 +#define XR_MAX_LOCALIZED_ACTION_SET_NAME_SIZE 128 +#define XR_MAX_ACTION_NAME_SIZE 64 +#define XR_MAX_LOCALIZED_ACTION_NAME_SIZE 128 + +typedef enum XrResult { + XR_SUCCESS = 0, + XR_TIMEOUT_EXPIRED = 1, + XR_SESSION_LOSS_PENDING = 3, + XR_EVENT_UNAVAILABLE = 4, + XR_SPACE_BOUNDS_UNAVAILABLE = 7, + XR_SESSION_NOT_FOCUSED = 8, + XR_FRAME_DISCARDED = 9, + XR_ERROR_VALIDATION_FAILURE = -1, + XR_ERROR_RUNTIME_FAILURE = -2, + XR_ERROR_OUT_OF_MEMORY = -3, + XR_ERROR_API_VERSION_UNSUPPORTED = -4, + XR_ERROR_INITIALIZATION_FAILED = -6, + XR_ERROR_FUNCTION_UNSUPPORTED = -7, + XR_ERROR_FEATURE_UNSUPPORTED = -8, + XR_ERROR_EXTENSION_NOT_PRESENT = -9, + XR_ERROR_LIMIT_REACHED = -10, + XR_ERROR_SIZE_INSUFFICIENT = -11, + XR_ERROR_HANDLE_INVALID = -12, + XR_ERROR_INSTANCE_LOST = -13, + XR_ERROR_SESSION_RUNNING = -14, + XR_ERROR_SESSION_NOT_RUNNING = -16, + XR_ERROR_SESSION_LOST = -17, + XR_ERROR_SYSTEM_INVALID = -18, + XR_ERROR_PATH_INVALID = -19, + XR_ERROR_PATH_COUNT_EXCEEDED = -20, + XR_ERROR_PATH_FORMAT_INVALID = -21, + XR_ERROR_PATH_UNSUPPORTED = -22, + XR_ERROR_LAYER_INVALID = -23, + XR_ERROR_LAYER_LIMIT_EXCEEDED = -24, + XR_ERROR_SWAPCHAIN_RECT_INVALID = -25, + XR_ERROR_SWAPCHAIN_FORMAT_UNSUPPORTED = -26, + XR_ERROR_ACTION_TYPE_MISMATCH = -27, + XR_ERROR_SESSION_NOT_READY = -28, + XR_ERROR_SESSION_NOT_STOPPING = -29, + XR_ERROR_TIME_INVALID = -30, + XR_ERROR_REFERENCE_SPACE_UNSUPPORTED = -31, + XR_ERROR_FILE_ACCESS_ERROR = -32, + XR_ERROR_FILE_CONTENTS_INVALID = -33, + XR_ERROR_FORM_FACTOR_UNSUPPORTED = -34, + XR_ERROR_FORM_FACTOR_UNAVAILABLE = -35, + XR_ERROR_API_LAYER_NOT_PRESENT = -36, + XR_ERROR_CALL_ORDER_INVALID = -37, + XR_ERROR_GRAPHICS_DEVICE_INVALID = -38, + XR_ERROR_POSE_INVALID = -39, + XR_ERROR_INDEX_OUT_OF_RANGE = -40, + XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED = -41, + XR_ERROR_ENVIRONMENT_BLEND_MODE_UNSUPPORTED = -42, + XR_ERROR_NAME_DUPLICATED = -44, + XR_ERROR_NAME_INVALID = -45, + XR_ERROR_ACTIONSET_NOT_ATTACHED = -46, + XR_ERROR_ACTIONSETS_ALREADY_ATTACHED = -47, + XR_ERROR_LOCALIZED_NAME_DUPLICATED = -48, + XR_ERROR_LOCALIZED_NAME_INVALID = -49, + XR_ERROR_GRAPHICS_REQUIREMENTS_CALL_MISSING = -50, + XR_ERROR_RUNTIME_UNAVAILABLE = -51, + XR_ERROR_ANDROID_THREAD_SETTINGS_ID_INVALID_KHR = -1000003000, + XR_ERROR_ANDROID_THREAD_SETTINGS_FAILURE_KHR = -1000003001, + XR_ERROR_CREATE_SPATIAL_ANCHOR_FAILED_MSFT = -1000039001, + XR_ERROR_SECONDARY_VIEW_CONFIGURATION_TYPE_NOT_ENABLED_MSFT = -1000053000, + XR_ERROR_CONTROLLER_MODEL_KEY_INVALID_MSFT = -1000055000, + XR_ERROR_REPROJECTION_MODE_UNSUPPORTED_MSFT = -1000066000, + XR_ERROR_COMPUTE_NEW_SCENE_NOT_COMPLETED_MSFT = -1000097000, + XR_ERROR_SCENE_COMPONENT_ID_INVALID_MSFT = -1000097001, + XR_ERROR_SCENE_COMPONENT_TYPE_MISMATCH_MSFT = -1000097002, + XR_ERROR_SCENE_MESH_BUFFER_ID_INVALID_MSFT = -1000097003, + XR_ERROR_SCENE_COMPUTE_FEATURE_INCOMPATIBLE_MSFT = -1000097004, + XR_ERROR_SCENE_COMPUTE_CONSISTENCY_MISMATCH_MSFT = -1000097005, + XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB = -1000101000, + XR_ERROR_COLOR_SPACE_UNSUPPORTED_FB = -1000108000, + XR_ERROR_SPATIAL_ANCHOR_NAME_NOT_FOUND_MSFT = -1000142001, + XR_ERROR_SPATIAL_ANCHOR_NAME_INVALID_MSFT = -1000142002, + XR_RESULT_MAX_ENUM = 0x7FFFFFFF +} XrResult; + +typedef enum XrStructureType { + XR_TYPE_UNKNOWN = 0, + XR_TYPE_API_LAYER_PROPERTIES = 1, + XR_TYPE_EXTENSION_PROPERTIES = 2, + XR_TYPE_INSTANCE_CREATE_INFO = 3, + XR_TYPE_SYSTEM_GET_INFO = 4, + XR_TYPE_SYSTEM_PROPERTIES = 5, + XR_TYPE_VIEW_LOCATE_INFO = 6, + XR_TYPE_VIEW = 7, + XR_TYPE_SESSION_CREATE_INFO = 8, + XR_TYPE_SWAPCHAIN_CREATE_INFO = 9, + XR_TYPE_SESSION_BEGIN_INFO = 10, + XR_TYPE_VIEW_STATE = 11, + XR_TYPE_FRAME_END_INFO = 12, + XR_TYPE_HAPTIC_VIBRATION = 13, + XR_TYPE_EVENT_DATA_BUFFER = 16, + XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING = 17, + XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED = 18, + XR_TYPE_ACTION_STATE_BOOLEAN = 23, + XR_TYPE_ACTION_STATE_FLOAT = 24, + XR_TYPE_ACTION_STATE_VECTOR2F = 25, + XR_TYPE_ACTION_STATE_POSE = 27, + XR_TYPE_ACTION_SET_CREATE_INFO = 28, + XR_TYPE_ACTION_CREATE_INFO = 29, + XR_TYPE_INSTANCE_PROPERTIES = 32, + XR_TYPE_FRAME_WAIT_INFO = 33, + XR_TYPE_COMPOSITION_LAYER_PROJECTION = 35, + XR_TYPE_COMPOSITION_LAYER_QUAD = 36, + XR_TYPE_REFERENCE_SPACE_CREATE_INFO = 37, + XR_TYPE_ACTION_SPACE_CREATE_INFO = 38, + XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING = 40, + XR_TYPE_VIEW_CONFIGURATION_VIEW = 41, + XR_TYPE_SPACE_LOCATION = 42, + XR_TYPE_SPACE_VELOCITY = 43, + XR_TYPE_FRAME_STATE = 44, + XR_TYPE_VIEW_CONFIGURATION_PROPERTIES = 45, + XR_TYPE_FRAME_BEGIN_INFO = 46, + XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW = 48, + XR_TYPE_EVENT_DATA_EVENTS_LOST = 49, + XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING = 51, + XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED = 52, + XR_TYPE_INTERACTION_PROFILE_STATE = 53, + XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO = 55, + XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO = 56, + XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO = 57, + XR_TYPE_ACTION_STATE_GET_INFO = 58, + XR_TYPE_HAPTIC_ACTION_INFO = 59, + XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO = 60, + XR_TYPE_ACTIONS_SYNC_INFO = 61, + XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO = 62, + XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO = 63, + XR_TYPE_COMPOSITION_LAYER_CUBE_KHR = 1000006000, + XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR = 1000008000, + XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR = 1000010000, + XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR = 1000014000, + XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT = 1000015000, + XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR = 1000017000, + XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR = 1000018000, + XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000019000, + XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000019001, + XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000019002, + XR_TYPE_DEBUG_UTILS_LABEL_EXT = 1000019003, + XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR = 1000023000, + XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR = 1000023001, + XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR = 1000023002, + XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR = 1000023003, + XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR = 1000023004, + XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR = 1000023005, + XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR = 1000024001, + XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR = 1000024002, + XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR = 1000024003, + XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR = 1000025000, + XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR = 1000025001, + XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR = 1000025002, + XR_TYPE_GRAPHICS_BINDING_D3D11_KHR = 1000027000, + XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR = 1000027001, + XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR = 1000027002, + XR_TYPE_GRAPHICS_BINDING_D3D12_KHR = 1000028000, + XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR = 1000028001, + XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR = 1000028002, + XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT = 1000030000, + XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT = 1000030001, + XR_TYPE_VISIBILITY_MASK_KHR = 1000031000, + XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR = 1000031001, + XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX = 1000033000, + XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX = 1000033003, + XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR = 1000034000, + XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT = 1000039000, + XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT = 1000039001, + XR_TYPE_COMPOSITION_LAYER_IMAGE_LAYOUT_FB = 1000040000, + XR_TYPE_COMPOSITION_LAYER_ALPHA_BLEND_FB = 1000041001, + XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT = 1000046000, + XR_TYPE_GRAPHICS_BINDING_EGL_MNDX = 1000048004, + XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT = 1000049000, + XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT = 1000051000, + XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT = 1000051001, + XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT = 1000051002, + XR_TYPE_HAND_JOINT_LOCATIONS_EXT = 1000051003, + XR_TYPE_HAND_JOINT_VELOCITIES_EXT = 1000051004, + XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT = 1000052000, + XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT = 1000052001, + XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT = 1000052002, + XR_TYPE_HAND_MESH_MSFT = 1000052003, + XR_TYPE_HAND_POSE_TYPE_INFO_MSFT = 1000052004, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT = 1000053000, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT = 1000053001, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT = 1000053002, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT = 1000053003, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT = 1000053004, + XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT = 1000053005, + XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT = 1000055000, + XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT = 1000055001, + XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT = 1000055002, + XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT = 1000055003, + XR_TYPE_CONTROLLER_MODEL_STATE_MSFT = 1000055004, + XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC = 1000059000, + XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT = 1000063000, + XR_TYPE_COMPOSITION_LAYER_REPROJECTION_INFO_MSFT = 1000066000, + XR_TYPE_COMPOSITION_LAYER_REPROJECTION_PLANE_OVERRIDE_MSFT = 1000066001, + XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB = 1000070000, + XR_TYPE_COMPOSITION_LAYER_SECURE_CONTENT_FB = 1000072000, + XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE = 1000079000, + XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT = 1000080000, + XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR = 1000089000, + XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR = 1000090000, + XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR = 1000090001, + XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR = 1000090003, + XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR = 1000091000, + XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT = 1000097000, + XR_TYPE_SCENE_CREATE_INFO_MSFT = 1000097001, + XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT = 1000097002, + XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT = 1000097003, + XR_TYPE_SCENE_COMPONENTS_MSFT = 1000097004, + XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT = 1000097005, + XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT = 1000097006, + XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT = 1000097007, + XR_TYPE_SCENE_OBJECTS_MSFT = 1000097008, + XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT = 1000097009, + XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT = 1000097010, + XR_TYPE_SCENE_PLANES_MSFT = 1000097011, + XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT = 1000097012, + XR_TYPE_SCENE_MESHES_MSFT = 1000097013, + XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT = 1000097014, + XR_TYPE_SCENE_MESH_BUFFERS_MSFT = 1000097015, + XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT = 1000097016, + XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT = 1000097017, + XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT = 1000097018, + XR_TYPE_SERIALIZED_SCENE_FRAGMENT_DATA_GET_INFO_MSFT = 1000098000, + XR_TYPE_SCENE_DESERIALIZE_INFO_MSFT = 1000098001, + XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB = 1000101000, + XR_TYPE_SYSTEM_EXPRESSION_PROPERTIES_HTC = 1000104000, + XR_TYPE_EXPRESSION_CREATE_INFO_HTC = 1000104001, + XR_TYPE_EXPRESSION_DATA_HTC = 1000104002, + XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB = 1000108000, + XR_TYPE_FOVEATION_PROFILE_CREATE_INFO_FB = 1000114000, + XR_TYPE_SWAPCHAIN_CREATE_INFO_FOVEATION_FB = 1000114001, + XR_TYPE_SWAPCHAIN_STATE_FOVEATION_FB = 1000114002, + XR_TYPE_FOVEATION_LEVEL_PROFILE_CREATE_INFO_FB = 1000115000, + XR_TYPE_BINDING_MODIFICATIONS_KHR = 1000120000, + XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO = 1000121000, + XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO = 1000121001, + XR_TYPE_SYSTEM_FOVEATED_RENDERING_PROPERTIES_VARJO = 1000121002, + XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_VARJO = 1000122000, + XR_TYPE_SPATIAL_ANCHOR_PERSISTENCE_INFO_MSFT = 1000142000, + XR_TYPE_SPATIAL_ANCHOR_FROM_PERSISTED_ANCHOR_CREATE_INFO_MSFT = 1000142001, + XR_TYPE_SWAPCHAIN_IMAGE_FOVEATION_VULKAN_FB = 1000160000, + XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB = 1000161000, + XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB = 1000162000, + XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB = 1000163000, + XR_TYPE_GRAPHICS_BINDING_VULKAN2_KHR = XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR, + XR_TYPE_SWAPCHAIN_IMAGE_VULKAN2_KHR = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR, + XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN2_KHR = XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR, + XR_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF +} XrStructureType; + +typedef enum XrFormFactor { + XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY = 1, + XR_FORM_FACTOR_HANDHELD_DISPLAY = 2, + XR_FORM_FACTOR_MAX_ENUM = 0x7FFFFFFF +} XrFormFactor; + +typedef enum XrViewConfigurationType { + XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO = 1, + XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO = 2, + XR_VIEW_CONFIGURATION_TYPE_PRIMARY_QUAD_VARJO = 1000037000, + XR_VIEW_CONFIGURATION_TYPE_SECONDARY_MONO_FIRST_PERSON_OBSERVER_MSFT = 1000054000, + XR_VIEW_CONFIGURATION_TYPE_MAX_ENUM = 0x7FFFFFFF +} XrViewConfigurationType; + +typedef enum XrEnvironmentBlendMode { + XR_ENVIRONMENT_BLEND_MODE_OPAQUE = 1, + XR_ENVIRONMENT_BLEND_MODE_ADDITIVE = 2, + XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND = 3, + XR_ENVIRONMENT_BLEND_MODE_MAX_ENUM = 0x7FFFFFFF +} XrEnvironmentBlendMode; + +typedef enum XrReferenceSpaceType { + XR_REFERENCE_SPACE_TYPE_VIEW = 1, + XR_REFERENCE_SPACE_TYPE_LOCAL = 2, + XR_REFERENCE_SPACE_TYPE_STAGE = 3, + XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT = 1000038000, + XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO = 1000121000, + XR_REFERENCE_SPACE_TYPE_MAX_ENUM = 0x7FFFFFFF +} XrReferenceSpaceType; + +typedef enum XrActionType { + XR_ACTION_TYPE_BOOLEAN_INPUT = 1, + XR_ACTION_TYPE_FLOAT_INPUT = 2, + XR_ACTION_TYPE_VECTOR2F_INPUT = 3, + XR_ACTION_TYPE_POSE_INPUT = 4, + XR_ACTION_TYPE_VIBRATION_OUTPUT = 100, + XR_ACTION_TYPE_MAX_ENUM = 0x7FFFFFFF +} XrActionType; + +typedef enum XrEyeVisibility { + XR_EYE_VISIBILITY_BOTH = 0, + XR_EYE_VISIBILITY_LEFT = 1, + XR_EYE_VISIBILITY_RIGHT = 2, + XR_EYE_VISIBILITY_MAX_ENUM = 0x7FFFFFFF +} XrEyeVisibility; + +typedef enum XrSessionState { + XR_SESSION_STATE_UNKNOWN = 0, + XR_SESSION_STATE_IDLE = 1, + XR_SESSION_STATE_READY = 2, + XR_SESSION_STATE_SYNCHRONIZED = 3, + XR_SESSION_STATE_VISIBLE = 4, + XR_SESSION_STATE_FOCUSED = 5, + XR_SESSION_STATE_STOPPING = 6, + XR_SESSION_STATE_LOSS_PENDING = 7, + XR_SESSION_STATE_EXITING = 8, + XR_SESSION_STATE_MAX_ENUM = 0x7FFFFFFF +} XrSessionState; + +typedef enum XrObjectType { + XR_OBJECT_TYPE_UNKNOWN = 0, + XR_OBJECT_TYPE_INSTANCE = 1, + XR_OBJECT_TYPE_SESSION = 2, + XR_OBJECT_TYPE_SWAPCHAIN = 3, + XR_OBJECT_TYPE_SPACE = 4, + XR_OBJECT_TYPE_ACTION_SET = 5, + XR_OBJECT_TYPE_ACTION = 6, + XR_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000019000, + XR_OBJECT_TYPE_SPATIAL_ANCHOR_MSFT = 1000039000, + XR_OBJECT_TYPE_HAND_TRACKER_EXT = 1000051000, + XR_OBJECT_TYPE_SCENE_OBSERVER_MSFT = 1000097000, + XR_OBJECT_TYPE_SCENE_MSFT = 1000097001, + XR_OBJECT_TYPE_EXPRESSION_HTC = 1000104000, + XR_OBJECT_TYPE_FOVEATION_PROFILE_FB = 1000114000, + XR_OBJECT_TYPE_SPATIAL_ANCHOR_STORE_CONNECTION_MSFT = 1000142000, + XR_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF +} XrObjectType; +typedef XrFlags64 XrInstanceCreateFlags; + +// Flag bits for XrInstanceCreateFlags + +typedef XrFlags64 XrSessionCreateFlags; + +// Flag bits for XrSessionCreateFlags + +typedef XrFlags64 XrSpaceVelocityFlags; + +// Flag bits for XrSpaceVelocityFlags +static const XrSpaceVelocityFlags XR_SPACE_VELOCITY_LINEAR_VALID_BIT = 0x00000001; +static const XrSpaceVelocityFlags XR_SPACE_VELOCITY_ANGULAR_VALID_BIT = 0x00000002; + +typedef XrFlags64 XrSpaceLocationFlags; + +// Flag bits for XrSpaceLocationFlags +static const XrSpaceLocationFlags XR_SPACE_LOCATION_ORIENTATION_VALID_BIT = 0x00000001; +static const XrSpaceLocationFlags XR_SPACE_LOCATION_POSITION_VALID_BIT = 0x00000002; +static const XrSpaceLocationFlags XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT = 0x00000004; +static const XrSpaceLocationFlags XR_SPACE_LOCATION_POSITION_TRACKED_BIT = 0x00000008; + +typedef XrFlags64 XrSwapchainCreateFlags; + +// Flag bits for XrSwapchainCreateFlags +static const XrSwapchainCreateFlags XR_SWAPCHAIN_CREATE_PROTECTED_CONTENT_BIT = 0x00000001; +static const XrSwapchainCreateFlags XR_SWAPCHAIN_CREATE_STATIC_IMAGE_BIT = 0x00000002; + +typedef XrFlags64 XrSwapchainUsageFlags; + +// Flag bits for XrSwapchainUsageFlags +static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT = 0x00000001; +static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000002; +static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_UNORDERED_ACCESS_BIT = 0x00000004; +static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_TRANSFER_SRC_BIT = 0x00000008; +static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_TRANSFER_DST_BIT = 0x00000010; +static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_SAMPLED_BIT = 0x00000020; +static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT = 0x00000040; +static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_MND = 0x00000080; +static const XrSwapchainUsageFlags XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_KHR = 0x00000080; // alias of XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_MND + +typedef XrFlags64 XrCompositionLayerFlags; + +// Flag bits for XrCompositionLayerFlags +static const XrCompositionLayerFlags XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT = 0x00000001; +static const XrCompositionLayerFlags XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT = 0x00000002; +static const XrCompositionLayerFlags XR_COMPOSITION_LAYER_UNPREMULTIPLIED_ALPHA_BIT = 0x00000004; + +typedef XrFlags64 XrViewStateFlags; + +// Flag bits for XrViewStateFlags +static const XrViewStateFlags XR_VIEW_STATE_ORIENTATION_VALID_BIT = 0x00000001; +static const XrViewStateFlags XR_VIEW_STATE_POSITION_VALID_BIT = 0x00000002; +static const XrViewStateFlags XR_VIEW_STATE_ORIENTATION_TRACKED_BIT = 0x00000004; +static const XrViewStateFlags XR_VIEW_STATE_POSITION_TRACKED_BIT = 0x00000008; + +typedef XrFlags64 XrInputSourceLocalizedNameFlags; + +// Flag bits for XrInputSourceLocalizedNameFlags +static const XrInputSourceLocalizedNameFlags XR_INPUT_SOURCE_LOCALIZED_NAME_USER_PATH_BIT = 0x00000001; +static const XrInputSourceLocalizedNameFlags XR_INPUT_SOURCE_LOCALIZED_NAME_INTERACTION_PROFILE_BIT = 0x00000002; +static const XrInputSourceLocalizedNameFlags XR_INPUT_SOURCE_LOCALIZED_NAME_COMPONENT_BIT = 0x00000004; + +typedef void (XRAPI_PTR *PFN_xrVoidFunction)(void); +typedef struct XrApiLayerProperties { + XrStructureType type; + void* XR_MAY_ALIAS next; + char layerName[XR_MAX_API_LAYER_NAME_SIZE]; + XrVersion specVersion; + uint32_t layerVersion; + char description[XR_MAX_API_LAYER_DESCRIPTION_SIZE]; +} XrApiLayerProperties; + +typedef struct XrExtensionProperties { + XrStructureType type; + void* XR_MAY_ALIAS next; + char extensionName[XR_MAX_EXTENSION_NAME_SIZE]; + uint32_t extensionVersion; +} XrExtensionProperties; + +typedef struct XrApplicationInfo { + char applicationName[XR_MAX_APPLICATION_NAME_SIZE]; + uint32_t applicationVersion; + char engineName[XR_MAX_ENGINE_NAME_SIZE]; + uint32_t engineVersion; + XrVersion apiVersion; +} XrApplicationInfo; + +typedef struct XrInstanceCreateInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrInstanceCreateFlags createFlags; + XrApplicationInfo applicationInfo; + uint32_t enabledApiLayerCount; + const char* const* enabledApiLayerNames; + uint32_t enabledExtensionCount; + const char* const* enabledExtensionNames; +} XrInstanceCreateInfo; + +typedef struct XrInstanceProperties { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrVersion runtimeVersion; + char runtimeName[XR_MAX_RUNTIME_NAME_SIZE]; +} XrInstanceProperties; + +typedef struct XrEventDataBuffer { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint8_t varying[4000]; +} XrEventDataBuffer; + +typedef struct XrSystemGetInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrFormFactor formFactor; +} XrSystemGetInfo; + +typedef struct XrSystemGraphicsProperties { + uint32_t maxSwapchainImageHeight; + uint32_t maxSwapchainImageWidth; + uint32_t maxLayerCount; +} XrSystemGraphicsProperties; + +typedef struct XrSystemTrackingProperties { + XrBool32 orientationTracking; + XrBool32 positionTracking; +} XrSystemTrackingProperties; + +typedef struct XrSystemProperties { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrSystemId systemId; + uint32_t vendorId; + char systemName[XR_MAX_SYSTEM_NAME_SIZE]; + XrSystemGraphicsProperties graphicsProperties; + XrSystemTrackingProperties trackingProperties; +} XrSystemProperties; + +typedef struct XrSessionCreateInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSessionCreateFlags createFlags; + XrSystemId systemId; +} XrSessionCreateInfo; + +typedef struct XrVector3f { + float x; + float y; + float z; +} XrVector3f; + +// XrSpaceVelocity extends XrSpaceLocation +typedef struct XrSpaceVelocity { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrSpaceVelocityFlags velocityFlags; + XrVector3f linearVelocity; + XrVector3f angularVelocity; +} XrSpaceVelocity; + +typedef struct XrQuaternionf { + float x; + float y; + float z; + float w; +} XrQuaternionf; + +typedef struct XrPosef { + XrQuaternionf orientation; + XrVector3f position; +} XrPosef; + +typedef struct XrReferenceSpaceCreateInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrReferenceSpaceType referenceSpaceType; + XrPosef poseInReferenceSpace; +} XrReferenceSpaceCreateInfo; + +typedef struct XrExtent2Df { + float width; + float height; +} XrExtent2Df; + +typedef struct XrActionSpaceCreateInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrAction action; + XrPath subactionPath; + XrPosef poseInActionSpace; +} XrActionSpaceCreateInfo; + +typedef struct XrSpaceLocation { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrSpaceLocationFlags locationFlags; + XrPosef pose; +} XrSpaceLocation; + +typedef struct XrViewConfigurationProperties { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrViewConfigurationType viewConfigurationType; + XrBool32 fovMutable; +} XrViewConfigurationProperties; + +typedef struct XrViewConfigurationView { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t recommendedImageRectWidth; + uint32_t maxImageRectWidth; + uint32_t recommendedImageRectHeight; + uint32_t maxImageRectHeight; + uint32_t recommendedSwapchainSampleCount; + uint32_t maxSwapchainSampleCount; +} XrViewConfigurationView; + +typedef struct XrSwapchainCreateInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSwapchainCreateFlags createFlags; + XrSwapchainUsageFlags usageFlags; + int64_t format; + uint32_t sampleCount; + uint32_t width; + uint32_t height; + uint32_t faceCount; + uint32_t arraySize; + uint32_t mipCount; +} XrSwapchainCreateInfo; + +typedef struct XR_MAY_ALIAS XrSwapchainImageBaseHeader { + XrStructureType type; + void* XR_MAY_ALIAS next; +} XrSwapchainImageBaseHeader; + +typedef struct XrSwapchainImageAcquireInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; +} XrSwapchainImageAcquireInfo; + +typedef struct XrSwapchainImageWaitInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrDuration timeout; +} XrSwapchainImageWaitInfo; + +typedef struct XrSwapchainImageReleaseInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; +} XrSwapchainImageReleaseInfo; + +typedef struct XrSessionBeginInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrViewConfigurationType primaryViewConfigurationType; +} XrSessionBeginInfo; + +typedef struct XrFrameWaitInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; +} XrFrameWaitInfo; + +typedef struct XrFrameState { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrTime predictedDisplayTime; + XrDuration predictedDisplayPeriod; + XrBool32 shouldRender; +} XrFrameState; + +typedef struct XrFrameBeginInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; +} XrFrameBeginInfo; + +typedef struct XR_MAY_ALIAS XrCompositionLayerBaseHeader { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrCompositionLayerFlags layerFlags; + XrSpace space; +} XrCompositionLayerBaseHeader; + +typedef struct XrFrameEndInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrTime displayTime; + XrEnvironmentBlendMode environmentBlendMode; + uint32_t layerCount; + const XrCompositionLayerBaseHeader* const* layers; +} XrFrameEndInfo; + +typedef struct XrViewLocateInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrViewConfigurationType viewConfigurationType; + XrTime displayTime; + XrSpace space; +} XrViewLocateInfo; + +typedef struct XrViewState { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrViewStateFlags viewStateFlags; +} XrViewState; + +typedef struct XrFovf { + float angleLeft; + float angleRight; + float angleUp; + float angleDown; +} XrFovf; + +typedef struct XrView { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrPosef pose; + XrFovf fov; +} XrView; + +typedef struct XrActionSetCreateInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + char actionSetName[XR_MAX_ACTION_SET_NAME_SIZE]; + char localizedActionSetName[XR_MAX_LOCALIZED_ACTION_SET_NAME_SIZE]; + uint32_t priority; +} XrActionSetCreateInfo; + +typedef struct XrActionCreateInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + char actionName[XR_MAX_ACTION_NAME_SIZE]; + XrActionType actionType; + uint32_t countSubactionPaths; + const XrPath* subactionPaths; + char localizedActionName[XR_MAX_LOCALIZED_ACTION_NAME_SIZE]; +} XrActionCreateInfo; + +typedef struct XrActionSuggestedBinding { + XrAction action; + XrPath binding; +} XrActionSuggestedBinding; + +typedef struct XrInteractionProfileSuggestedBinding { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrPath interactionProfile; + uint32_t countSuggestedBindings; + const XrActionSuggestedBinding* suggestedBindings; +} XrInteractionProfileSuggestedBinding; + +typedef struct XrSessionActionSetsAttachInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t countActionSets; + const XrActionSet* actionSets; +} XrSessionActionSetsAttachInfo; + +typedef struct XrInteractionProfileState { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrPath interactionProfile; +} XrInteractionProfileState; + +typedef struct XrActionStateGetInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrAction action; + XrPath subactionPath; +} XrActionStateGetInfo; + +typedef struct XrActionStateBoolean { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBool32 currentState; + XrBool32 changedSinceLastSync; + XrTime lastChangeTime; + XrBool32 isActive; +} XrActionStateBoolean; + +typedef struct XrActionStateFloat { + XrStructureType type; + void* XR_MAY_ALIAS next; + float currentState; + XrBool32 changedSinceLastSync; + XrTime lastChangeTime; + XrBool32 isActive; +} XrActionStateFloat; + +typedef struct XrVector2f { + float x; + float y; +} XrVector2f; + +typedef struct XrActionStateVector2f { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrVector2f currentState; + XrBool32 changedSinceLastSync; + XrTime lastChangeTime; + XrBool32 isActive; +} XrActionStateVector2f; + +typedef struct XrActionStatePose { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBool32 isActive; +} XrActionStatePose; + +typedef struct XrActiveActionSet { + XrActionSet actionSet; + XrPath subactionPath; +} XrActiveActionSet; + +typedef struct XrActionsSyncInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t countActiveActionSets; + const XrActiveActionSet* activeActionSets; +} XrActionsSyncInfo; + +typedef struct XrBoundSourcesForActionEnumerateInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrAction action; +} XrBoundSourcesForActionEnumerateInfo; + +typedef struct XrInputSourceLocalizedNameGetInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrPath sourcePath; + XrInputSourceLocalizedNameFlags whichComponents; +} XrInputSourceLocalizedNameGetInfo; + +typedef struct XrHapticActionInfo { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrAction action; + XrPath subactionPath; +} XrHapticActionInfo; + +typedef struct XR_MAY_ALIAS XrHapticBaseHeader { + XrStructureType type; + const void* XR_MAY_ALIAS next; +} XrHapticBaseHeader; + +typedef struct XR_MAY_ALIAS XrBaseInStructure { + XrStructureType type; + const struct XrBaseInStructure* next; +} XrBaseInStructure; + +typedef struct XR_MAY_ALIAS XrBaseOutStructure { + XrStructureType type; + struct XrBaseOutStructure* next; +} XrBaseOutStructure; + +typedef struct XrOffset2Di { + int32_t x; + int32_t y; +} XrOffset2Di; + +typedef struct XrExtent2Di { + int32_t width; + int32_t height; +} XrExtent2Di; + +typedef struct XrRect2Di { + XrOffset2Di offset; + XrExtent2Di extent; +} XrRect2Di; + +typedef struct XrSwapchainSubImage { + XrSwapchain swapchain; + XrRect2Di imageRect; + uint32_t imageArrayIndex; +} XrSwapchainSubImage; + +typedef struct XrCompositionLayerProjectionView { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrPosef pose; + XrFovf fov; + XrSwapchainSubImage subImage; +} XrCompositionLayerProjectionView; + +typedef struct XrCompositionLayerProjection { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrCompositionLayerFlags layerFlags; + XrSpace space; + uint32_t viewCount; + const XrCompositionLayerProjectionView* views; +} XrCompositionLayerProjection; + +typedef struct XrCompositionLayerQuad { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrCompositionLayerFlags layerFlags; + XrSpace space; + XrEyeVisibility eyeVisibility; + XrSwapchainSubImage subImage; + XrPosef pose; + XrExtent2Df size; +} XrCompositionLayerQuad; + +typedef struct XR_MAY_ALIAS XrEventDataBaseHeader { + XrStructureType type; + const void* XR_MAY_ALIAS next; +} XrEventDataBaseHeader; + +typedef struct XrEventDataEventsLost { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t lostEventCount; +} XrEventDataEventsLost; + +typedef struct XrEventDataInstanceLossPending { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrTime lossTime; +} XrEventDataInstanceLossPending; + +typedef struct XrEventDataSessionStateChanged { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSession session; + XrSessionState state; + XrTime time; +} XrEventDataSessionStateChanged; + +typedef struct XrEventDataReferenceSpaceChangePending { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSession session; + XrReferenceSpaceType referenceSpaceType; + XrTime changeTime; + XrBool32 poseValid; + XrPosef poseInPreviousSpace; +} XrEventDataReferenceSpaceChangePending; + +typedef struct XrEventDataInteractionProfileChanged { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSession session; +} XrEventDataInteractionProfileChanged; + +typedef struct XrHapticVibration { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrDuration duration; + float frequency; + float amplitude; +} XrHapticVibration; + +typedef struct XrOffset2Df { + float x; + float y; +} XrOffset2Df; + +typedef struct XrRect2Df { + XrOffset2Df offset; + XrExtent2Df extent; +} XrRect2Df; + +typedef struct XrVector4f { + float x; + float y; + float z; + float w; +} XrVector4f; + +typedef struct XrColor4f { + float r; + float g; + float b; + float a; +} XrColor4f; + +typedef XrResult (XRAPI_PTR *PFN_xrGetInstanceProcAddr)(XrInstance instance, const char* name, PFN_xrVoidFunction* function); +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateApiLayerProperties)(uint32_t propertyCapacityInput, uint32_t* propertyCountOutput, XrApiLayerProperties* properties); +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateInstanceExtensionProperties)(const char* layerName, uint32_t propertyCapacityInput, uint32_t* propertyCountOutput, XrExtensionProperties* properties); +typedef XrResult (XRAPI_PTR *PFN_xrCreateInstance)(const XrInstanceCreateInfo* createInfo, XrInstance* instance); +typedef XrResult (XRAPI_PTR *PFN_xrDestroyInstance)(XrInstance instance); +typedef XrResult (XRAPI_PTR *PFN_xrGetInstanceProperties)(XrInstance instance, XrInstanceProperties* instanceProperties); +typedef XrResult (XRAPI_PTR *PFN_xrPollEvent)(XrInstance instance, XrEventDataBuffer* eventData); +typedef XrResult (XRAPI_PTR *PFN_xrResultToString)(XrInstance instance, XrResult value, char buffer[XR_MAX_RESULT_STRING_SIZE]); +typedef XrResult (XRAPI_PTR *PFN_xrStructureTypeToString)(XrInstance instance, XrStructureType value, char buffer[XR_MAX_STRUCTURE_NAME_SIZE]); +typedef XrResult (XRAPI_PTR *PFN_xrGetSystem)(XrInstance instance, const XrSystemGetInfo* getInfo, XrSystemId* systemId); +typedef XrResult (XRAPI_PTR *PFN_xrGetSystemProperties)(XrInstance instance, XrSystemId systemId, XrSystemProperties* properties); +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateEnvironmentBlendModes)(XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, uint32_t environmentBlendModeCapacityInput, uint32_t* environmentBlendModeCountOutput, XrEnvironmentBlendMode* environmentBlendModes); +typedef XrResult (XRAPI_PTR *PFN_xrCreateSession)(XrInstance instance, const XrSessionCreateInfo* createInfo, XrSession* session); +typedef XrResult (XRAPI_PTR *PFN_xrDestroySession)(XrSession session); +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateReferenceSpaces)(XrSession session, uint32_t spaceCapacityInput, uint32_t* spaceCountOutput, XrReferenceSpaceType* spaces); +typedef XrResult (XRAPI_PTR *PFN_xrCreateReferenceSpace)(XrSession session, const XrReferenceSpaceCreateInfo* createInfo, XrSpace* space); +typedef XrResult (XRAPI_PTR *PFN_xrGetReferenceSpaceBoundsRect)(XrSession session, XrReferenceSpaceType referenceSpaceType, XrExtent2Df* bounds); +typedef XrResult (XRAPI_PTR *PFN_xrCreateActionSpace)(XrSession session, const XrActionSpaceCreateInfo* createInfo, XrSpace* space); +typedef XrResult (XRAPI_PTR *PFN_xrLocateSpace)(XrSpace space, XrSpace baseSpace, XrTime time, XrSpaceLocation* location); +typedef XrResult (XRAPI_PTR *PFN_xrDestroySpace)(XrSpace space); +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateViewConfigurations)(XrInstance instance, XrSystemId systemId, uint32_t viewConfigurationTypeCapacityInput, uint32_t* viewConfigurationTypeCountOutput, XrViewConfigurationType* viewConfigurationTypes); +typedef XrResult (XRAPI_PTR *PFN_xrGetViewConfigurationProperties)(XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, XrViewConfigurationProperties* configurationProperties); +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateViewConfigurationViews)(XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, uint32_t viewCapacityInput, uint32_t* viewCountOutput, XrViewConfigurationView* views); +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateSwapchainFormats)(XrSession session, uint32_t formatCapacityInput, uint32_t* formatCountOutput, int64_t* formats); +typedef XrResult (XRAPI_PTR *PFN_xrCreateSwapchain)(XrSession session, const XrSwapchainCreateInfo* createInfo, XrSwapchain* swapchain); +typedef XrResult (XRAPI_PTR *PFN_xrDestroySwapchain)(XrSwapchain swapchain); +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateSwapchainImages)(XrSwapchain swapchain, uint32_t imageCapacityInput, uint32_t* imageCountOutput, XrSwapchainImageBaseHeader* images); +typedef XrResult (XRAPI_PTR *PFN_xrAcquireSwapchainImage)(XrSwapchain swapchain, const XrSwapchainImageAcquireInfo* acquireInfo, uint32_t* index); +typedef XrResult (XRAPI_PTR *PFN_xrWaitSwapchainImage)(XrSwapchain swapchain, const XrSwapchainImageWaitInfo* waitInfo); +typedef XrResult (XRAPI_PTR *PFN_xrReleaseSwapchainImage)(XrSwapchain swapchain, const XrSwapchainImageReleaseInfo* releaseInfo); +typedef XrResult (XRAPI_PTR *PFN_xrBeginSession)(XrSession session, const XrSessionBeginInfo* beginInfo); +typedef XrResult (XRAPI_PTR *PFN_xrEndSession)(XrSession session); +typedef XrResult (XRAPI_PTR *PFN_xrRequestExitSession)(XrSession session); +typedef XrResult (XRAPI_PTR *PFN_xrWaitFrame)(XrSession session, const XrFrameWaitInfo* frameWaitInfo, XrFrameState* frameState); +typedef XrResult (XRAPI_PTR *PFN_xrBeginFrame)(XrSession session, const XrFrameBeginInfo* frameBeginInfo); +typedef XrResult (XRAPI_PTR *PFN_xrEndFrame)(XrSession session, const XrFrameEndInfo* frameEndInfo); +typedef XrResult (XRAPI_PTR *PFN_xrLocateViews)(XrSession session, const XrViewLocateInfo* viewLocateInfo, XrViewState* viewState, uint32_t viewCapacityInput, uint32_t* viewCountOutput, XrView* views); +typedef XrResult (XRAPI_PTR *PFN_xrStringToPath)(XrInstance instance, const char* pathString, XrPath* path); +typedef XrResult (XRAPI_PTR *PFN_xrPathToString)(XrInstance instance, XrPath path, uint32_t bufferCapacityInput, uint32_t* bufferCountOutput, char* buffer); +typedef XrResult (XRAPI_PTR *PFN_xrCreateActionSet)(XrInstance instance, const XrActionSetCreateInfo* createInfo, XrActionSet* actionSet); +typedef XrResult (XRAPI_PTR *PFN_xrDestroyActionSet)(XrActionSet actionSet); +typedef XrResult (XRAPI_PTR *PFN_xrCreateAction)(XrActionSet actionSet, const XrActionCreateInfo* createInfo, XrAction* action); +typedef XrResult (XRAPI_PTR *PFN_xrDestroyAction)(XrAction action); +typedef XrResult (XRAPI_PTR *PFN_xrSuggestInteractionProfileBindings)(XrInstance instance, const XrInteractionProfileSuggestedBinding* suggestedBindings); +typedef XrResult (XRAPI_PTR *PFN_xrAttachSessionActionSets)(XrSession session, const XrSessionActionSetsAttachInfo* attachInfo); +typedef XrResult (XRAPI_PTR *PFN_xrGetCurrentInteractionProfile)(XrSession session, XrPath topLevelUserPath, XrInteractionProfileState* interactionProfile); +typedef XrResult (XRAPI_PTR *PFN_xrGetActionStateBoolean)(XrSession session, const XrActionStateGetInfo* getInfo, XrActionStateBoolean* state); +typedef XrResult (XRAPI_PTR *PFN_xrGetActionStateFloat)(XrSession session, const XrActionStateGetInfo* getInfo, XrActionStateFloat* state); +typedef XrResult (XRAPI_PTR *PFN_xrGetActionStateVector2f)(XrSession session, const XrActionStateGetInfo* getInfo, XrActionStateVector2f* state); +typedef XrResult (XRAPI_PTR *PFN_xrGetActionStatePose)(XrSession session, const XrActionStateGetInfo* getInfo, XrActionStatePose* state); +typedef XrResult (XRAPI_PTR *PFN_xrSyncActions)(XrSession session, const XrActionsSyncInfo* syncInfo); +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateBoundSourcesForAction)(XrSession session, const XrBoundSourcesForActionEnumerateInfo* enumerateInfo, uint32_t sourceCapacityInput, uint32_t* sourceCountOutput, XrPath* sources); +typedef XrResult (XRAPI_PTR *PFN_xrGetInputSourceLocalizedName)(XrSession session, const XrInputSourceLocalizedNameGetInfo* getInfo, uint32_t bufferCapacityInput, uint32_t* bufferCountOutput, char* buffer); +typedef XrResult (XRAPI_PTR *PFN_xrApplyHapticFeedback)(XrSession session, const XrHapticActionInfo* hapticActionInfo, const XrHapticBaseHeader* hapticFeedback); +typedef XrResult (XRAPI_PTR *PFN_xrStopHapticFeedback)(XrSession session, const XrHapticActionInfo* hapticActionInfo); + +#ifndef XR_NO_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetInstanceProcAddr( + XrInstance instance, + const char* name, + PFN_xrVoidFunction* function); + +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateApiLayerProperties( + uint32_t propertyCapacityInput, + uint32_t* propertyCountOutput, + XrApiLayerProperties* properties); + +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateInstanceExtensionProperties( + const char* layerName, + uint32_t propertyCapacityInput, + uint32_t* propertyCountOutput, + XrExtensionProperties* properties); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateInstance( + const XrInstanceCreateInfo* createInfo, + XrInstance* instance); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroyInstance( + XrInstance instance); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetInstanceProperties( + XrInstance instance, + XrInstanceProperties* instanceProperties); + +XRAPI_ATTR XrResult XRAPI_CALL xrPollEvent( + XrInstance instance, + XrEventDataBuffer* eventData); + +XRAPI_ATTR XrResult XRAPI_CALL xrResultToString( + XrInstance instance, + XrResult value, + char buffer[XR_MAX_RESULT_STRING_SIZE]); + +XRAPI_ATTR XrResult XRAPI_CALL xrStructureTypeToString( + XrInstance instance, + XrStructureType value, + char buffer[XR_MAX_STRUCTURE_NAME_SIZE]); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSystem( + XrInstance instance, + const XrSystemGetInfo* getInfo, + XrSystemId* systemId); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSystemProperties( + XrInstance instance, + XrSystemId systemId, + XrSystemProperties* properties); + +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateEnvironmentBlendModes( + XrInstance instance, + XrSystemId systemId, + XrViewConfigurationType viewConfigurationType, + uint32_t environmentBlendModeCapacityInput, + uint32_t* environmentBlendModeCountOutput, + XrEnvironmentBlendMode* environmentBlendModes); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSession( + XrInstance instance, + const XrSessionCreateInfo* createInfo, + XrSession* session); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroySession( + XrSession session); + +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateReferenceSpaces( + XrSession session, + uint32_t spaceCapacityInput, + uint32_t* spaceCountOutput, + XrReferenceSpaceType* spaces); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateReferenceSpace( + XrSession session, + const XrReferenceSpaceCreateInfo* createInfo, + XrSpace* space); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetReferenceSpaceBoundsRect( + XrSession session, + XrReferenceSpaceType referenceSpaceType, + XrExtent2Df* bounds); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateActionSpace( + XrSession session, + const XrActionSpaceCreateInfo* createInfo, + XrSpace* space); + +XRAPI_ATTR XrResult XRAPI_CALL xrLocateSpace( + XrSpace space, + XrSpace baseSpace, + XrTime time, + XrSpaceLocation* location); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroySpace( + XrSpace space); + +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateViewConfigurations( + XrInstance instance, + XrSystemId systemId, + uint32_t viewConfigurationTypeCapacityInput, + uint32_t* viewConfigurationTypeCountOutput, + XrViewConfigurationType* viewConfigurationTypes); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetViewConfigurationProperties( + XrInstance instance, + XrSystemId systemId, + XrViewConfigurationType viewConfigurationType, + XrViewConfigurationProperties* configurationProperties); + +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateViewConfigurationViews( + XrInstance instance, + XrSystemId systemId, + XrViewConfigurationType viewConfigurationType, + uint32_t viewCapacityInput, + uint32_t* viewCountOutput, + XrViewConfigurationView* views); + +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateSwapchainFormats( + XrSession session, + uint32_t formatCapacityInput, + uint32_t* formatCountOutput, + int64_t* formats); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSwapchain( + XrSession session, + const XrSwapchainCreateInfo* createInfo, + XrSwapchain* swapchain); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroySwapchain( + XrSwapchain swapchain); + +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateSwapchainImages( + XrSwapchain swapchain, + uint32_t imageCapacityInput, + uint32_t* imageCountOutput, + XrSwapchainImageBaseHeader* images); + +XRAPI_ATTR XrResult XRAPI_CALL xrAcquireSwapchainImage( + XrSwapchain swapchain, + const XrSwapchainImageAcquireInfo* acquireInfo, + uint32_t* index); + +XRAPI_ATTR XrResult XRAPI_CALL xrWaitSwapchainImage( + XrSwapchain swapchain, + const XrSwapchainImageWaitInfo* waitInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrReleaseSwapchainImage( + XrSwapchain swapchain, + const XrSwapchainImageReleaseInfo* releaseInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrBeginSession( + XrSession session, + const XrSessionBeginInfo* beginInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrEndSession( + XrSession session); + +XRAPI_ATTR XrResult XRAPI_CALL xrRequestExitSession( + XrSession session); + +XRAPI_ATTR XrResult XRAPI_CALL xrWaitFrame( + XrSession session, + const XrFrameWaitInfo* frameWaitInfo, + XrFrameState* frameState); + +XRAPI_ATTR XrResult XRAPI_CALL xrBeginFrame( + XrSession session, + const XrFrameBeginInfo* frameBeginInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrEndFrame( + XrSession session, + const XrFrameEndInfo* frameEndInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrLocateViews( + XrSession session, + const XrViewLocateInfo* viewLocateInfo, + XrViewState* viewState, + uint32_t viewCapacityInput, + uint32_t* viewCountOutput, + XrView* views); + +XRAPI_ATTR XrResult XRAPI_CALL xrStringToPath( + XrInstance instance, + const char* pathString, + XrPath* path); + +XRAPI_ATTR XrResult XRAPI_CALL xrPathToString( + XrInstance instance, + XrPath path, + uint32_t bufferCapacityInput, + uint32_t* bufferCountOutput, + char* buffer); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateActionSet( + XrInstance instance, + const XrActionSetCreateInfo* createInfo, + XrActionSet* actionSet); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroyActionSet( + XrActionSet actionSet); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateAction( + XrActionSet actionSet, + const XrActionCreateInfo* createInfo, + XrAction* action); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroyAction( + XrAction action); + +XRAPI_ATTR XrResult XRAPI_CALL xrSuggestInteractionProfileBindings( + XrInstance instance, + const XrInteractionProfileSuggestedBinding* suggestedBindings); + +XRAPI_ATTR XrResult XRAPI_CALL xrAttachSessionActionSets( + XrSession session, + const XrSessionActionSetsAttachInfo* attachInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetCurrentInteractionProfile( + XrSession session, + XrPath topLevelUserPath, + XrInteractionProfileState* interactionProfile); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetActionStateBoolean( + XrSession session, + const XrActionStateGetInfo* getInfo, + XrActionStateBoolean* state); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetActionStateFloat( + XrSession session, + const XrActionStateGetInfo* getInfo, + XrActionStateFloat* state); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetActionStateVector2f( + XrSession session, + const XrActionStateGetInfo* getInfo, + XrActionStateVector2f* state); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetActionStatePose( + XrSession session, + const XrActionStateGetInfo* getInfo, + XrActionStatePose* state); + +XRAPI_ATTR XrResult XRAPI_CALL xrSyncActions( + XrSession session, + const XrActionsSyncInfo* syncInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateBoundSourcesForAction( + XrSession session, + const XrBoundSourcesForActionEnumerateInfo* enumerateInfo, + uint32_t sourceCapacityInput, + uint32_t* sourceCountOutput, + XrPath* sources); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetInputSourceLocalizedName( + XrSession session, + const XrInputSourceLocalizedNameGetInfo* getInfo, + uint32_t bufferCapacityInput, + uint32_t* bufferCountOutput, + char* buffer); + +XRAPI_ATTR XrResult XRAPI_CALL xrApplyHapticFeedback( + XrSession session, + const XrHapticActionInfo* hapticActionInfo, + const XrHapticBaseHeader* hapticFeedback); + +XRAPI_ATTR XrResult XRAPI_CALL xrStopHapticFeedback( + XrSession session, + const XrHapticActionInfo* hapticActionInfo); +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_KHR_composition_layer_cube 1 +#define XR_KHR_composition_layer_cube_SPEC_VERSION 8 +#define XR_KHR_COMPOSITION_LAYER_CUBE_EXTENSION_NAME "XR_KHR_composition_layer_cube" +typedef struct XrCompositionLayerCubeKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrCompositionLayerFlags layerFlags; + XrSpace space; + XrEyeVisibility eyeVisibility; + XrSwapchain swapchain; + uint32_t imageArrayIndex; + XrQuaternionf orientation; +} XrCompositionLayerCubeKHR; + + + +#define XR_KHR_composition_layer_depth 1 +#define XR_KHR_composition_layer_depth_SPEC_VERSION 5 +#define XR_KHR_COMPOSITION_LAYER_DEPTH_EXTENSION_NAME "XR_KHR_composition_layer_depth" +// XrCompositionLayerDepthInfoKHR extends XrCompositionLayerProjectionView +typedef struct XrCompositionLayerDepthInfoKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSwapchainSubImage subImage; + float minDepth; + float maxDepth; + float nearZ; + float farZ; +} XrCompositionLayerDepthInfoKHR; + + + +#define XR_KHR_composition_layer_cylinder 1 +#define XR_KHR_composition_layer_cylinder_SPEC_VERSION 4 +#define XR_KHR_COMPOSITION_LAYER_CYLINDER_EXTENSION_NAME "XR_KHR_composition_layer_cylinder" +typedef struct XrCompositionLayerCylinderKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrCompositionLayerFlags layerFlags; + XrSpace space; + XrEyeVisibility eyeVisibility; + XrSwapchainSubImage subImage; + XrPosef pose; + float radius; + float centralAngle; + float aspectRatio; +} XrCompositionLayerCylinderKHR; + + + +#define XR_KHR_composition_layer_equirect 1 +#define XR_KHR_composition_layer_equirect_SPEC_VERSION 3 +#define XR_KHR_COMPOSITION_LAYER_EQUIRECT_EXTENSION_NAME "XR_KHR_composition_layer_equirect" +typedef struct XrCompositionLayerEquirectKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrCompositionLayerFlags layerFlags; + XrSpace space; + XrEyeVisibility eyeVisibility; + XrSwapchainSubImage subImage; + XrPosef pose; + float radius; + XrVector2f scale; + XrVector2f bias; +} XrCompositionLayerEquirectKHR; + + + +#define XR_KHR_visibility_mask 1 +#define XR_KHR_visibility_mask_SPEC_VERSION 2 +#define XR_KHR_VISIBILITY_MASK_EXTENSION_NAME "XR_KHR_visibility_mask" + +typedef enum XrVisibilityMaskTypeKHR { + XR_VISIBILITY_MASK_TYPE_HIDDEN_TRIANGLE_MESH_KHR = 1, + XR_VISIBILITY_MASK_TYPE_VISIBLE_TRIANGLE_MESH_KHR = 2, + XR_VISIBILITY_MASK_TYPE_LINE_LOOP_KHR = 3, + XR_VISIBILITY_MASK_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF +} XrVisibilityMaskTypeKHR; +typedef struct XrVisibilityMaskKHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t vertexCapacityInput; + uint32_t vertexCountOutput; + XrVector2f* vertices; + uint32_t indexCapacityInput; + uint32_t indexCountOutput; + uint32_t* indices; +} XrVisibilityMaskKHR; + +typedef struct XrEventDataVisibilityMaskChangedKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSession session; + XrViewConfigurationType viewConfigurationType; + uint32_t viewIndex; +} XrEventDataVisibilityMaskChangedKHR; + +typedef XrResult (XRAPI_PTR *PFN_xrGetVisibilityMaskKHR)(XrSession session, XrViewConfigurationType viewConfigurationType, uint32_t viewIndex, XrVisibilityMaskTypeKHR visibilityMaskType, XrVisibilityMaskKHR* visibilityMask); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetVisibilityMaskKHR( + XrSession session, + XrViewConfigurationType viewConfigurationType, + uint32_t viewIndex, + XrVisibilityMaskTypeKHR visibilityMaskType, + XrVisibilityMaskKHR* visibilityMask); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_KHR_composition_layer_color_scale_bias 1 +#define XR_KHR_composition_layer_color_scale_bias_SPEC_VERSION 5 +#define XR_KHR_COMPOSITION_LAYER_COLOR_SCALE_BIAS_EXTENSION_NAME "XR_KHR_composition_layer_color_scale_bias" +// XrCompositionLayerColorScaleBiasKHR extends XrCompositionLayerBaseHeader +typedef struct XrCompositionLayerColorScaleBiasKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrColor4f colorScale; + XrColor4f colorBias; +} XrCompositionLayerColorScaleBiasKHR; + + + +#define XR_KHR_loader_init 1 +#define XR_KHR_loader_init_SPEC_VERSION 1 +#define XR_KHR_LOADER_INIT_EXTENSION_NAME "XR_KHR_loader_init" +typedef struct XR_MAY_ALIAS XrLoaderInitInfoBaseHeaderKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; +} XrLoaderInitInfoBaseHeaderKHR; + +typedef XrResult (XRAPI_PTR *PFN_xrInitializeLoaderKHR)(const XrLoaderInitInfoBaseHeaderKHR* loaderInitInfo); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrInitializeLoaderKHR( + const XrLoaderInitInfoBaseHeaderKHR* loaderInitInfo); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_KHR_composition_layer_equirect2 1 +#define XR_KHR_composition_layer_equirect2_SPEC_VERSION 1 +#define XR_KHR_COMPOSITION_LAYER_EQUIRECT2_EXTENSION_NAME "XR_KHR_composition_layer_equirect2" +typedef struct XrCompositionLayerEquirect2KHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrCompositionLayerFlags layerFlags; + XrSpace space; + XrEyeVisibility eyeVisibility; + XrSwapchainSubImage subImage; + XrPosef pose; + float radius; + float centralHorizontalAngle; + float upperVerticalAngle; + float lowerVerticalAngle; +} XrCompositionLayerEquirect2KHR; + + + +#define XR_KHR_binding_modification 1 +#define XR_KHR_binding_modification_SPEC_VERSION 1 +#define XR_KHR_BINDING_MODIFICATION_EXTENSION_NAME "XR_KHR_binding_modification" +typedef struct XrBindingModificationBaseHeaderKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; +} XrBindingModificationBaseHeaderKHR; + +// XrBindingModificationsKHR extends XrInteractionProfileSuggestedBinding +typedef struct XrBindingModificationsKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t bindingModificationCount; + const XrBindingModificationBaseHeaderKHR* const* bindingModifications; +} XrBindingModificationsKHR; + + + +#define XR_KHR_swapchain_usage_input_attachment_bit 1 +#define XR_KHR_swapchain_usage_input_attachment_bit_SPEC_VERSION 3 +#define XR_KHR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_EXTENSION_NAME "XR_KHR_swapchain_usage_input_attachment_bit" + + +#define XR_EXT_performance_settings 1 +#define XR_EXT_performance_settings_SPEC_VERSION 3 +#define XR_EXT_PERFORMANCE_SETTINGS_EXTENSION_NAME "XR_EXT_performance_settings" + +typedef enum XrPerfSettingsDomainEXT { + XR_PERF_SETTINGS_DOMAIN_CPU_EXT = 1, + XR_PERF_SETTINGS_DOMAIN_GPU_EXT = 2, + XR_PERF_SETTINGS_DOMAIN_MAX_ENUM_EXT = 0x7FFFFFFF +} XrPerfSettingsDomainEXT; + +typedef enum XrPerfSettingsSubDomainEXT { + XR_PERF_SETTINGS_SUB_DOMAIN_COMPOSITING_EXT = 1, + XR_PERF_SETTINGS_SUB_DOMAIN_RENDERING_EXT = 2, + XR_PERF_SETTINGS_SUB_DOMAIN_THERMAL_EXT = 3, + XR_PERF_SETTINGS_SUB_DOMAIN_MAX_ENUM_EXT = 0x7FFFFFFF +} XrPerfSettingsSubDomainEXT; + +typedef enum XrPerfSettingsLevelEXT { + XR_PERF_SETTINGS_LEVEL_POWER_SAVINGS_EXT = 0, + XR_PERF_SETTINGS_LEVEL_SUSTAINED_LOW_EXT = 25, + XR_PERF_SETTINGS_LEVEL_SUSTAINED_HIGH_EXT = 50, + XR_PERF_SETTINGS_LEVEL_BOOST_EXT = 75, + XR_PERF_SETTINGS_LEVEL_MAX_ENUM_EXT = 0x7FFFFFFF +} XrPerfSettingsLevelEXT; + +typedef enum XrPerfSettingsNotificationLevelEXT { + XR_PERF_SETTINGS_NOTIF_LEVEL_NORMAL_EXT = 0, + XR_PERF_SETTINGS_NOTIF_LEVEL_WARNING_EXT = 25, + XR_PERF_SETTINGS_NOTIF_LEVEL_IMPAIRED_EXT = 75, + XR_PERF_SETTINGS_NOTIFICATION_LEVEL_MAX_ENUM_EXT = 0x7FFFFFFF +} XrPerfSettingsNotificationLevelEXT; +typedef struct XrEventDataPerfSettingsEXT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrPerfSettingsDomainEXT domain; + XrPerfSettingsSubDomainEXT subDomain; + XrPerfSettingsNotificationLevelEXT fromLevel; + XrPerfSettingsNotificationLevelEXT toLevel; +} XrEventDataPerfSettingsEXT; + +typedef XrResult (XRAPI_PTR *PFN_xrPerfSettingsSetPerformanceLevelEXT)(XrSession session, XrPerfSettingsDomainEXT domain, XrPerfSettingsLevelEXT level); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrPerfSettingsSetPerformanceLevelEXT( + XrSession session, + XrPerfSettingsDomainEXT domain, + XrPerfSettingsLevelEXT level); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_EXT_thermal_query 1 +#define XR_EXT_thermal_query_SPEC_VERSION 2 +#define XR_EXT_THERMAL_QUERY_EXTENSION_NAME "XR_EXT_thermal_query" +typedef XrResult (XRAPI_PTR *PFN_xrThermalGetTemperatureTrendEXT)(XrSession session, XrPerfSettingsDomainEXT domain, XrPerfSettingsNotificationLevelEXT* notificationLevel, float* tempHeadroom, float* tempSlope); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrThermalGetTemperatureTrendEXT( + XrSession session, + XrPerfSettingsDomainEXT domain, + XrPerfSettingsNotificationLevelEXT* notificationLevel, + float* tempHeadroom, + float* tempSlope); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_EXT_debug_utils 1 +XR_DEFINE_HANDLE(XrDebugUtilsMessengerEXT) +#define XR_EXT_debug_utils_SPEC_VERSION 4 +#define XR_EXT_DEBUG_UTILS_EXTENSION_NAME "XR_EXT_debug_utils" +typedef XrFlags64 XrDebugUtilsMessageSeverityFlagsEXT; + +// Flag bits for XrDebugUtilsMessageSeverityFlagsEXT +static const XrDebugUtilsMessageSeverityFlagsEXT XR_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT = 0x00000001; +static const XrDebugUtilsMessageSeverityFlagsEXT XR_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT = 0x00000010; +static const XrDebugUtilsMessageSeverityFlagsEXT XR_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT = 0x00000100; +static const XrDebugUtilsMessageSeverityFlagsEXT XR_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT = 0x00001000; + +typedef XrFlags64 XrDebugUtilsMessageTypeFlagsEXT; + +// Flag bits for XrDebugUtilsMessageTypeFlagsEXT +static const XrDebugUtilsMessageTypeFlagsEXT XR_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT = 0x00000001; +static const XrDebugUtilsMessageTypeFlagsEXT XR_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT = 0x00000002; +static const XrDebugUtilsMessageTypeFlagsEXT XR_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT = 0x00000004; +static const XrDebugUtilsMessageTypeFlagsEXT XR_DEBUG_UTILS_MESSAGE_TYPE_CONFORMANCE_BIT_EXT = 0x00000008; + +typedef struct XrDebugUtilsObjectNameInfoEXT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrObjectType objectType; + uint64_t objectHandle; + const char* objectName; +} XrDebugUtilsObjectNameInfoEXT; + +typedef struct XrDebugUtilsLabelEXT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + const char* labelName; +} XrDebugUtilsLabelEXT; + +typedef struct XrDebugUtilsMessengerCallbackDataEXT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + const char* messageId; + const char* functionName; + const char* message; + uint32_t objectCount; + XrDebugUtilsObjectNameInfoEXT* objects; + uint32_t sessionLabelCount; + XrDebugUtilsLabelEXT* sessionLabels; +} XrDebugUtilsMessengerCallbackDataEXT; + +typedef XrBool32 (XRAPI_PTR *PFN_xrDebugUtilsMessengerCallbackEXT)( + XrDebugUtilsMessageSeverityFlagsEXT messageSeverity, + XrDebugUtilsMessageTypeFlagsEXT messageTypes, + const XrDebugUtilsMessengerCallbackDataEXT* callbackData, + void* userData); + + +// XrDebugUtilsMessengerCreateInfoEXT extends XrInstanceCreateInfo +typedef struct XrDebugUtilsMessengerCreateInfoEXT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrDebugUtilsMessageSeverityFlagsEXT messageSeverities; + XrDebugUtilsMessageTypeFlagsEXT messageTypes; + PFN_xrDebugUtilsMessengerCallbackEXT userCallback; + void* XR_MAY_ALIAS userData; +} XrDebugUtilsMessengerCreateInfoEXT; + +typedef XrResult (XRAPI_PTR *PFN_xrSetDebugUtilsObjectNameEXT)(XrInstance instance, const XrDebugUtilsObjectNameInfoEXT* nameInfo); +typedef XrResult (XRAPI_PTR *PFN_xrCreateDebugUtilsMessengerEXT)(XrInstance instance, const XrDebugUtilsMessengerCreateInfoEXT* createInfo, XrDebugUtilsMessengerEXT* messenger); +typedef XrResult (XRAPI_PTR *PFN_xrDestroyDebugUtilsMessengerEXT)(XrDebugUtilsMessengerEXT messenger); +typedef XrResult (XRAPI_PTR *PFN_xrSubmitDebugUtilsMessageEXT)(XrInstance instance, XrDebugUtilsMessageSeverityFlagsEXT messageSeverity, XrDebugUtilsMessageTypeFlagsEXT messageTypes, const XrDebugUtilsMessengerCallbackDataEXT* callbackData); +typedef XrResult (XRAPI_PTR *PFN_xrSessionBeginDebugUtilsLabelRegionEXT)(XrSession session, const XrDebugUtilsLabelEXT* labelInfo); +typedef XrResult (XRAPI_PTR *PFN_xrSessionEndDebugUtilsLabelRegionEXT)(XrSession session); +typedef XrResult (XRAPI_PTR *PFN_xrSessionInsertDebugUtilsLabelEXT)(XrSession session, const XrDebugUtilsLabelEXT* labelInfo); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrSetDebugUtilsObjectNameEXT( + XrInstance instance, + const XrDebugUtilsObjectNameInfoEXT* nameInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateDebugUtilsMessengerEXT( + XrInstance instance, + const XrDebugUtilsMessengerCreateInfoEXT* createInfo, + XrDebugUtilsMessengerEXT* messenger); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroyDebugUtilsMessengerEXT( + XrDebugUtilsMessengerEXT messenger); + +XRAPI_ATTR XrResult XRAPI_CALL xrSubmitDebugUtilsMessageEXT( + XrInstance instance, + XrDebugUtilsMessageSeverityFlagsEXT messageSeverity, + XrDebugUtilsMessageTypeFlagsEXT messageTypes, + const XrDebugUtilsMessengerCallbackDataEXT* callbackData); + +XRAPI_ATTR XrResult XRAPI_CALL xrSessionBeginDebugUtilsLabelRegionEXT( + XrSession session, + const XrDebugUtilsLabelEXT* labelInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrSessionEndDebugUtilsLabelRegionEXT( + XrSession session); + +XRAPI_ATTR XrResult XRAPI_CALL xrSessionInsertDebugUtilsLabelEXT( + XrSession session, + const XrDebugUtilsLabelEXT* labelInfo); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_EXT_eye_gaze_interaction 1 +#define XR_EXT_eye_gaze_interaction_SPEC_VERSION 1 +#define XR_EXT_EYE_GAZE_INTERACTION_EXTENSION_NAME "XR_EXT_eye_gaze_interaction" +// XrSystemEyeGazeInteractionPropertiesEXT extends XrSystemProperties +typedef struct XrSystemEyeGazeInteractionPropertiesEXT { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBool32 supportsEyeGazeInteraction; +} XrSystemEyeGazeInteractionPropertiesEXT; + +// XrEyeGazeSampleTimeEXT extends XrSpaceLocation +typedef struct XrEyeGazeSampleTimeEXT { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrTime time; +} XrEyeGazeSampleTimeEXT; + + + +#define XR_EXTX_overlay 1 +#define XR_EXTX_overlay_SPEC_VERSION 5 +#define XR_EXTX_OVERLAY_EXTENSION_NAME "XR_EXTX_overlay" +typedef XrFlags64 XrOverlaySessionCreateFlagsEXTX; + +// Flag bits for XrOverlaySessionCreateFlagsEXTX + +typedef XrFlags64 XrOverlayMainSessionFlagsEXTX; + +// Flag bits for XrOverlayMainSessionFlagsEXTX +static const XrOverlayMainSessionFlagsEXTX XR_OVERLAY_MAIN_SESSION_ENABLED_COMPOSITION_LAYER_INFO_DEPTH_BIT_EXTX = 0x00000001; + +// XrSessionCreateInfoOverlayEXTX extends XrSessionCreateInfo +typedef struct XrSessionCreateInfoOverlayEXTX { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrOverlaySessionCreateFlagsEXTX createFlags; + uint32_t sessionLayersPlacement; +} XrSessionCreateInfoOverlayEXTX; + +typedef struct XrEventDataMainSessionVisibilityChangedEXTX { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrBool32 visible; + XrOverlayMainSessionFlagsEXTX flags; +} XrEventDataMainSessionVisibilityChangedEXTX; + + + +#define XR_VARJO_quad_views 1 +#define XR_VARJO_quad_views_SPEC_VERSION 1 +#define XR_VARJO_QUAD_VIEWS_EXTENSION_NAME "XR_VARJO_quad_views" + + +#define XR_MSFT_unbounded_reference_space 1 +#define XR_MSFT_unbounded_reference_space_SPEC_VERSION 1 +#define XR_MSFT_UNBOUNDED_REFERENCE_SPACE_EXTENSION_NAME "XR_MSFT_unbounded_reference_space" + + +#define XR_MSFT_spatial_anchor 1 +XR_DEFINE_HANDLE(XrSpatialAnchorMSFT) +#define XR_MSFT_spatial_anchor_SPEC_VERSION 2 +#define XR_MSFT_SPATIAL_ANCHOR_EXTENSION_NAME "XR_MSFT_spatial_anchor" +typedef struct XrSpatialAnchorCreateInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSpace space; + XrPosef pose; + XrTime time; +} XrSpatialAnchorCreateInfoMSFT; + +typedef struct XrSpatialAnchorSpaceCreateInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSpatialAnchorMSFT anchor; + XrPosef poseInAnchorSpace; +} XrSpatialAnchorSpaceCreateInfoMSFT; + +typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorMSFT)(XrSession session, const XrSpatialAnchorCreateInfoMSFT* createInfo, XrSpatialAnchorMSFT* anchor); +typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorSpaceMSFT)(XrSession session, const XrSpatialAnchorSpaceCreateInfoMSFT* createInfo, XrSpace* space); +typedef XrResult (XRAPI_PTR *PFN_xrDestroySpatialAnchorMSFT)(XrSpatialAnchorMSFT anchor); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorMSFT( + XrSession session, + const XrSpatialAnchorCreateInfoMSFT* createInfo, + XrSpatialAnchorMSFT* anchor); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorSpaceMSFT( + XrSession session, + const XrSpatialAnchorSpaceCreateInfoMSFT* createInfo, + XrSpace* space); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroySpatialAnchorMSFT( + XrSpatialAnchorMSFT anchor); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_FB_composition_layer_image_layout 1 +#define XR_FB_composition_layer_image_layout_SPEC_VERSION 1 +#define XR_FB_COMPOSITION_LAYER_IMAGE_LAYOUT_EXTENSION_NAME "XR_FB_composition_layer_image_layout" +typedef XrFlags64 XrCompositionLayerImageLayoutFlagsFB; + +// Flag bits for XrCompositionLayerImageLayoutFlagsFB +static const XrCompositionLayerImageLayoutFlagsFB XR_COMPOSITION_LAYER_IMAGE_LAYOUT_VERTICAL_FLIP_BIT_FB = 0x00000001; + +// XrCompositionLayerImageLayoutFB extends XrCompositionLayerBaseHeader +typedef struct XrCompositionLayerImageLayoutFB { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrCompositionLayerImageLayoutFlagsFB flags; +} XrCompositionLayerImageLayoutFB; + + + +#define XR_FB_composition_layer_alpha_blend 1 +#define XR_FB_composition_layer_alpha_blend_SPEC_VERSION 2 +#define XR_FB_COMPOSITION_LAYER_ALPHA_BLEND_EXTENSION_NAME "XR_FB_composition_layer_alpha_blend" + +typedef enum XrBlendFactorFB { + XR_BLEND_FACTOR_ZERO_FB = 0, + XR_BLEND_FACTOR_ONE_FB = 1, + XR_BLEND_FACTOR_SRC_ALPHA_FB = 2, + XR_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA_FB = 3, + XR_BLEND_FACTOR_DST_ALPHA_FB = 4, + XR_BLEND_FACTOR_ONE_MINUS_DST_ALPHA_FB = 5, + XR_BLEND_FACTOR_MAX_ENUM_FB = 0x7FFFFFFF +} XrBlendFactorFB; +// XrCompositionLayerAlphaBlendFB extends XrCompositionLayerBaseHeader +typedef struct XrCompositionLayerAlphaBlendFB { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBlendFactorFB srcFactorColor; + XrBlendFactorFB dstFactorColor; + XrBlendFactorFB srcFactorAlpha; + XrBlendFactorFB dstFactorAlpha; +} XrCompositionLayerAlphaBlendFB; + + + +#define XR_MND_headless 1 +#define XR_MND_headless_SPEC_VERSION 2 +#define XR_MND_HEADLESS_EXTENSION_NAME "XR_MND_headless" + + +#define XR_OCULUS_android_session_state_enable 1 +#define XR_OCULUS_android_session_state_enable_SPEC_VERSION 1 +#define XR_OCULUS_ANDROID_SESSION_STATE_ENABLE_EXTENSION_NAME "XR_OCULUS_android_session_state_enable" + + +#define XR_EXT_view_configuration_depth_range 1 +#define XR_EXT_view_configuration_depth_range_SPEC_VERSION 1 +#define XR_EXT_VIEW_CONFIGURATION_DEPTH_RANGE_EXTENSION_NAME "XR_EXT_view_configuration_depth_range" +// XrViewConfigurationDepthRangeEXT extends XrViewConfigurationView +typedef struct XrViewConfigurationDepthRangeEXT { + XrStructureType type; + void* XR_MAY_ALIAS next; + float recommendedNearZ; + float minNearZ; + float recommendedFarZ; + float maxFarZ; +} XrViewConfigurationDepthRangeEXT; + + + +#define XR_EXT_conformance_automation 1 +#define XR_EXT_conformance_automation_SPEC_VERSION 3 +#define XR_EXT_CONFORMANCE_AUTOMATION_EXTENSION_NAME "XR_EXT_conformance_automation" +typedef XrResult (XRAPI_PTR *PFN_xrSetInputDeviceActiveEXT)(XrSession session, XrPath interactionProfile, XrPath topLevelPath, XrBool32 isActive); +typedef XrResult (XRAPI_PTR *PFN_xrSetInputDeviceStateBoolEXT)(XrSession session, XrPath topLevelPath, XrPath inputSourcePath, XrBool32 state); +typedef XrResult (XRAPI_PTR *PFN_xrSetInputDeviceStateFloatEXT)(XrSession session, XrPath topLevelPath, XrPath inputSourcePath, float state); +typedef XrResult (XRAPI_PTR *PFN_xrSetInputDeviceStateVector2fEXT)(XrSession session, XrPath topLevelPath, XrPath inputSourcePath, XrVector2f state); +typedef XrResult (XRAPI_PTR *PFN_xrSetInputDeviceLocationEXT)(XrSession session, XrPath topLevelPath, XrPath inputSourcePath, XrSpace space, XrPosef pose); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrSetInputDeviceActiveEXT( + XrSession session, + XrPath interactionProfile, + XrPath topLevelPath, + XrBool32 isActive); + +XRAPI_ATTR XrResult XRAPI_CALL xrSetInputDeviceStateBoolEXT( + XrSession session, + XrPath topLevelPath, + XrPath inputSourcePath, + XrBool32 state); + +XRAPI_ATTR XrResult XRAPI_CALL xrSetInputDeviceStateFloatEXT( + XrSession session, + XrPath topLevelPath, + XrPath inputSourcePath, + float state); + +XRAPI_ATTR XrResult XRAPI_CALL xrSetInputDeviceStateVector2fEXT( + XrSession session, + XrPath topLevelPath, + XrPath inputSourcePath, + XrVector2f state); + +XRAPI_ATTR XrResult XRAPI_CALL xrSetInputDeviceLocationEXT( + XrSession session, + XrPath topLevelPath, + XrPath inputSourcePath, + XrSpace space, + XrPosef pose); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_MSFT_spatial_graph_bridge 1 +#define XR_MSFT_spatial_graph_bridge_SPEC_VERSION 1 +#define XR_MSFT_SPATIAL_GRAPH_BRIDGE_EXTENSION_NAME "XR_MSFT_spatial_graph_bridge" + +typedef enum XrSpatialGraphNodeTypeMSFT { + XR_SPATIAL_GRAPH_NODE_TYPE_STATIC_MSFT = 1, + XR_SPATIAL_GRAPH_NODE_TYPE_DYNAMIC_MSFT = 2, + XR_SPATIAL_GRAPH_NODE_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF +} XrSpatialGraphNodeTypeMSFT; +typedef struct XrSpatialGraphNodeSpaceCreateInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSpatialGraphNodeTypeMSFT nodeType; + uint8_t nodeId[16]; + XrPosef pose; +} XrSpatialGraphNodeSpaceCreateInfoMSFT; + +typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialGraphNodeSpaceMSFT)(XrSession session, const XrSpatialGraphNodeSpaceCreateInfoMSFT* createInfo, XrSpace* space); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialGraphNodeSpaceMSFT( + XrSession session, + const XrSpatialGraphNodeSpaceCreateInfoMSFT* createInfo, + XrSpace* space); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_MSFT_hand_interaction 1 +#define XR_MSFT_hand_interaction_SPEC_VERSION 1 +#define XR_MSFT_HAND_INTERACTION_EXTENSION_NAME "XR_MSFT_hand_interaction" + + +#define XR_EXT_hand_tracking 1 + +#define XR_HAND_JOINT_COUNT_EXT 26 + +XR_DEFINE_HANDLE(XrHandTrackerEXT) +#define XR_EXT_hand_tracking_SPEC_VERSION 4 +#define XR_EXT_HAND_TRACKING_EXTENSION_NAME "XR_EXT_hand_tracking" + +typedef enum XrHandEXT { + XR_HAND_LEFT_EXT = 1, + XR_HAND_RIGHT_EXT = 2, + XR_HAND_MAX_ENUM_EXT = 0x7FFFFFFF +} XrHandEXT; + +typedef enum XrHandJointEXT { + XR_HAND_JOINT_PALM_EXT = 0, + XR_HAND_JOINT_WRIST_EXT = 1, + XR_HAND_JOINT_THUMB_METACARPAL_EXT = 2, + XR_HAND_JOINT_THUMB_PROXIMAL_EXT = 3, + XR_HAND_JOINT_THUMB_DISTAL_EXT = 4, + XR_HAND_JOINT_THUMB_TIP_EXT = 5, + XR_HAND_JOINT_INDEX_METACARPAL_EXT = 6, + XR_HAND_JOINT_INDEX_PROXIMAL_EXT = 7, + XR_HAND_JOINT_INDEX_INTERMEDIATE_EXT = 8, + XR_HAND_JOINT_INDEX_DISTAL_EXT = 9, + XR_HAND_JOINT_INDEX_TIP_EXT = 10, + XR_HAND_JOINT_MIDDLE_METACARPAL_EXT = 11, + XR_HAND_JOINT_MIDDLE_PROXIMAL_EXT = 12, + XR_HAND_JOINT_MIDDLE_INTERMEDIATE_EXT = 13, + XR_HAND_JOINT_MIDDLE_DISTAL_EXT = 14, + XR_HAND_JOINT_MIDDLE_TIP_EXT = 15, + XR_HAND_JOINT_RING_METACARPAL_EXT = 16, + XR_HAND_JOINT_RING_PROXIMAL_EXT = 17, + XR_HAND_JOINT_RING_INTERMEDIATE_EXT = 18, + XR_HAND_JOINT_RING_DISTAL_EXT = 19, + XR_HAND_JOINT_RING_TIP_EXT = 20, + XR_HAND_JOINT_LITTLE_METACARPAL_EXT = 21, + XR_HAND_JOINT_LITTLE_PROXIMAL_EXT = 22, + XR_HAND_JOINT_LITTLE_INTERMEDIATE_EXT = 23, + XR_HAND_JOINT_LITTLE_DISTAL_EXT = 24, + XR_HAND_JOINT_LITTLE_TIP_EXT = 25, + XR_HAND_JOINT_MAX_ENUM_EXT = 0x7FFFFFFF +} XrHandJointEXT; + +typedef enum XrHandJointSetEXT { + XR_HAND_JOINT_SET_DEFAULT_EXT = 0, + XR_HAND_JOINT_SET_MAX_ENUM_EXT = 0x7FFFFFFF +} XrHandJointSetEXT; +// XrSystemHandTrackingPropertiesEXT extends XrSystemProperties +typedef struct XrSystemHandTrackingPropertiesEXT { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBool32 supportsHandTracking; +} XrSystemHandTrackingPropertiesEXT; + +typedef struct XrHandTrackerCreateInfoEXT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrHandEXT hand; + XrHandJointSetEXT handJointSet; +} XrHandTrackerCreateInfoEXT; + +typedef struct XrHandJointsLocateInfoEXT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSpace baseSpace; + XrTime time; +} XrHandJointsLocateInfoEXT; + +typedef struct XrHandJointLocationEXT { + XrSpaceLocationFlags locationFlags; + XrPosef pose; + float radius; +} XrHandJointLocationEXT; + +typedef struct XrHandJointVelocityEXT { + XrSpaceVelocityFlags velocityFlags; + XrVector3f linearVelocity; + XrVector3f angularVelocity; +} XrHandJointVelocityEXT; + +typedef struct XrHandJointLocationsEXT { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBool32 isActive; + uint32_t jointCount; + XrHandJointLocationEXT* jointLocations; +} XrHandJointLocationsEXT; + +// XrHandJointVelocitiesEXT extends XrHandJointLocationsEXT +typedef struct XrHandJointVelocitiesEXT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t jointCount; + XrHandJointVelocityEXT* jointVelocities; +} XrHandJointVelocitiesEXT; + +typedef XrResult (XRAPI_PTR *PFN_xrCreateHandTrackerEXT)(XrSession session, const XrHandTrackerCreateInfoEXT* createInfo, XrHandTrackerEXT* handTracker); +typedef XrResult (XRAPI_PTR *PFN_xrDestroyHandTrackerEXT)(XrHandTrackerEXT handTracker); +typedef XrResult (XRAPI_PTR *PFN_xrLocateHandJointsEXT)(XrHandTrackerEXT handTracker, const XrHandJointsLocateInfoEXT* locateInfo, XrHandJointLocationsEXT* locations); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreateHandTrackerEXT( + XrSession session, + const XrHandTrackerCreateInfoEXT* createInfo, + XrHandTrackerEXT* handTracker); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroyHandTrackerEXT( + XrHandTrackerEXT handTracker); + +XRAPI_ATTR XrResult XRAPI_CALL xrLocateHandJointsEXT( + XrHandTrackerEXT handTracker, + const XrHandJointsLocateInfoEXT* locateInfo, + XrHandJointLocationsEXT* locations); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_MSFT_hand_tracking_mesh 1 +#define XR_MSFT_hand_tracking_mesh_SPEC_VERSION 3 +#define XR_MSFT_HAND_TRACKING_MESH_EXTENSION_NAME "XR_MSFT_hand_tracking_mesh" + +typedef enum XrHandPoseTypeMSFT { + XR_HAND_POSE_TYPE_TRACKED_MSFT = 0, + XR_HAND_POSE_TYPE_REFERENCE_OPEN_PALM_MSFT = 1, + XR_HAND_POSE_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF +} XrHandPoseTypeMSFT; +// XrSystemHandTrackingMeshPropertiesMSFT extends XrSystemProperties +typedef struct XrSystemHandTrackingMeshPropertiesMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBool32 supportsHandTrackingMesh; + uint32_t maxHandMeshIndexCount; + uint32_t maxHandMeshVertexCount; +} XrSystemHandTrackingMeshPropertiesMSFT; + +typedef struct XrHandMeshSpaceCreateInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrHandPoseTypeMSFT handPoseType; + XrPosef poseInHandMeshSpace; +} XrHandMeshSpaceCreateInfoMSFT; + +typedef struct XrHandMeshUpdateInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrTime time; + XrHandPoseTypeMSFT handPoseType; +} XrHandMeshUpdateInfoMSFT; + +typedef struct XrHandMeshIndexBufferMSFT { + uint32_t indexBufferKey; + uint32_t indexCapacityInput; + uint32_t indexCountOutput; + uint32_t* indices; +} XrHandMeshIndexBufferMSFT; + +typedef struct XrHandMeshVertexMSFT { + XrVector3f position; + XrVector3f normal; +} XrHandMeshVertexMSFT; + +typedef struct XrHandMeshVertexBufferMSFT { + XrTime vertexUpdateTime; + uint32_t vertexCapacityInput; + uint32_t vertexCountOutput; + XrHandMeshVertexMSFT* vertices; +} XrHandMeshVertexBufferMSFT; + +typedef struct XrHandMeshMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBool32 isActive; + XrBool32 indexBufferChanged; + XrBool32 vertexBufferChanged; + XrHandMeshIndexBufferMSFT indexBuffer; + XrHandMeshVertexBufferMSFT vertexBuffer; +} XrHandMeshMSFT; + +// XrHandPoseTypeInfoMSFT extends XrHandTrackerCreateInfoEXT +typedef struct XrHandPoseTypeInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrHandPoseTypeMSFT handPoseType; +} XrHandPoseTypeInfoMSFT; + +typedef XrResult (XRAPI_PTR *PFN_xrCreateHandMeshSpaceMSFT)(XrHandTrackerEXT handTracker, const XrHandMeshSpaceCreateInfoMSFT* createInfo, XrSpace* space); +typedef XrResult (XRAPI_PTR *PFN_xrUpdateHandMeshMSFT)(XrHandTrackerEXT handTracker, const XrHandMeshUpdateInfoMSFT* updateInfo, XrHandMeshMSFT* handMesh); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreateHandMeshSpaceMSFT( + XrHandTrackerEXT handTracker, + const XrHandMeshSpaceCreateInfoMSFT* createInfo, + XrSpace* space); + +XRAPI_ATTR XrResult XRAPI_CALL xrUpdateHandMeshMSFT( + XrHandTrackerEXT handTracker, + const XrHandMeshUpdateInfoMSFT* updateInfo, + XrHandMeshMSFT* handMesh); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_MSFT_secondary_view_configuration 1 +#define XR_MSFT_secondary_view_configuration_SPEC_VERSION 1 +#define XR_MSFT_SECONDARY_VIEW_CONFIGURATION_EXTENSION_NAME "XR_MSFT_secondary_view_configuration" +// XrSecondaryViewConfigurationSessionBeginInfoMSFT extends XrSessionBeginInfo +typedef struct XrSecondaryViewConfigurationSessionBeginInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t viewConfigurationCount; + const XrViewConfigurationType* enabledViewConfigurationTypes; +} XrSecondaryViewConfigurationSessionBeginInfoMSFT; + +typedef struct XrSecondaryViewConfigurationStateMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrViewConfigurationType viewConfigurationType; + XrBool32 active; +} XrSecondaryViewConfigurationStateMSFT; + +// XrSecondaryViewConfigurationFrameStateMSFT extends XrFrameState +typedef struct XrSecondaryViewConfigurationFrameStateMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t viewConfigurationCount; + XrSecondaryViewConfigurationStateMSFT* viewConfigurationStates; +} XrSecondaryViewConfigurationFrameStateMSFT; + +typedef struct XrSecondaryViewConfigurationLayerInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrViewConfigurationType viewConfigurationType; + XrEnvironmentBlendMode environmentBlendMode; + uint32_t layerCount; + const XrCompositionLayerBaseHeader* const* layers; +} XrSecondaryViewConfigurationLayerInfoMSFT; + +// XrSecondaryViewConfigurationFrameEndInfoMSFT extends XrFrameEndInfo +typedef struct XrSecondaryViewConfigurationFrameEndInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t viewConfigurationCount; + const XrSecondaryViewConfigurationLayerInfoMSFT* viewConfigurationLayersInfo; +} XrSecondaryViewConfigurationFrameEndInfoMSFT; + +// XrSecondaryViewConfigurationSwapchainCreateInfoMSFT extends XrSwapchainCreateInfo +typedef struct XrSecondaryViewConfigurationSwapchainCreateInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrViewConfigurationType viewConfigurationType; +} XrSecondaryViewConfigurationSwapchainCreateInfoMSFT; + + + +#define XR_MSFT_first_person_observer 1 +#define XR_MSFT_first_person_observer_SPEC_VERSION 1 +#define XR_MSFT_FIRST_PERSON_OBSERVER_EXTENSION_NAME "XR_MSFT_first_person_observer" + + +#define XR_MSFT_controller_model 1 + +#define XR_NULL_CONTROLLER_MODEL_KEY_MSFT 0 + +XR_DEFINE_ATOM(XrControllerModelKeyMSFT) +#define XR_MSFT_controller_model_SPEC_VERSION 2 +#define XR_MSFT_CONTROLLER_MODEL_EXTENSION_NAME "XR_MSFT_controller_model" +#define XR_MAX_CONTROLLER_MODEL_NODE_NAME_SIZE_MSFT 64 +typedef struct XrControllerModelKeyStateMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrControllerModelKeyMSFT modelKey; +} XrControllerModelKeyStateMSFT; + +typedef struct XrControllerModelNodePropertiesMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + char parentNodeName[XR_MAX_CONTROLLER_MODEL_NODE_NAME_SIZE_MSFT]; + char nodeName[XR_MAX_CONTROLLER_MODEL_NODE_NAME_SIZE_MSFT]; +} XrControllerModelNodePropertiesMSFT; + +typedef struct XrControllerModelPropertiesMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t nodeCapacityInput; + uint32_t nodeCountOutput; + XrControllerModelNodePropertiesMSFT* nodeProperties; +} XrControllerModelPropertiesMSFT; + +typedef struct XrControllerModelNodeStateMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrPosef nodePose; +} XrControllerModelNodeStateMSFT; + +typedef struct XrControllerModelStateMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t nodeCapacityInput; + uint32_t nodeCountOutput; + XrControllerModelNodeStateMSFT* nodeStates; +} XrControllerModelStateMSFT; + +typedef XrResult (XRAPI_PTR *PFN_xrGetControllerModelKeyMSFT)(XrSession session, XrPath topLevelUserPath, XrControllerModelKeyStateMSFT* controllerModelKeyState); +typedef XrResult (XRAPI_PTR *PFN_xrLoadControllerModelMSFT)(XrSession session, XrControllerModelKeyMSFT modelKey, uint32_t bufferCapacityInput, uint32_t* bufferCountOutput, uint8_t* buffer); +typedef XrResult (XRAPI_PTR *PFN_xrGetControllerModelPropertiesMSFT)(XrSession session, XrControllerModelKeyMSFT modelKey, XrControllerModelPropertiesMSFT* properties); +typedef XrResult (XRAPI_PTR *PFN_xrGetControllerModelStateMSFT)(XrSession session, XrControllerModelKeyMSFT modelKey, XrControllerModelStateMSFT* state); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetControllerModelKeyMSFT( + XrSession session, + XrPath topLevelUserPath, + XrControllerModelKeyStateMSFT* controllerModelKeyState); + +XRAPI_ATTR XrResult XRAPI_CALL xrLoadControllerModelMSFT( + XrSession session, + XrControllerModelKeyMSFT modelKey, + uint32_t bufferCapacityInput, + uint32_t* bufferCountOutput, + uint8_t* buffer); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetControllerModelPropertiesMSFT( + XrSession session, + XrControllerModelKeyMSFT modelKey, + XrControllerModelPropertiesMSFT* properties); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetControllerModelStateMSFT( + XrSession session, + XrControllerModelKeyMSFT modelKey, + XrControllerModelStateMSFT* state); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_EXT_win32_appcontainer_compatible 1 +#define XR_EXT_win32_appcontainer_compatible_SPEC_VERSION 1 +#define XR_EXT_WIN32_APPCONTAINER_COMPATIBLE_EXTENSION_NAME "XR_EXT_win32_appcontainer_compatible" + + +#define XR_EPIC_view_configuration_fov 1 +#define XR_EPIC_view_configuration_fov_SPEC_VERSION 2 +#define XR_EPIC_VIEW_CONFIGURATION_FOV_EXTENSION_NAME "XR_EPIC_view_configuration_fov" +// XrViewConfigurationViewFovEPIC extends XrViewConfigurationView +typedef struct XrViewConfigurationViewFovEPIC { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrFovf recommendedFov; + XrFovf maxMutableFov; +} XrViewConfigurationViewFovEPIC; + + + +#define XR_MSFT_composition_layer_reprojection 1 +#define XR_MSFT_composition_layer_reprojection_SPEC_VERSION 1 +#define XR_MSFT_COMPOSITION_LAYER_REPROJECTION_EXTENSION_NAME "XR_MSFT_composition_layer_reprojection" + +typedef enum XrReprojectionModeMSFT { + XR_REPROJECTION_MODE_DEPTH_MSFT = 1, + XR_REPROJECTION_MODE_PLANAR_FROM_DEPTH_MSFT = 2, + XR_REPROJECTION_MODE_PLANAR_MANUAL_MSFT = 3, + XR_REPROJECTION_MODE_ORIENTATION_ONLY_MSFT = 4, + XR_REPROJECTION_MODE_MAX_ENUM_MSFT = 0x7FFFFFFF +} XrReprojectionModeMSFT; +// XrCompositionLayerReprojectionInfoMSFT extends XrCompositionLayerProjection +typedef struct XrCompositionLayerReprojectionInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrReprojectionModeMSFT reprojectionMode; +} XrCompositionLayerReprojectionInfoMSFT; + +// XrCompositionLayerReprojectionPlaneOverrideMSFT extends XrCompositionLayerProjection +typedef struct XrCompositionLayerReprojectionPlaneOverrideMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrVector3f position; + XrVector3f normal; + XrVector3f velocity; +} XrCompositionLayerReprojectionPlaneOverrideMSFT; + +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateReprojectionModesMSFT)(XrInstance instance, XrSystemId systemId, XrViewConfigurationType viewConfigurationType, uint32_t modeCapacityInput, uint32_t* modeCountOutput, XrReprojectionModeMSFT* modes); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateReprojectionModesMSFT( + XrInstance instance, + XrSystemId systemId, + XrViewConfigurationType viewConfigurationType, + uint32_t modeCapacityInput, + uint32_t* modeCountOutput, + XrReprojectionModeMSFT* modes); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_HUAWEI_controller_interaction 1 +#define XR_HUAWEI_controller_interaction_SPEC_VERSION 1 +#define XR_HUAWEI_CONTROLLER_INTERACTION_EXTENSION_NAME "XR_HUAWEI_controller_interaction" + + +#define XR_FB_swapchain_update_state 1 +#define XR_FB_swapchain_update_state_SPEC_VERSION 3 +#define XR_FB_SWAPCHAIN_UPDATE_STATE_EXTENSION_NAME "XR_FB_swapchain_update_state" +typedef struct XR_MAY_ALIAS XrSwapchainStateBaseHeaderFB { + XrStructureType type; + void* XR_MAY_ALIAS next; +} XrSwapchainStateBaseHeaderFB; + +typedef XrResult (XRAPI_PTR *PFN_xrUpdateSwapchainFB)(XrSwapchain swapchain, const XrSwapchainStateBaseHeaderFB* state); +typedef XrResult (XRAPI_PTR *PFN_xrGetSwapchainStateFB)(XrSwapchain swapchain, XrSwapchainStateBaseHeaderFB* state); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrUpdateSwapchainFB( + XrSwapchain swapchain, + const XrSwapchainStateBaseHeaderFB* state); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSwapchainStateFB( + XrSwapchain swapchain, + XrSwapchainStateBaseHeaderFB* state); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_FB_composition_layer_secure_content 1 +#define XR_FB_composition_layer_secure_content_SPEC_VERSION 1 +#define XR_FB_COMPOSITION_LAYER_SECURE_CONTENT_EXTENSION_NAME "XR_FB_composition_layer_secure_content" +typedef XrFlags64 XrCompositionLayerSecureContentFlagsFB; + +// Flag bits for XrCompositionLayerSecureContentFlagsFB +static const XrCompositionLayerSecureContentFlagsFB XR_COMPOSITION_LAYER_SECURE_CONTENT_EXCLUDE_LAYER_BIT_FB = 0x00000001; +static const XrCompositionLayerSecureContentFlagsFB XR_COMPOSITION_LAYER_SECURE_CONTENT_REPLACE_LAYER_BIT_FB = 0x00000002; + +// XrCompositionLayerSecureContentFB extends XrCompositionLayerBaseHeader +typedef struct XrCompositionLayerSecureContentFB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrCompositionLayerSecureContentFlagsFB flags; +} XrCompositionLayerSecureContentFB; + + + +#define XR_VALVE_analog_threshold 1 +#define XR_VALVE_analog_threshold_SPEC_VERSION 1 +#define XR_VALVE_ANALOG_THRESHOLD_EXTENSION_NAME "XR_VALVE_analog_threshold" +// XrInteractionProfileAnalogThresholdVALVE extends XrInteractionProfileSuggestedBinding +typedef struct XrInteractionProfileAnalogThresholdVALVE { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrAction action; + XrPath binding; + float onThreshold; + float offThreshold; + const XrHapticBaseHeader* onHaptic; + const XrHapticBaseHeader* offHaptic; +} XrInteractionProfileAnalogThresholdVALVE; + + + +#define XR_EXT_hand_joints_motion_range 1 +#define XR_EXT_hand_joints_motion_range_SPEC_VERSION 1 +#define XR_EXT_HAND_JOINTS_MOTION_RANGE_EXTENSION_NAME "XR_EXT_hand_joints_motion_range" + +typedef enum XrHandJointsMotionRangeEXT { + XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT = 1, + XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT = 2, + XR_HAND_JOINTS_MOTION_RANGE_MAX_ENUM_EXT = 0x7FFFFFFF +} XrHandJointsMotionRangeEXT; +// XrHandJointsMotionRangeInfoEXT extends XrHandJointsLocateInfoEXT +typedef struct XrHandJointsMotionRangeInfoEXT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrHandJointsMotionRangeEXT handJointsMotionRange; +} XrHandJointsMotionRangeInfoEXT; + + + +#define XR_EXT_samsung_odyssey_controller 1 +#define XR_EXT_samsung_odyssey_controller_SPEC_VERSION 1 +#define XR_EXT_SAMSUNG_ODYSSEY_CONTROLLER_EXTENSION_NAME "XR_EXT_samsung_odyssey_controller" + + +#define XR_EXT_hp_mixed_reality_controller 1 +#define XR_EXT_hp_mixed_reality_controller_SPEC_VERSION 1 +#define XR_EXT_HP_MIXED_REALITY_CONTROLLER_EXTENSION_NAME "XR_EXT_hp_mixed_reality_controller" + + +#define XR_MND_swapchain_usage_input_attachment_bit 1 +#define XR_MND_swapchain_usage_input_attachment_bit_SPEC_VERSION 2 +#define XR_MND_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_EXTENSION_NAME "XR_MND_swapchain_usage_input_attachment_bit" + + +#define XR_MSFT_scene_understanding 1 + + XR_DEFINE_HANDLE(XrSceneObserverMSFT) + + + XR_DEFINE_HANDLE(XrSceneMSFT) + +#define XR_MSFT_scene_understanding_SPEC_VERSION 1 +#define XR_MSFT_SCENE_UNDERSTANDING_EXTENSION_NAME "XR_MSFT_scene_understanding" + +typedef enum XrSceneComputeFeatureMSFT { + XR_SCENE_COMPUTE_FEATURE_PLANE_MSFT = 1, + XR_SCENE_COMPUTE_FEATURE_PLANE_MESH_MSFT = 2, + XR_SCENE_COMPUTE_FEATURE_VISUAL_MESH_MSFT = 3, + XR_SCENE_COMPUTE_FEATURE_COLLIDER_MESH_MSFT = 4, + XR_SCENE_COMPUTE_FEATURE_SERIALIZE_SCENE_MSFT = 1000098000, + XR_SCENE_COMPUTE_FEATURE_MAX_ENUM_MSFT = 0x7FFFFFFF +} XrSceneComputeFeatureMSFT; + +typedef enum XrSceneComputeConsistencyMSFT { + XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_COMPLETE_MSFT = 1, + XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_INCOMPLETE_FAST_MSFT = 2, + XR_SCENE_COMPUTE_CONSISTENCY_OCCLUSION_OPTIMIZED_MSFT = 3, + XR_SCENE_COMPUTE_CONSISTENCY_MAX_ENUM_MSFT = 0x7FFFFFFF +} XrSceneComputeConsistencyMSFT; + +typedef enum XrMeshComputeLodMSFT { + XR_MESH_COMPUTE_LOD_COARSE_MSFT = 1, + XR_MESH_COMPUTE_LOD_MEDIUM_MSFT = 2, + XR_MESH_COMPUTE_LOD_FINE_MSFT = 3, + XR_MESH_COMPUTE_LOD_UNLIMITED_MSFT = 4, + XR_MESH_COMPUTE_LOD_MAX_ENUM_MSFT = 0x7FFFFFFF +} XrMeshComputeLodMSFT; + +typedef enum XrSceneComponentTypeMSFT { + XR_SCENE_COMPONENT_TYPE_INVALID_MSFT = -1, + XR_SCENE_COMPONENT_TYPE_OBJECT_MSFT = 1, + XR_SCENE_COMPONENT_TYPE_PLANE_MSFT = 2, + XR_SCENE_COMPONENT_TYPE_VISUAL_MESH_MSFT = 3, + XR_SCENE_COMPONENT_TYPE_COLLIDER_MESH_MSFT = 4, + XR_SCENE_COMPONENT_TYPE_SERIALIZED_SCENE_FRAGMENT_MSFT = 1000098000, + XR_SCENE_COMPONENT_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF +} XrSceneComponentTypeMSFT; + +typedef enum XrSceneObjectTypeMSFT { + XR_SCENE_OBJECT_TYPE_UNCATEGORIZED_MSFT = -1, + XR_SCENE_OBJECT_TYPE_BACKGROUND_MSFT = 1, + XR_SCENE_OBJECT_TYPE_WALL_MSFT = 2, + XR_SCENE_OBJECT_TYPE_FLOOR_MSFT = 3, + XR_SCENE_OBJECT_TYPE_CEILING_MSFT = 4, + XR_SCENE_OBJECT_TYPE_PLATFORM_MSFT = 5, + XR_SCENE_OBJECT_TYPE_INFERRED_MSFT = 6, + XR_SCENE_OBJECT_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF +} XrSceneObjectTypeMSFT; + +typedef enum XrScenePlaneAlignmentTypeMSFT { + XR_SCENE_PLANE_ALIGNMENT_TYPE_NON_ORTHOGONAL_MSFT = 0, + XR_SCENE_PLANE_ALIGNMENT_TYPE_HORIZONTAL_MSFT = 1, + XR_SCENE_PLANE_ALIGNMENT_TYPE_VERTICAL_MSFT = 2, + XR_SCENE_PLANE_ALIGNMENT_TYPE_MAX_ENUM_MSFT = 0x7FFFFFFF +} XrScenePlaneAlignmentTypeMSFT; + +typedef enum XrSceneComputeStateMSFT { + XR_SCENE_COMPUTE_STATE_NONE_MSFT = 0, + XR_SCENE_COMPUTE_STATE_UPDATING_MSFT = 1, + XR_SCENE_COMPUTE_STATE_COMPLETED_MSFT = 2, + XR_SCENE_COMPUTE_STATE_COMPLETED_WITH_ERROR_MSFT = 3, + XR_SCENE_COMPUTE_STATE_MAX_ENUM_MSFT = 0x7FFFFFFF +} XrSceneComputeStateMSFT; +typedef struct XrUuidMSFT { + uint8_t bytes[16]; +} XrUuidMSFT; + +typedef struct XrSceneObserverCreateInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; +} XrSceneObserverCreateInfoMSFT; + +typedef struct XrSceneCreateInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; +} XrSceneCreateInfoMSFT; + +typedef struct XrSceneSphereBoundMSFT { + XrVector3f center; + float radius; +} XrSceneSphereBoundMSFT; + +typedef struct XrSceneOrientedBoxBoundMSFT { + XrPosef pose; + XrVector3f extents; +} XrSceneOrientedBoxBoundMSFT; + +typedef struct XrSceneFrustumBoundMSFT { + XrPosef pose; + XrFovf fov; + float farDistance; +} XrSceneFrustumBoundMSFT; + +typedef struct XrSceneBoundsMSFT { + XrSpace space; + XrTime time; + uint32_t sphereCount; + const XrSceneSphereBoundMSFT* spheres; + uint32_t boxCount; + const XrSceneOrientedBoxBoundMSFT* boxes; + uint32_t frustumCount; + const XrSceneFrustumBoundMSFT* frustums; +} XrSceneBoundsMSFT; + +typedef struct XrNewSceneComputeInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t requestedFeatureCount; + const XrSceneComputeFeatureMSFT* requestedFeatures; + XrSceneComputeConsistencyMSFT consistency; + XrSceneBoundsMSFT bounds; +} XrNewSceneComputeInfoMSFT; + +// XrVisualMeshComputeLodInfoMSFT extends XrNewSceneComputeInfoMSFT +typedef struct XrVisualMeshComputeLodInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrMeshComputeLodMSFT lod; +} XrVisualMeshComputeLodInfoMSFT; + +typedef struct XrSceneComponentMSFT { + XrSceneComponentTypeMSFT componentType; + XrUuidMSFT id; + XrUuidMSFT parentId; + XrTime updateTime; +} XrSceneComponentMSFT; + +typedef struct XrSceneComponentsMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t componentCapacityInput; + uint32_t componentCountOutput; + XrSceneComponentMSFT* components; +} XrSceneComponentsMSFT; + +typedef struct XrSceneComponentsGetInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSceneComponentTypeMSFT componentType; +} XrSceneComponentsGetInfoMSFT; + +typedef struct XrSceneComponentLocationMSFT { + XrSpaceLocationFlags flags; + XrPosef pose; +} XrSceneComponentLocationMSFT; + +typedef struct XrSceneComponentLocationsMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t locationCount; + XrSceneComponentLocationMSFT* locations; +} XrSceneComponentLocationsMSFT; + +typedef struct XrSceneComponentsLocateInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSpace baseSpace; + XrTime time; + uint32_t componentIdCount; + const XrUuidMSFT* componentIds; +} XrSceneComponentsLocateInfoMSFT; + +typedef struct XrSceneObjectMSFT { + XrSceneObjectTypeMSFT objectType; +} XrSceneObjectMSFT; + +// XrSceneObjectsMSFT extends XrSceneComponentsMSFT +typedef struct XrSceneObjectsMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t sceneObjectCount; + XrSceneObjectMSFT* sceneObjects; +} XrSceneObjectsMSFT; + +// XrSceneComponentParentFilterInfoMSFT extends XrSceneComponentsGetInfoMSFT +typedef struct XrSceneComponentParentFilterInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrUuidMSFT parentId; +} XrSceneComponentParentFilterInfoMSFT; + +// XrSceneObjectTypesFilterInfoMSFT extends XrSceneComponentsGetInfoMSFT +typedef struct XrSceneObjectTypesFilterInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t objectTypeCount; + const XrSceneObjectTypeMSFT* objectTypes; +} XrSceneObjectTypesFilterInfoMSFT; + +typedef struct XrScenePlaneMSFT { + XrScenePlaneAlignmentTypeMSFT alignment; + XrExtent2Df size; + uint64_t meshBufferId; + XrBool32 supportsIndicesUint16; +} XrScenePlaneMSFT; + +// XrScenePlanesMSFT extends XrSceneComponentsMSFT +typedef struct XrScenePlanesMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t scenePlaneCount; + XrScenePlaneMSFT* scenePlanes; +} XrScenePlanesMSFT; + +// XrScenePlaneAlignmentFilterInfoMSFT extends XrSceneComponentsGetInfoMSFT +typedef struct XrScenePlaneAlignmentFilterInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t alignmentCount; + const XrScenePlaneAlignmentTypeMSFT* alignments; +} XrScenePlaneAlignmentFilterInfoMSFT; + +typedef struct XrSceneMeshMSFT { + uint64_t meshBufferId; + XrBool32 supportsIndicesUint16; +} XrSceneMeshMSFT; + +// XrSceneMeshesMSFT extends XrSceneComponentsMSFT +typedef struct XrSceneMeshesMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t sceneMeshCount; + XrSceneMeshMSFT* sceneMeshes; +} XrSceneMeshesMSFT; + +typedef struct XrSceneMeshBuffersGetInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint64_t meshBufferId; +} XrSceneMeshBuffersGetInfoMSFT; + +typedef struct XrSceneMeshBuffersMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; +} XrSceneMeshBuffersMSFT; + +typedef struct XrSceneMeshVertexBufferMSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t vertexCapacityInput; + uint32_t vertexCountOutput; + XrVector3f* vertices; +} XrSceneMeshVertexBufferMSFT; + +typedef struct XrSceneMeshIndicesUint32MSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t indexCapacityInput; + uint32_t indexCountOutput; + uint32_t* indices; +} XrSceneMeshIndicesUint32MSFT; + +typedef struct XrSceneMeshIndicesUint16MSFT { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t indexCapacityInput; + uint32_t indexCountOutput; + uint16_t* indices; +} XrSceneMeshIndicesUint16MSFT; + +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateSceneComputeFeaturesMSFT)(XrInstance instance, XrSystemId systemId, uint32_t featureCapacityInput, uint32_t* featureCountOutput, XrSceneComputeFeatureMSFT* features); +typedef XrResult (XRAPI_PTR *PFN_xrCreateSceneObserverMSFT)(XrSession session, const XrSceneObserverCreateInfoMSFT* createInfo, XrSceneObserverMSFT* sceneObserver); +typedef XrResult (XRAPI_PTR *PFN_xrDestroySceneObserverMSFT)(XrSceneObserverMSFT sceneObserver); +typedef XrResult (XRAPI_PTR *PFN_xrCreateSceneMSFT)(XrSceneObserverMSFT sceneObserver, const XrSceneCreateInfoMSFT* createInfo, XrSceneMSFT* scene); +typedef XrResult (XRAPI_PTR *PFN_xrDestroySceneMSFT)(XrSceneMSFT scene); +typedef XrResult (XRAPI_PTR *PFN_xrComputeNewSceneMSFT)(XrSceneObserverMSFT sceneObserver, const XrNewSceneComputeInfoMSFT* computeInfo); +typedef XrResult (XRAPI_PTR *PFN_xrGetSceneComputeStateMSFT)(XrSceneObserverMSFT sceneObserver, XrSceneComputeStateMSFT* state); +typedef XrResult (XRAPI_PTR *PFN_xrGetSceneComponentsMSFT)(XrSceneMSFT scene, const XrSceneComponentsGetInfoMSFT* getInfo, XrSceneComponentsMSFT* components); +typedef XrResult (XRAPI_PTR *PFN_xrLocateSceneComponentsMSFT)(XrSceneMSFT scene, const XrSceneComponentsLocateInfoMSFT* locateInfo, XrSceneComponentLocationsMSFT* locations); +typedef XrResult (XRAPI_PTR *PFN_xrGetSceneMeshBuffersMSFT)(XrSceneMSFT scene, const XrSceneMeshBuffersGetInfoMSFT* getInfo, XrSceneMeshBuffersMSFT* buffers); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateSceneComputeFeaturesMSFT( + XrInstance instance, + XrSystemId systemId, + uint32_t featureCapacityInput, + uint32_t* featureCountOutput, + XrSceneComputeFeatureMSFT* features); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSceneObserverMSFT( + XrSession session, + const XrSceneObserverCreateInfoMSFT* createInfo, + XrSceneObserverMSFT* sceneObserver); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroySceneObserverMSFT( + XrSceneObserverMSFT sceneObserver); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSceneMSFT( + XrSceneObserverMSFT sceneObserver, + const XrSceneCreateInfoMSFT* createInfo, + XrSceneMSFT* scene); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroySceneMSFT( + XrSceneMSFT scene); + +XRAPI_ATTR XrResult XRAPI_CALL xrComputeNewSceneMSFT( + XrSceneObserverMSFT sceneObserver, + const XrNewSceneComputeInfoMSFT* computeInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSceneComputeStateMSFT( + XrSceneObserverMSFT sceneObserver, + XrSceneComputeStateMSFT* state); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSceneComponentsMSFT( + XrSceneMSFT scene, + const XrSceneComponentsGetInfoMSFT* getInfo, + XrSceneComponentsMSFT* components); + +XRAPI_ATTR XrResult XRAPI_CALL xrLocateSceneComponentsMSFT( + XrSceneMSFT scene, + const XrSceneComponentsLocateInfoMSFT* locateInfo, + XrSceneComponentLocationsMSFT* locations); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSceneMeshBuffersMSFT( + XrSceneMSFT scene, + const XrSceneMeshBuffersGetInfoMSFT* getInfo, + XrSceneMeshBuffersMSFT* buffers); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_MSFT_scene_understanding_serialization 1 +#define XR_MSFT_scene_understanding_serialization_SPEC_VERSION 1 +#define XR_MSFT_SCENE_UNDERSTANDING_SERIALIZATION_EXTENSION_NAME "XR_MSFT_scene_understanding_serialization" +typedef struct XrSerializedSceneFragmentDataGetInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrUuidMSFT sceneFragmentId; +} XrSerializedSceneFragmentDataGetInfoMSFT; + +typedef struct XrDeserializeSceneFragmentMSFT { + uint32_t bufferSize; + const uint8_t* buffer; +} XrDeserializeSceneFragmentMSFT; + +typedef struct XrSceneDeserializeInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t fragmentCount; + const XrDeserializeSceneFragmentMSFT* fragments; +} XrSceneDeserializeInfoMSFT; + +typedef XrResult (XRAPI_PTR *PFN_xrDeserializeSceneMSFT)(XrSceneObserverMSFT sceneObserver, const XrSceneDeserializeInfoMSFT* deserializeInfo); +typedef XrResult (XRAPI_PTR *PFN_xrGetSerializedSceneFragmentDataMSFT)(XrSceneMSFT scene, const XrSerializedSceneFragmentDataGetInfoMSFT* getInfo, uint32_t countInput, uint32_t* readOutput, uint8_t* buffer); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrDeserializeSceneMSFT( + XrSceneObserverMSFT sceneObserver, + const XrSceneDeserializeInfoMSFT* deserializeInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetSerializedSceneFragmentDataMSFT( + XrSceneMSFT scene, + const XrSerializedSceneFragmentDataGetInfoMSFT* getInfo, + uint32_t countInput, + uint32_t* readOutput, + uint8_t* buffer); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_FB_display_refresh_rate 1 +#define XR_FB_display_refresh_rate_SPEC_VERSION 1 +#define XR_FB_DISPLAY_REFRESH_RATE_EXTENSION_NAME "XR_FB_display_refresh_rate" +typedef struct XrEventDataDisplayRefreshRateChangedFB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + float fromDisplayRefreshRate; + float toDisplayRefreshRate; +} XrEventDataDisplayRefreshRateChangedFB; + +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateDisplayRefreshRatesFB)(XrSession session, uint32_t displayRefreshRateCapacityInput, uint32_t* displayRefreshRateCountOutput, float* displayRefreshRates); +typedef XrResult (XRAPI_PTR *PFN_xrGetDisplayRefreshRateFB)(XrSession session, float* displayRefreshRate); +typedef XrResult (XRAPI_PTR *PFN_xrRequestDisplayRefreshRateFB)(XrSession session, float displayRefreshRate); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateDisplayRefreshRatesFB( + XrSession session, + uint32_t displayRefreshRateCapacityInput, + uint32_t* displayRefreshRateCountOutput, + float* displayRefreshRates); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetDisplayRefreshRateFB( + XrSession session, + float* displayRefreshRate); + +XRAPI_ATTR XrResult XRAPI_CALL xrRequestDisplayRefreshRateFB( + XrSession session, + float displayRefreshRate); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_HTC_vive_cosmos_controller_interaction 1 +#define XR_HTC_vive_cosmos_controller_interaction_SPEC_VERSION 1 +#define XR_HTC_VIVE_COSMOS_CONTROLLER_INTERACTION_EXTENSION_NAME "XR_HTC_vive_cosmos_controller_interaction" + + +#define XR_HTC_facial_expression 1 +XR_DEFINE_HANDLE(XrExpressionHTC) +#define XR_HTC_facial_expression_SPEC_VERSION 1 +#define XR_HTC_FACIAL_EXPRESSION_EXTENSION_NAME "XR_HTC_facial_expression" + +typedef enum XrEyeShapeHTC { + XR_EYE_SHAPE_NONE_HTC = -1, + XR_EYE_SHAPE_EYE_LEFT_BLINK_HTC = 0, + XR_EYE_SHAPE_EYE_LEFT_WIDE_HTC = 1, + XR_EYE_SHAPE_EYE_RIGHT_BLINK_HTC = 2, + XR_EYE_SHAPE_EYE_RIGHT_WIDE_HTC = 3, + XR_EYE_SHAPE_EYE_LEFT_SQUEEZE_HTC = 4, + XR_EYE_SHAPE_EYE_RIGHT_SQUEEZE_HTC = 5, + XR_EYE_SHAPE_MAX_ENUM_HTC = 0x7FFFFFFF +} XrEyeShapeHTC; + +typedef enum XrLipShapeHTC { + XR_LIP_SHAPE_NONE_HTC = -1, + XR_LIP_SHAPE_JAW_RIGHT_HTC = 0, + XR_LIP_SHAPE_JAW_LEFT_HTC = 1, + XR_LIP_SHAPE_JAW_FORWARD_HTC = 2, + XR_LIP_SHAPE_JAW_OPEN_HTC = 3, + XR_LIP_SHAPE_MOUTH_APE_SHAPE_HTC = 4, + XR_LIP_SHAPE_MOUTH_UPPER_RIGHT_HTC = 5, + XR_LIP_SHAPE_MOUTH_UPPER_LEFT_HTC = 6, + XR_LIP_SHAPE_MOUTH_LOWER_RIGHT_HTC = 7, + XR_LIP_SHAPE_MOUTH_LOWER_LEFT_HTC = 8, + XR_LIP_SHAPE_MOUTH_UPPER_OVERTURN_HTC = 9, + XR_LIP_SHAPE_MOUTH_LOWER_OVERTURN_HTC = 10, + XR_LIP_SHAPE_MOUTH_POUT_HTC = 11, + XR_LIP_SHAPE_MOUTH_SMILE_RIGHT_HTC = 12, + XR_LIP_SHAPE_MOUTH_SMILE_LEFT_HTC = 13, + XR_LIP_SHAPE_MOUTH_SAD_RIGHT_HTC = 14, + XR_LIP_SHAPE_MOUTH_SAD_LEFT_HTC = 15, + XR_LIP_SHAPE_CHEEK_PUFF_RIGHT_HTC = 16, + XR_LIP_SHAPE_CHEEK_PUFF_LEFT_HTC = 17, + XR_LIP_SHAPE_CHEEK_SUCK_HTC = 18, + XR_LIP_SHAPE_MOUTH_UPPER_UPRIGHT_HTC = 19, + XR_LIP_SHAPE_MOUTH_UPPER_UPLEFT_HTC = 20, + XR_LIP_SHAPE_MOUTH_LOWER_DOWNRIGHT_HTC = 21, + XR_LIP_SHAPE_MOUTH_LOWER_DOWNLEFT_HTC = 22, + XR_LIP_SHAPE_MOUTH_UPPER_INSIDE_HTC = 23, + XR_LIP_SHAPE_MOUTH_LOWER_INSIDE_HTC = 24, + XR_LIP_SHAPE_MOUTH_LOWER_OVERLAY_HTC = 25, + XR_LIP_SHAPE_TONGUE_LONGSTEP1_HTC = 26, + XR_LIP_SHAPE_TONGUE_LEFT_HTC = 27, + XR_LIP_SHAPE_TONGUE_RIGHT_HTC = 28, + XR_LIP_SHAPE_TONGUE_UP_HTC = 29, + XR_LIP_SHAPE_TONGUE_DOWN_HTC = 30, + XR_LIP_SHAPE_TONGUE_ROLL_HTC = 31, + XR_LIP_SHAPE_TONGUE_LONGSTEP2_HTC = 32, + XR_LIP_SHAPE_TONGUE_UPRIGHT_MORPH_HTC = 33, + XR_LIP_SHAPE_TONGUE_UPLEFT_MORPH_HTC = 34, + XR_LIP_SHAPE_TONGUE_DOWNRIGHT_MORPH_HTC = 35, + XR_LIP_SHAPE_TONGUE_DOWNLEFT_MORPH_HTC = 36, + XR_LIP_SHAPE_MAX_ENUM_HTC = 0x7FFFFFFF +} XrLipShapeHTC; + +typedef enum XrExpressionTypeHTC { + XR_EXPRESSION_TYPE_EYE_HTC = 1, + XR_EXPRESSION_TYPE_LIP_HTC = 2, + XR_EXPRESSION_TYPE_MAX_ENUM_HTC = 0x7FFFFFFF +} XrExpressionTypeHTC; +// XrSystemExpressionPropertiesHTC extends XrSystemProperties +typedef struct XrSystemExpressionPropertiesHTC { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBool32 supportEyeExpression; + XrBool32 supportLipExpression; + uint32_t maxBlendShapesCount; +} XrSystemExpressionPropertiesHTC; + +typedef struct XrExpressionDataHTC { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrTime sampleTime; + uint32_t blendShapesCapacityInput; + uint32_t blendShapesCountOutput; + float* blendShapeWeightings; +} XrExpressionDataHTC; + +typedef struct XrExpressionCreateInfoHTC { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrExpressionTypeHTC expressionType; +} XrExpressionCreateInfoHTC; + +typedef XrResult (XRAPI_PTR *PFN_xrCreateExpressionHTC)(XrInstance instance, const XrExpressionCreateInfoHTC* createInfo, XrExpressionHTC* expression); +typedef XrResult (XRAPI_PTR *PFN_xrDestroyExpressionHTC)(XrExpressionHTC expression); +typedef XrResult (XRAPI_PTR *PFN_xrGetExpressionDataHTC)(XrExpressionHTC expression, XrExpressionDataHTC* expressionData); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreateExpressionHTC( + XrInstance instance, + const XrExpressionCreateInfoHTC* createInfo, + XrExpressionHTC* expression); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroyExpressionHTC( + XrExpressionHTC expression); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetExpressionDataHTC( + XrExpressionHTC expression, + XrExpressionDataHTC* expressionData); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_FB_color_space 1 +#define XR_FB_color_space_SPEC_VERSION 1 +#define XR_FB_COLOR_SPACE_EXTENSION_NAME "XR_FB_color_space" + +typedef enum XrColorSpaceFB { + XR_COLOR_SPACE_UNMANAGED_FB = 0, + XR_COLOR_SPACE_REC2020_FB = 1, + XR_COLOR_SPACE_REC709_FB = 2, + XR_COLOR_SPACE_RIFT_CV1_FB = 3, + XR_COLOR_SPACE_RIFT_S_FB = 4, + XR_COLOR_SPACE_QUEST_FB = 5, + XR_COLOR_SPACE_P3_FB = 6, + XR_COLOR_SPACE_ADOBE_RGB_FB = 7, + XR_COLOR_SPACE_MAX_ENUM_FB = 0x7FFFFFFF +} XrColorSpaceFB; +typedef struct XrSystemColorSpacePropertiesFB { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrColorSpaceFB colorSpace; +} XrSystemColorSpacePropertiesFB; + +typedef XrResult (XRAPI_PTR *PFN_xrEnumerateColorSpacesFB)(XrSession session, uint32_t colorSpaceCapacityInput, uint32_t* colorSpaceCountOutput, XrColorSpaceFB* colorSpaces); +typedef XrResult (XRAPI_PTR *PFN_xrSetColorSpaceFB)(XrSession session, const XrColorSpaceFB colorspace); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateColorSpacesFB( + XrSession session, + uint32_t colorSpaceCapacityInput, + uint32_t* colorSpaceCountOutput, + XrColorSpaceFB* colorSpaces); + +XRAPI_ATTR XrResult XRAPI_CALL xrSetColorSpaceFB( + XrSession session, + const XrColorSpaceFB colorspace); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_FB_foveation 1 +XR_DEFINE_HANDLE(XrFoveationProfileFB) +#define XR_FB_foveation_SPEC_VERSION 1 +#define XR_FB_FOVEATION_EXTENSION_NAME "XR_FB_foveation" +typedef XrFlags64 XrSwapchainCreateFoveationFlagsFB; + +// Flag bits for XrSwapchainCreateFoveationFlagsFB +static const XrSwapchainCreateFoveationFlagsFB XR_SWAPCHAIN_CREATE_FOVEATION_SCALED_BIN_BIT_FB = 0x00000001; +static const XrSwapchainCreateFoveationFlagsFB XR_SWAPCHAIN_CREATE_FOVEATION_FRAGMENT_DENSITY_MAP_BIT_FB = 0x00000002; + +typedef XrFlags64 XrSwapchainStateFoveationFlagsFB; + +// Flag bits for XrSwapchainStateFoveationFlagsFB + +typedef struct XrFoveationProfileCreateInfoFB { + XrStructureType type; + void* XR_MAY_ALIAS next; +} XrFoveationProfileCreateInfoFB; + +// XrSwapchainCreateInfoFoveationFB extends XrSwapchainCreateInfo +typedef struct XrSwapchainCreateInfoFoveationFB { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrSwapchainCreateFoveationFlagsFB flags; +} XrSwapchainCreateInfoFoveationFB; + +typedef struct XrSwapchainStateFoveationFB { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrSwapchainStateFoveationFlagsFB flags; + XrFoveationProfileFB profile; +} XrSwapchainStateFoveationFB; + +typedef XrResult (XRAPI_PTR *PFN_xrCreateFoveationProfileFB)(XrSession session, const XrFoveationProfileCreateInfoFB* createInfo, XrFoveationProfileFB* profile); +typedef XrResult (XRAPI_PTR *PFN_xrDestroyFoveationProfileFB)(XrFoveationProfileFB profile); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreateFoveationProfileFB( + XrSession session, + const XrFoveationProfileCreateInfoFB* createInfo, + XrFoveationProfileFB* profile); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroyFoveationProfileFB( + XrFoveationProfileFB profile); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_FB_foveation_configuration 1 +#define XR_FB_foveation_configuration_SPEC_VERSION 1 +#define XR_FB_FOVEATION_CONFIGURATION_EXTENSION_NAME "XR_FB_foveation_configuration" + +typedef enum XrFoveationLevelFB { + XR_FOVEATION_LEVEL_NONE_FB = 0, + XR_FOVEATION_LEVEL_LOW_FB = 1, + XR_FOVEATION_LEVEL_MEDIUM_FB = 2, + XR_FOVEATION_LEVEL_HIGH_FB = 3, + XR_FOVEATION_LEVEL_MAX_ENUM_FB = 0x7FFFFFFF +} XrFoveationLevelFB; + +typedef enum XrFoveationDynamicFB { + XR_FOVEATION_DYNAMIC_DISABLED_FB = 0, + XR_FOVEATION_DYNAMIC_LEVEL_ENABLED_FB = 1, + XR_FOVEATION_DYNAMIC_MAX_ENUM_FB = 0x7FFFFFFF +} XrFoveationDynamicFB; +// XrFoveationLevelProfileCreateInfoFB extends XrFoveationProfileCreateInfoFB +typedef struct XrFoveationLevelProfileCreateInfoFB { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrFoveationLevelFB level; + float verticalOffset; + XrFoveationDynamicFB dynamic; +} XrFoveationLevelProfileCreateInfoFB; + + + +#define XR_VARJO_foveated_rendering 1 +#define XR_VARJO_foveated_rendering_SPEC_VERSION 2 +#define XR_VARJO_FOVEATED_RENDERING_EXTENSION_NAME "XR_VARJO_foveated_rendering" +// XrViewLocateFoveatedRenderingVARJO extends XrViewLocateInfo +typedef struct XrViewLocateFoveatedRenderingVARJO { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrBool32 foveatedRenderingActive; +} XrViewLocateFoveatedRenderingVARJO; + +// XrFoveatedViewConfigurationViewVARJO extends XrViewConfigurationView +typedef struct XrFoveatedViewConfigurationViewVARJO { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBool32 foveatedRenderingActive; +} XrFoveatedViewConfigurationViewVARJO; + +// XrSystemFoveatedRenderingPropertiesVARJO extends XrSystemProperties +typedef struct XrSystemFoveatedRenderingPropertiesVARJO { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrBool32 supportsFoveatedRendering; +} XrSystemFoveatedRenderingPropertiesVARJO; + + + +#define XR_VARJO_composition_layer_depth_test 1 +#define XR_VARJO_composition_layer_depth_test_SPEC_VERSION 2 +#define XR_VARJO_COMPOSITION_LAYER_DEPTH_TEST_EXTENSION_NAME "XR_VARJO_composition_layer_depth_test" +// XrCompositionLayerDepthTestVARJO extends XrCompositionLayerProjection +typedef struct XrCompositionLayerDepthTestVARJO { + XrStructureType type; + const void* XR_MAY_ALIAS next; + float depthTestRangeNearZ; + float depthTestRangeFarZ; +} XrCompositionLayerDepthTestVARJO; + + + +#define XR_VARJO_environment_depth_estimation 1 +#define XR_VARJO_environment_depth_estimation_SPEC_VERSION 1 +#define XR_VARJO_ENVIRONMENT_DEPTH_ESTIMATION_EXTENSION_NAME "XR_VARJO_environment_depth_estimation" +typedef XrResult (XRAPI_PTR *PFN_xrSetEnvironmentDepthEstimationVARJO)(XrSession session, XrBool32 enabled); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrSetEnvironmentDepthEstimationVARJO( + XrSession session, + XrBool32 enabled); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_MSFT_spatial_anchor_persistence 1 +XR_DEFINE_HANDLE(XrSpatialAnchorStoreConnectionMSFT) +#define XR_MAX_SPATIAL_ANCHOR_NAME_SIZE_MSFT 256 +#define XR_MSFT_spatial_anchor_persistence_SPEC_VERSION 2 +#define XR_MSFT_SPATIAL_ANCHOR_PERSISTENCE_EXTENSION_NAME "XR_MSFT_spatial_anchor_persistence" +typedef struct XrSpatialAnchorPersistenceNameMSFT { + char name[XR_MAX_SPATIAL_ANCHOR_NAME_SIZE_MSFT]; +} XrSpatialAnchorPersistenceNameMSFT; + +typedef struct XrSpatialAnchorPersistenceInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSpatialAnchorPersistenceNameMSFT spatialAnchorPersistenceName; + XrSpatialAnchorMSFT spatialAnchor; +} XrSpatialAnchorPersistenceInfoMSFT; + +typedef struct XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore; + XrSpatialAnchorPersistenceNameMSFT spatialAnchorPersistenceName; +} XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT; + +typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorStoreConnectionMSFT)(XrSession session, XrSpatialAnchorStoreConnectionMSFT* spatialAnchorStore); +typedef XrResult (XRAPI_PTR *PFN_xrDestroySpatialAnchorStoreConnectionMSFT)(XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore); +typedef XrResult (XRAPI_PTR *PFN_xrPersistSpatialAnchorMSFT)(XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, const XrSpatialAnchorPersistenceInfoMSFT* spatialAnchorPersistenceInfo); +typedef XrResult (XRAPI_PTR *PFN_xrEnumeratePersistedSpatialAnchorNamesMSFT)(XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, uint32_t spatialAnchorNamesCapacityInput, uint32_t* spatialAnchorNamesCountOutput, XrSpatialAnchorPersistenceNameMSFT* persistedAnchorNames); +typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorFromPersistedNameMSFT)(XrSession session, const XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT* spatialAnchorCreateInfo, XrSpatialAnchorMSFT* spatialAnchor); +typedef XrResult (XRAPI_PTR *PFN_xrUnpersistSpatialAnchorMSFT)(XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, const XrSpatialAnchorPersistenceNameMSFT* spatialAnchorPersistenceName); +typedef XrResult (XRAPI_PTR *PFN_xrClearSpatialAnchorStoreMSFT)(XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorStoreConnectionMSFT( + XrSession session, + XrSpatialAnchorStoreConnectionMSFT* spatialAnchorStore); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroySpatialAnchorStoreConnectionMSFT( + XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore); + +XRAPI_ATTR XrResult XRAPI_CALL xrPersistSpatialAnchorMSFT( + XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, + const XrSpatialAnchorPersistenceInfoMSFT* spatialAnchorPersistenceInfo); + +XRAPI_ATTR XrResult XRAPI_CALL xrEnumeratePersistedSpatialAnchorNamesMSFT( + XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, + uint32_t spatialAnchorNamesCapacityInput, + uint32_t* spatialAnchorNamesCountOutput, + XrSpatialAnchorPersistenceNameMSFT* persistedAnchorNames); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorFromPersistedNameMSFT( + XrSession session, + const XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT* spatialAnchorCreateInfo, + XrSpatialAnchorMSFT* spatialAnchor); + +XRAPI_ATTR XrResult XRAPI_CALL xrUnpersistSpatialAnchorMSFT( + XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore, + const XrSpatialAnchorPersistenceNameMSFT* spatialAnchorPersistenceName); + +XRAPI_ATTR XrResult XRAPI_CALL xrClearSpatialAnchorStoreMSFT( + XrSpatialAnchorStoreConnectionMSFT spatialAnchorStore); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr_platform.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr_platform.h new file mode 100644 index 0000000..8f8427f --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr_platform.h @@ -0,0 +1,675 @@ +#ifndef OPENXR_PLATFORM_H_ +#define OPENXR_PLATFORM_H_ 1 + +/* +** Copyright (c) 2017-2021, The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 OR MIT +*/ + +/* +** This header is generated from the Khronos OpenXR XML API Registry. +** +*/ + +#include "openxr.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef XR_USE_PLATFORM_ANDROID + +#define XR_KHR_android_thread_settings 1 +#define XR_KHR_android_thread_settings_SPEC_VERSION 5 +#define XR_KHR_ANDROID_THREAD_SETTINGS_EXTENSION_NAME "XR_KHR_android_thread_settings" + +typedef enum XrAndroidThreadTypeKHR { + XR_ANDROID_THREAD_TYPE_APPLICATION_MAIN_KHR = 1, + XR_ANDROID_THREAD_TYPE_APPLICATION_WORKER_KHR = 2, + XR_ANDROID_THREAD_TYPE_RENDERER_MAIN_KHR = 3, + XR_ANDROID_THREAD_TYPE_RENDERER_WORKER_KHR = 4, + XR_ANDROID_THREAD_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF +} XrAndroidThreadTypeKHR; +typedef XrResult (XRAPI_PTR *PFN_xrSetAndroidApplicationThreadKHR)(XrSession session, XrAndroidThreadTypeKHR threadType, uint32_t threadId); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrSetAndroidApplicationThreadKHR( + XrSession session, + XrAndroidThreadTypeKHR threadType, + uint32_t threadId); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_PLATFORM_ANDROID */ + +#ifdef XR_USE_PLATFORM_ANDROID + +#define XR_KHR_android_surface_swapchain 1 +#define XR_KHR_android_surface_swapchain_SPEC_VERSION 4 +#define XR_KHR_ANDROID_SURFACE_SWAPCHAIN_EXTENSION_NAME "XR_KHR_android_surface_swapchain" +typedef XrResult (XRAPI_PTR *PFN_xrCreateSwapchainAndroidSurfaceKHR)(XrSession session, const XrSwapchainCreateInfo* info, XrSwapchain* swapchain, jobject* surface); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSwapchainAndroidSurfaceKHR( + XrSession session, + const XrSwapchainCreateInfo* info, + XrSwapchain* swapchain, + jobject* surface); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_PLATFORM_ANDROID */ + +#ifdef XR_USE_PLATFORM_ANDROID + +#define XR_KHR_android_create_instance 1 +#define XR_KHR_android_create_instance_SPEC_VERSION 3 +#define XR_KHR_ANDROID_CREATE_INSTANCE_EXTENSION_NAME "XR_KHR_android_create_instance" +// XrInstanceCreateInfoAndroidKHR extends XrInstanceCreateInfo +typedef struct XrInstanceCreateInfoAndroidKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + void* XR_MAY_ALIAS applicationVM; + void* XR_MAY_ALIAS applicationActivity; +} XrInstanceCreateInfoAndroidKHR; + +#endif /* XR_USE_PLATFORM_ANDROID */ + +#ifdef XR_USE_GRAPHICS_API_VULKAN + +#define XR_KHR_vulkan_swapchain_format_list 1 +#define XR_KHR_vulkan_swapchain_format_list_SPEC_VERSION 4 +#define XR_KHR_VULKAN_SWAPCHAIN_FORMAT_LIST_EXTENSION_NAME "XR_KHR_vulkan_swapchain_format_list" +typedef struct XrVulkanSwapchainFormatListCreateInfoKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t viewFormatCount; + const VkFormat* viewFormats; +} XrVulkanSwapchainFormatListCreateInfoKHR; + +#endif /* XR_USE_GRAPHICS_API_VULKAN */ + +#ifdef XR_USE_GRAPHICS_API_OPENGL + +#define XR_KHR_opengl_enable 1 +#define XR_KHR_opengl_enable_SPEC_VERSION 9 +#define XR_KHR_OPENGL_ENABLE_EXTENSION_NAME "XR_KHR_opengl_enable" +#ifdef XR_USE_PLATFORM_WIN32 +// XrGraphicsBindingOpenGLWin32KHR extends XrSessionCreateInfo +typedef struct XrGraphicsBindingOpenGLWin32KHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + HDC hDC; + HGLRC hGLRC; +} XrGraphicsBindingOpenGLWin32KHR; +#endif // XR_USE_PLATFORM_WIN32 + +#ifdef XR_USE_PLATFORM_XLIB +// XrGraphicsBindingOpenGLXlibKHR extends XrSessionCreateInfo +typedef struct XrGraphicsBindingOpenGLXlibKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + Display* xDisplay; + uint32_t visualid; + GLXFBConfig glxFBConfig; + GLXDrawable glxDrawable; + GLXContext glxContext; +} XrGraphicsBindingOpenGLXlibKHR; +#endif // XR_USE_PLATFORM_XLIB + +#ifdef XR_USE_PLATFORM_XCB +// XrGraphicsBindingOpenGLXcbKHR extends XrSessionCreateInfo +typedef struct XrGraphicsBindingOpenGLXcbKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + xcb_connection_t* connection; + uint32_t screenNumber; + xcb_glx_fbconfig_t fbconfigid; + xcb_visualid_t visualid; + xcb_glx_drawable_t glxDrawable; + xcb_glx_context_t glxContext; +} XrGraphicsBindingOpenGLXcbKHR; +#endif // XR_USE_PLATFORM_XCB + +#ifdef XR_USE_PLATFORM_WAYLAND +// XrGraphicsBindingOpenGLWaylandKHR extends XrSessionCreateInfo +typedef struct XrGraphicsBindingOpenGLWaylandKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + struct wl_display* display; +} XrGraphicsBindingOpenGLWaylandKHR; +#endif // XR_USE_PLATFORM_WAYLAND + +typedef struct XrSwapchainImageOpenGLKHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t image; +} XrSwapchainImageOpenGLKHR; + +typedef struct XrGraphicsRequirementsOpenGLKHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrVersion minApiVersionSupported; + XrVersion maxApiVersionSupported; +} XrGraphicsRequirementsOpenGLKHR; + +typedef XrResult (XRAPI_PTR *PFN_xrGetOpenGLGraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsOpenGLKHR* graphicsRequirements); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetOpenGLGraphicsRequirementsKHR( + XrInstance instance, + XrSystemId systemId, + XrGraphicsRequirementsOpenGLKHR* graphicsRequirements); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_GRAPHICS_API_OPENGL */ + +#ifdef XR_USE_GRAPHICS_API_OPENGL_ES + +#define XR_KHR_opengl_es_enable 1 +#define XR_KHR_opengl_es_enable_SPEC_VERSION 7 +#define XR_KHR_OPENGL_ES_ENABLE_EXTENSION_NAME "XR_KHR_opengl_es_enable" +#ifdef XR_USE_PLATFORM_ANDROID +// XrGraphicsBindingOpenGLESAndroidKHR extends XrSessionCreateInfo +typedef struct XrGraphicsBindingOpenGLESAndroidKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + EGLDisplay display; + EGLConfig config; + EGLContext context; +} XrGraphicsBindingOpenGLESAndroidKHR; +#endif // XR_USE_PLATFORM_ANDROID + +typedef struct XrSwapchainImageOpenGLESKHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t image; +} XrSwapchainImageOpenGLESKHR; + +typedef struct XrGraphicsRequirementsOpenGLESKHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrVersion minApiVersionSupported; + XrVersion maxApiVersionSupported; +} XrGraphicsRequirementsOpenGLESKHR; + +typedef XrResult (XRAPI_PTR *PFN_xrGetOpenGLESGraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsOpenGLESKHR* graphicsRequirements); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetOpenGLESGraphicsRequirementsKHR( + XrInstance instance, + XrSystemId systemId, + XrGraphicsRequirementsOpenGLESKHR* graphicsRequirements); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_GRAPHICS_API_OPENGL_ES */ + +#ifdef XR_USE_GRAPHICS_API_VULKAN + +#define XR_KHR_vulkan_enable 1 +#define XR_KHR_vulkan_enable_SPEC_VERSION 8 +#define XR_KHR_VULKAN_ENABLE_EXTENSION_NAME "XR_KHR_vulkan_enable" +// XrGraphicsBindingVulkanKHR extends XrSessionCreateInfo +typedef struct XrGraphicsBindingVulkanKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + VkInstance instance; + VkPhysicalDevice physicalDevice; + VkDevice device; + uint32_t queueFamilyIndex; + uint32_t queueIndex; +} XrGraphicsBindingVulkanKHR; + +typedef struct XrSwapchainImageVulkanKHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + VkImage image; +} XrSwapchainImageVulkanKHR; + +typedef struct XrGraphicsRequirementsVulkanKHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrVersion minApiVersionSupported; + XrVersion maxApiVersionSupported; +} XrGraphicsRequirementsVulkanKHR; + +typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanInstanceExtensionsKHR)(XrInstance instance, XrSystemId systemId, uint32_t bufferCapacityInput, uint32_t* bufferCountOutput, char* buffer); +typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanDeviceExtensionsKHR)(XrInstance instance, XrSystemId systemId, uint32_t bufferCapacityInput, uint32_t* bufferCountOutput, char* buffer); +typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsDeviceKHR)(XrInstance instance, XrSystemId systemId, VkInstance vkInstance, VkPhysicalDevice* vkPhysicalDevice); +typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsVulkanKHR* graphicsRequirements); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanInstanceExtensionsKHR( + XrInstance instance, + XrSystemId systemId, + uint32_t bufferCapacityInput, + uint32_t* bufferCountOutput, + char* buffer); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanDeviceExtensionsKHR( + XrInstance instance, + XrSystemId systemId, + uint32_t bufferCapacityInput, + uint32_t* bufferCountOutput, + char* buffer); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsDeviceKHR( + XrInstance instance, + XrSystemId systemId, + VkInstance vkInstance, + VkPhysicalDevice* vkPhysicalDevice); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsRequirementsKHR( + XrInstance instance, + XrSystemId systemId, + XrGraphicsRequirementsVulkanKHR* graphicsRequirements); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_GRAPHICS_API_VULKAN */ + +#ifdef XR_USE_GRAPHICS_API_D3D11 + +#define XR_KHR_D3D11_enable 1 +#define XR_KHR_D3D11_enable_SPEC_VERSION 5 +#define XR_KHR_D3D11_ENABLE_EXTENSION_NAME "XR_KHR_D3D11_enable" +// XrGraphicsBindingD3D11KHR extends XrSessionCreateInfo +typedef struct XrGraphicsBindingD3D11KHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + ID3D11Device* device; +} XrGraphicsBindingD3D11KHR; + +typedef struct XrSwapchainImageD3D11KHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + ID3D11Texture2D* texture; +} XrSwapchainImageD3D11KHR; + +typedef struct XrGraphicsRequirementsD3D11KHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + LUID adapterLuid; + D3D_FEATURE_LEVEL minFeatureLevel; +} XrGraphicsRequirementsD3D11KHR; + +typedef XrResult (XRAPI_PTR *PFN_xrGetD3D11GraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsD3D11KHR* graphicsRequirements); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetD3D11GraphicsRequirementsKHR( + XrInstance instance, + XrSystemId systemId, + XrGraphicsRequirementsD3D11KHR* graphicsRequirements); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_GRAPHICS_API_D3D11 */ + +#ifdef XR_USE_GRAPHICS_API_D3D12 + +#define XR_KHR_D3D12_enable 1 +#define XR_KHR_D3D12_enable_SPEC_VERSION 7 +#define XR_KHR_D3D12_ENABLE_EXTENSION_NAME "XR_KHR_D3D12_enable" +// XrGraphicsBindingD3D12KHR extends XrSessionCreateInfo +typedef struct XrGraphicsBindingD3D12KHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + ID3D12Device* device; + ID3D12CommandQueue* queue; +} XrGraphicsBindingD3D12KHR; + +typedef struct XrSwapchainImageD3D12KHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + ID3D12Resource* texture; +} XrSwapchainImageD3D12KHR; + +typedef struct XrGraphicsRequirementsD3D12KHR { + XrStructureType type; + void* XR_MAY_ALIAS next; + LUID adapterLuid; + D3D_FEATURE_LEVEL minFeatureLevel; +} XrGraphicsRequirementsD3D12KHR; + +typedef XrResult (XRAPI_PTR *PFN_xrGetD3D12GraphicsRequirementsKHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsD3D12KHR* graphicsRequirements); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetD3D12GraphicsRequirementsKHR( + XrInstance instance, + XrSystemId systemId, + XrGraphicsRequirementsD3D12KHR* graphicsRequirements); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_GRAPHICS_API_D3D12 */ + +#ifdef XR_USE_PLATFORM_WIN32 + +#define XR_KHR_win32_convert_performance_counter_time 1 +#define XR_KHR_win32_convert_performance_counter_time_SPEC_VERSION 1 +#define XR_KHR_WIN32_CONVERT_PERFORMANCE_COUNTER_TIME_EXTENSION_NAME "XR_KHR_win32_convert_performance_counter_time" +typedef XrResult (XRAPI_PTR *PFN_xrConvertWin32PerformanceCounterToTimeKHR)(XrInstance instance, const LARGE_INTEGER* performanceCounter, XrTime* time); +typedef XrResult (XRAPI_PTR *PFN_xrConvertTimeToWin32PerformanceCounterKHR)(XrInstance instance, XrTime time, LARGE_INTEGER* performanceCounter); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrConvertWin32PerformanceCounterToTimeKHR( + XrInstance instance, + const LARGE_INTEGER* performanceCounter, + XrTime* time); + +XRAPI_ATTR XrResult XRAPI_CALL xrConvertTimeToWin32PerformanceCounterKHR( + XrInstance instance, + XrTime time, + LARGE_INTEGER* performanceCounter); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_PLATFORM_WIN32 */ + +#ifdef XR_USE_TIMESPEC + +#define XR_KHR_convert_timespec_time 1 +#define XR_KHR_convert_timespec_time_SPEC_VERSION 1 +#define XR_KHR_CONVERT_TIMESPEC_TIME_EXTENSION_NAME "XR_KHR_convert_timespec_time" +typedef XrResult (XRAPI_PTR *PFN_xrConvertTimespecTimeToTimeKHR)(XrInstance instance, const struct timespec* timespecTime, XrTime* time); +typedef XrResult (XRAPI_PTR *PFN_xrConvertTimeToTimespecTimeKHR)(XrInstance instance, XrTime time, struct timespec* timespecTime); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrConvertTimespecTimeToTimeKHR( + XrInstance instance, + const struct timespec* timespecTime, + XrTime* time); + +XRAPI_ATTR XrResult XRAPI_CALL xrConvertTimeToTimespecTimeKHR( + XrInstance instance, + XrTime time, + struct timespec* timespecTime); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_TIMESPEC */ + +#ifdef XR_USE_PLATFORM_ANDROID + +#define XR_KHR_loader_init_android 1 +#define XR_KHR_loader_init_android_SPEC_VERSION 1 +#define XR_KHR_LOADER_INIT_ANDROID_EXTENSION_NAME "XR_KHR_loader_init_android" +typedef struct XrLoaderInitInfoAndroidKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + void* XR_MAY_ALIAS applicationVM; + void* XR_MAY_ALIAS applicationContext; +} XrLoaderInitInfoAndroidKHR; + +#endif /* XR_USE_PLATFORM_ANDROID */ + +#ifdef XR_USE_GRAPHICS_API_VULKAN + +#define XR_KHR_vulkan_enable2 1 +#define XR_KHR_vulkan_enable2_SPEC_VERSION 2 +#define XR_KHR_VULKAN_ENABLE2_EXTENSION_NAME "XR_KHR_vulkan_enable2" +typedef XrFlags64 XrVulkanInstanceCreateFlagsKHR; + +// Flag bits for XrVulkanInstanceCreateFlagsKHR + +typedef XrFlags64 XrVulkanDeviceCreateFlagsKHR; + +// Flag bits for XrVulkanDeviceCreateFlagsKHR + +typedef struct XrVulkanInstanceCreateInfoKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSystemId systemId; + XrVulkanInstanceCreateFlagsKHR createFlags; + PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr; + const VkInstanceCreateInfo* vulkanCreateInfo; + const VkAllocationCallbacks* vulkanAllocator; +} XrVulkanInstanceCreateInfoKHR; + +typedef struct XrVulkanDeviceCreateInfoKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSystemId systemId; + XrVulkanDeviceCreateFlagsKHR createFlags; + PFN_vkGetInstanceProcAddr pfnGetInstanceProcAddr; + VkPhysicalDevice vulkanPhysicalDevice; + const VkDeviceCreateInfo* vulkanCreateInfo; + const VkAllocationCallbacks* vulkanAllocator; +} XrVulkanDeviceCreateInfoKHR; + +typedef XrGraphicsBindingVulkanKHR XrGraphicsBindingVulkan2KHR; + +typedef struct XrVulkanGraphicsDeviceGetInfoKHR { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrSystemId systemId; + VkInstance vulkanInstance; +} XrVulkanGraphicsDeviceGetInfoKHR; + +typedef XrSwapchainImageVulkanKHR XrSwapchainImageVulkan2KHR; + +typedef XrGraphicsRequirementsVulkanKHR XrGraphicsRequirementsVulkan2KHR; + +typedef XrResult (XRAPI_PTR *PFN_xrCreateVulkanInstanceKHR)(XrInstance instance, const XrVulkanInstanceCreateInfoKHR*createInfo, VkInstance* vulkanInstance, VkResult* vulkanResult); +typedef XrResult (XRAPI_PTR *PFN_xrCreateVulkanDeviceKHR)(XrInstance instance, const XrVulkanDeviceCreateInfoKHR* createInfo, VkDevice* vulkanDevice, VkResult* vulkanResult); +typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsDevice2KHR)(XrInstance instance, const XrVulkanGraphicsDeviceGetInfoKHR* getInfo, VkPhysicalDevice* vulkanPhysicalDevice); +typedef XrResult (XRAPI_PTR *PFN_xrGetVulkanGraphicsRequirements2KHR)(XrInstance instance, XrSystemId systemId, XrGraphicsRequirementsVulkanKHR* graphicsRequirements); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreateVulkanInstanceKHR( + XrInstance instance, + const XrVulkanInstanceCreateInfoKHR* createInfo, + VkInstance* vulkanInstance, + VkResult* vulkanResult); + +XRAPI_ATTR XrResult XRAPI_CALL xrCreateVulkanDeviceKHR( + XrInstance instance, + const XrVulkanDeviceCreateInfoKHR* createInfo, + VkDevice* vulkanDevice, + VkResult* vulkanResult); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsDevice2KHR( + XrInstance instance, + const XrVulkanGraphicsDeviceGetInfoKHR* getInfo, + VkPhysicalDevice* vulkanPhysicalDevice); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetVulkanGraphicsRequirements2KHR( + XrInstance instance, + XrSystemId systemId, + XrGraphicsRequirementsVulkanKHR* graphicsRequirements); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_GRAPHICS_API_VULKAN */ + +#ifdef XR_USE_PLATFORM_EGL + +#define XR_MNDX_egl_enable 1 +#define XR_MNDX_egl_enable_SPEC_VERSION 1 +#define XR_MNDX_EGL_ENABLE_EXTENSION_NAME "XR_MNDX_egl_enable" +// XrGraphicsBindingEGLMNDX extends XrSessionCreateInfo +typedef struct XrGraphicsBindingEGLMNDX { + XrStructureType type; + const void* XR_MAY_ALIAS next; + PFNEGLGETPROCADDRESSPROC getProcAddress; + EGLDisplay display; + EGLConfig config; + EGLContext context; +} XrGraphicsBindingEGLMNDX; + +#endif /* XR_USE_PLATFORM_EGL */ + +#ifdef XR_USE_PLATFORM_WIN32 + +#define XR_MSFT_perception_anchor_interop 1 +#define XR_MSFT_perception_anchor_interop_SPEC_VERSION 1 +#define XR_MSFT_PERCEPTION_ANCHOR_INTEROP_EXTENSION_NAME "XR_MSFT_perception_anchor_interop" +typedef XrResult (XRAPI_PTR *PFN_xrCreateSpatialAnchorFromPerceptionAnchorMSFT)(XrSession session, IUnknown* perceptionAnchor, XrSpatialAnchorMSFT* anchor); +typedef XrResult (XRAPI_PTR *PFN_xrTryGetPerceptionAnchorFromSpatialAnchorMSFT)(XrSession session, XrSpatialAnchorMSFT anchor, IUnknown** perceptionAnchor); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreateSpatialAnchorFromPerceptionAnchorMSFT( + XrSession session, + IUnknown* perceptionAnchor, + XrSpatialAnchorMSFT* anchor); + +XRAPI_ATTR XrResult XRAPI_CALL xrTryGetPerceptionAnchorFromSpatialAnchorMSFT( + XrSession session, + XrSpatialAnchorMSFT anchor, + IUnknown** perceptionAnchor); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_PLATFORM_WIN32 */ + +#ifdef XR_USE_PLATFORM_WIN32 + +#define XR_MSFT_holographic_window_attachment 1 +#define XR_MSFT_holographic_window_attachment_SPEC_VERSION 1 +#define XR_MSFT_HOLOGRAPHIC_WINDOW_ATTACHMENT_EXTENSION_NAME "XR_MSFT_holographic_window_attachment" +#ifdef XR_USE_PLATFORM_WIN32 +// XrHolographicWindowAttachmentMSFT extends XrSessionCreateInfo +typedef struct XrHolographicWindowAttachmentMSFT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + IUnknown* holographicSpace; + IUnknown* coreWindow; +} XrHolographicWindowAttachmentMSFT; +#endif // XR_USE_PLATFORM_WIN32 + +#endif /* XR_USE_PLATFORM_WIN32 */ + +#ifdef XR_USE_PLATFORM_ANDROID + +#define XR_FB_android_surface_swapchain_create 1 +#define XR_FB_android_surface_swapchain_create_SPEC_VERSION 1 +#define XR_FB_ANDROID_SURFACE_SWAPCHAIN_CREATE_EXTENSION_NAME "XR_FB_android_surface_swapchain_create" +typedef XrFlags64 XrAndroidSurfaceSwapchainFlagsFB; + +// Flag bits for XrAndroidSurfaceSwapchainFlagsFB +static const XrAndroidSurfaceSwapchainFlagsFB XR_ANDROID_SURFACE_SWAPCHAIN_SYNCHRONOUS_BIT_FB = 0x00000001; +static const XrAndroidSurfaceSwapchainFlagsFB XR_ANDROID_SURFACE_SWAPCHAIN_USE_TIMESTAMPS_BIT_FB = 0x00000002; + +#ifdef XR_USE_PLATFORM_ANDROID +// XrAndroidSurfaceSwapchainCreateInfoFB extends XrSwapchainCreateInfo +typedef struct XrAndroidSurfaceSwapchainCreateInfoFB { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrAndroidSurfaceSwapchainFlagsFB createFlags; +} XrAndroidSurfaceSwapchainCreateInfoFB; +#endif // XR_USE_PLATFORM_ANDROID + +#endif /* XR_USE_PLATFORM_ANDROID */ + +#ifdef XR_USE_PLATFORM_WIN32 + +#define XR_OCULUS_audio_device_guid 1 +#define XR_OCULUS_audio_device_guid_SPEC_VERSION 1 +#define XR_OCULUS_AUDIO_DEVICE_GUID_EXTENSION_NAME "XR_OCULUS_audio_device_guid" +#define XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS 128 +typedef XrResult (XRAPI_PTR *PFN_xrGetAudioOutputDeviceGuidOculus)(XrInstance instance, wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]); +typedef XrResult (XRAPI_PTR *PFN_xrGetAudioInputDeviceGuidOculus)(XrInstance instance, wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrGetAudioOutputDeviceGuidOculus( + XrInstance instance, + wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]); + +XRAPI_ATTR XrResult XRAPI_CALL xrGetAudioInputDeviceGuidOculus( + XrInstance instance, + wchar_t buffer[XR_MAX_AUDIO_DEVICE_STR_SIZE_OCULUS]); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ +#endif /* XR_USE_PLATFORM_WIN32 */ + +#ifdef XR_USE_GRAPHICS_API_VULKAN + +#define XR_FB_foveation_vulkan 1 +#define XR_FB_foveation_vulkan_SPEC_VERSION 1 +#define XR_FB_FOVEATION_VULKAN_EXTENSION_NAME "XR_FB_foveation_vulkan" +// XrSwapchainImageFoveationVulkanFB extends XrSwapchainImageVulkanKHR +typedef struct XrSwapchainImageFoveationVulkanFB { + XrStructureType type; + void* XR_MAY_ALIAS next; + VkImage image; + uint32_t width; + uint32_t height; +} XrSwapchainImageFoveationVulkanFB; + +#endif /* XR_USE_GRAPHICS_API_VULKAN */ + +#ifdef XR_USE_PLATFORM_ANDROID + +#define XR_FB_swapchain_update_state_android_surface 1 +#define XR_FB_swapchain_update_state_android_surface_SPEC_VERSION 1 +#define XR_FB_SWAPCHAIN_UPDATE_STATE_ANDROID_SURFACE_EXTENSION_NAME "XR_FB_swapchain_update_state_android_surface" +#ifdef XR_USE_PLATFORM_ANDROID +typedef struct XrSwapchainStateAndroidSurfaceDimensionsFB { + XrStructureType type; + void* XR_MAY_ALIAS next; + uint32_t width; + uint32_t height; +} XrSwapchainStateAndroidSurfaceDimensionsFB; +#endif // XR_USE_PLATFORM_ANDROID + +#endif /* XR_USE_PLATFORM_ANDROID */ + +#ifdef XR_USE_GRAPHICS_API_OPENGL_ES + +#define XR_FB_swapchain_update_state_opengl_es 1 +#define XR_FB_swapchain_update_state_opengl_es_SPEC_VERSION 1 +#define XR_FB_SWAPCHAIN_UPDATE_STATE_OPENGL_ES_EXTENSION_NAME "XR_FB_swapchain_update_state_opengl_es" +#ifdef XR_USE_GRAPHICS_API_OPENGL_ES +typedef struct XrSwapchainStateSamplerOpenGLESFB { + XrStructureType type; + void* XR_MAY_ALIAS next; + EGLenum minFilter; + EGLenum magFilter; + EGLenum wrapModeS; + EGLenum wrapModeT; + EGLenum swizzleRed; + EGLenum swizzleGreen; + EGLenum swizzleBlue; + EGLenum swizzleAlpha; + float maxAnisotropy; + XrColor4f borderColor; +} XrSwapchainStateSamplerOpenGLESFB; +#endif // XR_USE_GRAPHICS_API_OPENGL_ES + +#endif /* XR_USE_GRAPHICS_API_OPENGL_ES */ + +#ifdef XR_USE_GRAPHICS_API_VULKAN + +#define XR_FB_swapchain_update_state_vulkan 1 +#define XR_FB_swapchain_update_state_vulkan_SPEC_VERSION 1 +#define XR_FB_SWAPCHAIN_UPDATE_STATE_VULKAN_EXTENSION_NAME "XR_FB_swapchain_update_state_vulkan" +#ifdef XR_USE_GRAPHICS_API_VULKAN +typedef struct XrSwapchainStateSamplerVulkanFB { + XrStructureType type; + void* XR_MAY_ALIAS next; + VkFilter minFilter; + VkFilter magFilter; + VkSamplerMipmapMode mipmapMode; + VkSamplerAddressMode wrapModeS; + VkSamplerAddressMode wrapModeT; + VkComponentSwizzle swizzleRed; + VkComponentSwizzle swizzleGreen; + VkComponentSwizzle swizzleBlue; + VkComponentSwizzle swizzleAlpha; + float maxAnisotropy; + XrColor4f borderColor; +} XrSwapchainStateSamplerVulkanFB; +#endif // XR_USE_GRAPHICS_API_VULKAN + +#endif /* XR_USE_GRAPHICS_API_VULKAN */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr_platform_defines.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr_platform_defines.h new file mode 100644 index 0000000..a7ffcb4 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr_platform_defines.h @@ -0,0 +1,110 @@ +/* +** Copyright (c) 2017-2021, The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 OR MIT +*/ + +#ifndef OPENXR_PLATFORM_DEFINES_H_ +#define OPENXR_PLATFORM_DEFINES_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Platform-specific calling convention macros. + * + * Platforms should define these so that OpenXR clients call OpenXR functions + * with the same calling conventions that the OpenXR implementation expects. + * + * XRAPI_ATTR - Placed before the return type in function declarations. + * Useful for C++11 and GCC/Clang-style function attribute syntax. + * XRAPI_CALL - Placed after the return type in function declarations. + * Useful for MSVC-style calling convention syntax. + * XRAPI_PTR - Placed between the '(' and '*' in function pointer types. + * + * Function declaration: XRAPI_ATTR void XRAPI_CALL xrFunction(void); + * Function pointer type: typedef void (XRAPI_PTR *PFN_xrFunction)(void); + */ +#if defined(_WIN32) +#define XRAPI_ATTR +// On Windows, functions use the stdcall convention +#define XRAPI_CALL __stdcall +#define XRAPI_PTR XRAPI_CALL +#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7 +#error "API not supported for the 'armeabi' NDK ABI" +#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE) +// On Android 32-bit ARM targets, functions use the "hardfloat" +// calling convention, i.e. float parameters are passed in registers. This +// is true even if the rest of the application passes floats on the stack, +// as it does by default when compiling for the armeabi-v7a NDK ABI. +#define XRAPI_ATTR __attribute__((pcs("aapcs-vfp"))) +#define XRAPI_CALL +#define XRAPI_PTR XRAPI_ATTR +#else +// On other platforms, use the default calling convention +#define XRAPI_ATTR +#define XRAPI_CALL +#define XRAPI_PTR +#endif + +#include + +#if !defined(XR_NO_STDINT_H) +#if defined(_MSC_VER) && (_MSC_VER < 1600) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +#include +#endif +#endif // !defined( XR_NO_STDINT_H ) + +// XR_PTR_SIZE (in bytes) +#if (defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__)) +#define XR_PTR_SIZE 8 +#else +#define XR_PTR_SIZE 4 +#endif + +// Needed so we can use clang __has_feature portably. +#if !defined(XR_COMPILER_HAS_FEATURE) +#if defined(__clang__) +#define XR_COMPILER_HAS_FEATURE(x) __has_feature(x) +#else +#define XR_COMPILER_HAS_FEATURE(x) 0 +#endif +#endif + +// Identifies if the current compiler has C++11 support enabled. +// Does not by itself identify if any given C++11 feature is present. +#if !defined(XR_CPP11_ENABLED) && defined(__cplusplus) +#if defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) +#define XR_CPP11_ENABLED 1 +#elif defined(_MSC_VER) && (_MSC_VER >= 1600) +#define XR_CPP11_ENABLED 1 +#elif (__cplusplus >= 201103L) // 201103 is the first C++11 version. +#define XR_CPP11_ENABLED 1 +#endif +#endif + +// Identifies if the current compiler supports C++11 nullptr. +#if !defined(XR_CPP_NULLPTR_SUPPORTED) +#if defined(XR_CPP11_ENABLED) && \ + ((defined(__clang__) && XR_COMPILER_HAS_FEATURE(cxx_nullptr)) || \ + (defined(__GNUC__) && (((__GNUC__ * 1000) + __GNUC_MINOR__) >= 4006)) || \ + (defined(_MSC_VER) && (_MSC_VER >= 1600)) || \ + (defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 403))) +#define XR_CPP_NULLPTR_SUPPORTED 1 +#endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr_reflection.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr_reflection.h new file mode 100644 index 0000000..216bd36 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/openxr_reflection.h @@ -0,0 +1,2358 @@ +#ifndef OPENXR_REFLECTION_H_ +#define OPENXR_REFLECTION_H_ 1 + +/* +** Copyright (c) 2017-2021, The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 OR MIT +*/ + +/* +** This header is generated from the Khronos OpenXR XML API Registry. +** +*/ + +#include "openxr.h" + +/* +This file contains expansion macros (X Macros) for OpenXR enumerations and structures. +Example of how to use expansion macros to make an enum-to-string function: + +#define XR_ENUM_CASE_STR(name, val) case name: return #name; +#define XR_ENUM_STR(enumType) \ + constexpr const char* XrEnumStr(enumType e) { \ + switch (e) { \ + XR_LIST_ENUM_##enumType(XR_ENUM_CASE_STR) \ + default: return "Unknown"; \ + } \ + } \ + +XR_ENUM_STR(XrResult); +*/ + +#define XR_LIST_ENUM_XrResult(_) \ + _(XR_SUCCESS, 0) \ + _(XR_TIMEOUT_EXPIRED, 1) \ + _(XR_SESSION_LOSS_PENDING, 3) \ + _(XR_EVENT_UNAVAILABLE, 4) \ + _(XR_SPACE_BOUNDS_UNAVAILABLE, 7) \ + _(XR_SESSION_NOT_FOCUSED, 8) \ + _(XR_FRAME_DISCARDED, 9) \ + _(XR_ERROR_VALIDATION_FAILURE, -1) \ + _(XR_ERROR_RUNTIME_FAILURE, -2) \ + _(XR_ERROR_OUT_OF_MEMORY, -3) \ + _(XR_ERROR_API_VERSION_UNSUPPORTED, -4) \ + _(XR_ERROR_INITIALIZATION_FAILED, -6) \ + _(XR_ERROR_FUNCTION_UNSUPPORTED, -7) \ + _(XR_ERROR_FEATURE_UNSUPPORTED, -8) \ + _(XR_ERROR_EXTENSION_NOT_PRESENT, -9) \ + _(XR_ERROR_LIMIT_REACHED, -10) \ + _(XR_ERROR_SIZE_INSUFFICIENT, -11) \ + _(XR_ERROR_HANDLE_INVALID, -12) \ + _(XR_ERROR_INSTANCE_LOST, -13) \ + _(XR_ERROR_SESSION_RUNNING, -14) \ + _(XR_ERROR_SESSION_NOT_RUNNING, -16) \ + _(XR_ERROR_SESSION_LOST, -17) \ + _(XR_ERROR_SYSTEM_INVALID, -18) \ + _(XR_ERROR_PATH_INVALID, -19) \ + _(XR_ERROR_PATH_COUNT_EXCEEDED, -20) \ + _(XR_ERROR_PATH_FORMAT_INVALID, -21) \ + _(XR_ERROR_PATH_UNSUPPORTED, -22) \ + _(XR_ERROR_LAYER_INVALID, -23) \ + _(XR_ERROR_LAYER_LIMIT_EXCEEDED, -24) \ + _(XR_ERROR_SWAPCHAIN_RECT_INVALID, -25) \ + _(XR_ERROR_SWAPCHAIN_FORMAT_UNSUPPORTED, -26) \ + _(XR_ERROR_ACTION_TYPE_MISMATCH, -27) \ + _(XR_ERROR_SESSION_NOT_READY, -28) \ + _(XR_ERROR_SESSION_NOT_STOPPING, -29) \ + _(XR_ERROR_TIME_INVALID, -30) \ + _(XR_ERROR_REFERENCE_SPACE_UNSUPPORTED, -31) \ + _(XR_ERROR_FILE_ACCESS_ERROR, -32) \ + _(XR_ERROR_FILE_CONTENTS_INVALID, -33) \ + _(XR_ERROR_FORM_FACTOR_UNSUPPORTED, -34) \ + _(XR_ERROR_FORM_FACTOR_UNAVAILABLE, -35) \ + _(XR_ERROR_API_LAYER_NOT_PRESENT, -36) \ + _(XR_ERROR_CALL_ORDER_INVALID, -37) \ + _(XR_ERROR_GRAPHICS_DEVICE_INVALID, -38) \ + _(XR_ERROR_POSE_INVALID, -39) \ + _(XR_ERROR_INDEX_OUT_OF_RANGE, -40) \ + _(XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED, -41) \ + _(XR_ERROR_ENVIRONMENT_BLEND_MODE_UNSUPPORTED, -42) \ + _(XR_ERROR_NAME_DUPLICATED, -44) \ + _(XR_ERROR_NAME_INVALID, -45) \ + _(XR_ERROR_ACTIONSET_NOT_ATTACHED, -46) \ + _(XR_ERROR_ACTIONSETS_ALREADY_ATTACHED, -47) \ + _(XR_ERROR_LOCALIZED_NAME_DUPLICATED, -48) \ + _(XR_ERROR_LOCALIZED_NAME_INVALID, -49) \ + _(XR_ERROR_GRAPHICS_REQUIREMENTS_CALL_MISSING, -50) \ + _(XR_ERROR_RUNTIME_UNAVAILABLE, -51) \ + _(XR_ERROR_ANDROID_THREAD_SETTINGS_ID_INVALID_KHR, -1000003000) \ + _(XR_ERROR_ANDROID_THREAD_SETTINGS_FAILURE_KHR, -1000003001) \ + _(XR_ERROR_CREATE_SPATIAL_ANCHOR_FAILED_MSFT, -1000039001) \ + _(XR_ERROR_SECONDARY_VIEW_CONFIGURATION_TYPE_NOT_ENABLED_MSFT, -1000053000) \ + _(XR_ERROR_CONTROLLER_MODEL_KEY_INVALID_MSFT, -1000055000) \ + _(XR_ERROR_REPROJECTION_MODE_UNSUPPORTED_MSFT, -1000066000) \ + _(XR_ERROR_COMPUTE_NEW_SCENE_NOT_COMPLETED_MSFT, -1000097000) \ + _(XR_ERROR_SCENE_COMPONENT_ID_INVALID_MSFT, -1000097001) \ + _(XR_ERROR_SCENE_COMPONENT_TYPE_MISMATCH_MSFT, -1000097002) \ + _(XR_ERROR_SCENE_MESH_BUFFER_ID_INVALID_MSFT, -1000097003) \ + _(XR_ERROR_SCENE_COMPUTE_FEATURE_INCOMPATIBLE_MSFT, -1000097004) \ + _(XR_ERROR_SCENE_COMPUTE_CONSISTENCY_MISMATCH_MSFT, -1000097005) \ + _(XR_ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB, -1000101000) \ + _(XR_ERROR_COLOR_SPACE_UNSUPPORTED_FB, -1000108000) \ + _(XR_ERROR_SPATIAL_ANCHOR_NAME_NOT_FOUND_MSFT, -1000142001) \ + _(XR_ERROR_SPATIAL_ANCHOR_NAME_INVALID_MSFT, -1000142002) \ + _(XR_RESULT_MAX_ENUM, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrStructureType(_) \ + _(XR_TYPE_UNKNOWN, 0) \ + _(XR_TYPE_API_LAYER_PROPERTIES, 1) \ + _(XR_TYPE_EXTENSION_PROPERTIES, 2) \ + _(XR_TYPE_INSTANCE_CREATE_INFO, 3) \ + _(XR_TYPE_SYSTEM_GET_INFO, 4) \ + _(XR_TYPE_SYSTEM_PROPERTIES, 5) \ + _(XR_TYPE_VIEW_LOCATE_INFO, 6) \ + _(XR_TYPE_VIEW, 7) \ + _(XR_TYPE_SESSION_CREATE_INFO, 8) \ + _(XR_TYPE_SWAPCHAIN_CREATE_INFO, 9) \ + _(XR_TYPE_SESSION_BEGIN_INFO, 10) \ + _(XR_TYPE_VIEW_STATE, 11) \ + _(XR_TYPE_FRAME_END_INFO, 12) \ + _(XR_TYPE_HAPTIC_VIBRATION, 13) \ + _(XR_TYPE_EVENT_DATA_BUFFER, 16) \ + _(XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING, 17) \ + _(XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED, 18) \ + _(XR_TYPE_ACTION_STATE_BOOLEAN, 23) \ + _(XR_TYPE_ACTION_STATE_FLOAT, 24) \ + _(XR_TYPE_ACTION_STATE_VECTOR2F, 25) \ + _(XR_TYPE_ACTION_STATE_POSE, 27) \ + _(XR_TYPE_ACTION_SET_CREATE_INFO, 28) \ + _(XR_TYPE_ACTION_CREATE_INFO, 29) \ + _(XR_TYPE_INSTANCE_PROPERTIES, 32) \ + _(XR_TYPE_FRAME_WAIT_INFO, 33) \ + _(XR_TYPE_COMPOSITION_LAYER_PROJECTION, 35) \ + _(XR_TYPE_COMPOSITION_LAYER_QUAD, 36) \ + _(XR_TYPE_REFERENCE_SPACE_CREATE_INFO, 37) \ + _(XR_TYPE_ACTION_SPACE_CREATE_INFO, 38) \ + _(XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING, 40) \ + _(XR_TYPE_VIEW_CONFIGURATION_VIEW, 41) \ + _(XR_TYPE_SPACE_LOCATION, 42) \ + _(XR_TYPE_SPACE_VELOCITY, 43) \ + _(XR_TYPE_FRAME_STATE, 44) \ + _(XR_TYPE_VIEW_CONFIGURATION_PROPERTIES, 45) \ + _(XR_TYPE_FRAME_BEGIN_INFO, 46) \ + _(XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW, 48) \ + _(XR_TYPE_EVENT_DATA_EVENTS_LOST, 49) \ + _(XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING, 51) \ + _(XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED, 52) \ + _(XR_TYPE_INTERACTION_PROFILE_STATE, 53) \ + _(XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO, 55) \ + _(XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO, 56) \ + _(XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO, 57) \ + _(XR_TYPE_ACTION_STATE_GET_INFO, 58) \ + _(XR_TYPE_HAPTIC_ACTION_INFO, 59) \ + _(XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO, 60) \ + _(XR_TYPE_ACTIONS_SYNC_INFO, 61) \ + _(XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO, 62) \ + _(XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO, 63) \ + _(XR_TYPE_COMPOSITION_LAYER_CUBE_KHR, 1000006000) \ + _(XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR, 1000008000) \ + _(XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR, 1000010000) \ + _(XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR, 1000014000) \ + _(XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT, 1000015000) \ + _(XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR, 1000017000) \ + _(XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR, 1000018000) \ + _(XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT, 1000019000) \ + _(XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT, 1000019001) \ + _(XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, 1000019002) \ + _(XR_TYPE_DEBUG_UTILS_LABEL_EXT, 1000019003) \ + _(XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR, 1000023000) \ + _(XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR, 1000023001) \ + _(XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR, 1000023002) \ + _(XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR, 1000023003) \ + _(XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR, 1000023004) \ + _(XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR, 1000023005) \ + _(XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR, 1000024001) \ + _(XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR, 1000024002) \ + _(XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR, 1000024003) \ + _(XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR, 1000025000) \ + _(XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR, 1000025001) \ + _(XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR, 1000025002) \ + _(XR_TYPE_GRAPHICS_BINDING_D3D11_KHR, 1000027000) \ + _(XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR, 1000027001) \ + _(XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR, 1000027002) \ + _(XR_TYPE_GRAPHICS_BINDING_D3D12_KHR, 1000028000) \ + _(XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR, 1000028001) \ + _(XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR, 1000028002) \ + _(XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT, 1000030000) \ + _(XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT, 1000030001) \ + _(XR_TYPE_VISIBILITY_MASK_KHR, 1000031000) \ + _(XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR, 1000031001) \ + _(XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX, 1000033000) \ + _(XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX, 1000033003) \ + _(XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR, 1000034000) \ + _(XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT, 1000039000) \ + _(XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT, 1000039001) \ + _(XR_TYPE_COMPOSITION_LAYER_IMAGE_LAYOUT_FB, 1000040000) \ + _(XR_TYPE_COMPOSITION_LAYER_ALPHA_BLEND_FB, 1000041001) \ + _(XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT, 1000046000) \ + _(XR_TYPE_GRAPHICS_BINDING_EGL_MNDX, 1000048004) \ + _(XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT, 1000049000) \ + _(XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT, 1000051000) \ + _(XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT, 1000051001) \ + _(XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT, 1000051002) \ + _(XR_TYPE_HAND_JOINT_LOCATIONS_EXT, 1000051003) \ + _(XR_TYPE_HAND_JOINT_VELOCITIES_EXT, 1000051004) \ + _(XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT, 1000052000) \ + _(XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT, 1000052001) \ + _(XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT, 1000052002) \ + _(XR_TYPE_HAND_MESH_MSFT, 1000052003) \ + _(XR_TYPE_HAND_POSE_TYPE_INFO_MSFT, 1000052004) \ + _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT, 1000053000) \ + _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT, 1000053001) \ + _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT, 1000053002) \ + _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT, 1000053003) \ + _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT, 1000053004) \ + _(XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT, 1000053005) \ + _(XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT, 1000055000) \ + _(XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT, 1000055001) \ + _(XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT, 1000055002) \ + _(XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT, 1000055003) \ + _(XR_TYPE_CONTROLLER_MODEL_STATE_MSFT, 1000055004) \ + _(XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC, 1000059000) \ + _(XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT, 1000063000) \ + _(XR_TYPE_COMPOSITION_LAYER_REPROJECTION_INFO_MSFT, 1000066000) \ + _(XR_TYPE_COMPOSITION_LAYER_REPROJECTION_PLANE_OVERRIDE_MSFT, 1000066001) \ + _(XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB, 1000070000) \ + _(XR_TYPE_COMPOSITION_LAYER_SECURE_CONTENT_FB, 1000072000) \ + _(XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE, 1000079000) \ + _(XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT, 1000080000) \ + _(XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR, 1000089000) \ + _(XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR, 1000090000) \ + _(XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR, 1000090001) \ + _(XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR, 1000090003) \ + _(XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR, 1000091000) \ + _(XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT, 1000097000) \ + _(XR_TYPE_SCENE_CREATE_INFO_MSFT, 1000097001) \ + _(XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT, 1000097002) \ + _(XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT, 1000097003) \ + _(XR_TYPE_SCENE_COMPONENTS_MSFT, 1000097004) \ + _(XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT, 1000097005) \ + _(XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT, 1000097006) \ + _(XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT, 1000097007) \ + _(XR_TYPE_SCENE_OBJECTS_MSFT, 1000097008) \ + _(XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT, 1000097009) \ + _(XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT, 1000097010) \ + _(XR_TYPE_SCENE_PLANES_MSFT, 1000097011) \ + _(XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT, 1000097012) \ + _(XR_TYPE_SCENE_MESHES_MSFT, 1000097013) \ + _(XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT, 1000097014) \ + _(XR_TYPE_SCENE_MESH_BUFFERS_MSFT, 1000097015) \ + _(XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT, 1000097016) \ + _(XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT, 1000097017) \ + _(XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT, 1000097018) \ + _(XR_TYPE_SERIALIZED_SCENE_FRAGMENT_DATA_GET_INFO_MSFT, 1000098000) \ + _(XR_TYPE_SCENE_DESERIALIZE_INFO_MSFT, 1000098001) \ + _(XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB, 1000101000) \ + _(XR_TYPE_SYSTEM_EXPRESSION_PROPERTIES_HTC, 1000104000) \ + _(XR_TYPE_EXPRESSION_CREATE_INFO_HTC, 1000104001) \ + _(XR_TYPE_EXPRESSION_DATA_HTC, 1000104002) \ + _(XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB, 1000108000) \ + _(XR_TYPE_FOVEATION_PROFILE_CREATE_INFO_FB, 1000114000) \ + _(XR_TYPE_SWAPCHAIN_CREATE_INFO_FOVEATION_FB, 1000114001) \ + _(XR_TYPE_SWAPCHAIN_STATE_FOVEATION_FB, 1000114002) \ + _(XR_TYPE_FOVEATION_LEVEL_PROFILE_CREATE_INFO_FB, 1000115000) \ + _(XR_TYPE_BINDING_MODIFICATIONS_KHR, 1000120000) \ + _(XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO, 1000121000) \ + _(XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO, 1000121001) \ + _(XR_TYPE_SYSTEM_FOVEATED_RENDERING_PROPERTIES_VARJO, 1000121002) \ + _(XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_VARJO, 1000122000) \ + _(XR_TYPE_SPATIAL_ANCHOR_PERSISTENCE_INFO_MSFT, 1000142000) \ + _(XR_TYPE_SPATIAL_ANCHOR_FROM_PERSISTED_ANCHOR_CREATE_INFO_MSFT, 1000142001) \ + _(XR_TYPE_SWAPCHAIN_IMAGE_FOVEATION_VULKAN_FB, 1000160000) \ + _(XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB, 1000161000) \ + _(XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB, 1000162000) \ + _(XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB, 1000163000) \ + _(XR_STRUCTURE_TYPE_MAX_ENUM, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrFormFactor(_) \ + _(XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY, 1) \ + _(XR_FORM_FACTOR_HANDHELD_DISPLAY, 2) \ + _(XR_FORM_FACTOR_MAX_ENUM, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrViewConfigurationType(_) \ + _(XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO, 1) \ + _(XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO, 2) \ + _(XR_VIEW_CONFIGURATION_TYPE_PRIMARY_QUAD_VARJO, 1000037000) \ + _(XR_VIEW_CONFIGURATION_TYPE_SECONDARY_MONO_FIRST_PERSON_OBSERVER_MSFT, 1000054000) \ + _(XR_VIEW_CONFIGURATION_TYPE_MAX_ENUM, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrEnvironmentBlendMode(_) \ + _(XR_ENVIRONMENT_BLEND_MODE_OPAQUE, 1) \ + _(XR_ENVIRONMENT_BLEND_MODE_ADDITIVE, 2) \ + _(XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND, 3) \ + _(XR_ENVIRONMENT_BLEND_MODE_MAX_ENUM, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrReferenceSpaceType(_) \ + _(XR_REFERENCE_SPACE_TYPE_VIEW, 1) \ + _(XR_REFERENCE_SPACE_TYPE_LOCAL, 2) \ + _(XR_REFERENCE_SPACE_TYPE_STAGE, 3) \ + _(XR_REFERENCE_SPACE_TYPE_UNBOUNDED_MSFT, 1000038000) \ + _(XR_REFERENCE_SPACE_TYPE_COMBINED_EYE_VARJO, 1000121000) \ + _(XR_REFERENCE_SPACE_TYPE_MAX_ENUM, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrActionType(_) \ + _(XR_ACTION_TYPE_BOOLEAN_INPUT, 1) \ + _(XR_ACTION_TYPE_FLOAT_INPUT, 2) \ + _(XR_ACTION_TYPE_VECTOR2F_INPUT, 3) \ + _(XR_ACTION_TYPE_POSE_INPUT, 4) \ + _(XR_ACTION_TYPE_VIBRATION_OUTPUT, 100) \ + _(XR_ACTION_TYPE_MAX_ENUM, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrEyeVisibility(_) \ + _(XR_EYE_VISIBILITY_BOTH, 0) \ + _(XR_EYE_VISIBILITY_LEFT, 1) \ + _(XR_EYE_VISIBILITY_RIGHT, 2) \ + _(XR_EYE_VISIBILITY_MAX_ENUM, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrSessionState(_) \ + _(XR_SESSION_STATE_UNKNOWN, 0) \ + _(XR_SESSION_STATE_IDLE, 1) \ + _(XR_SESSION_STATE_READY, 2) \ + _(XR_SESSION_STATE_SYNCHRONIZED, 3) \ + _(XR_SESSION_STATE_VISIBLE, 4) \ + _(XR_SESSION_STATE_FOCUSED, 5) \ + _(XR_SESSION_STATE_STOPPING, 6) \ + _(XR_SESSION_STATE_LOSS_PENDING, 7) \ + _(XR_SESSION_STATE_EXITING, 8) \ + _(XR_SESSION_STATE_MAX_ENUM, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrObjectType(_) \ + _(XR_OBJECT_TYPE_UNKNOWN, 0) \ + _(XR_OBJECT_TYPE_INSTANCE, 1) \ + _(XR_OBJECT_TYPE_SESSION, 2) \ + _(XR_OBJECT_TYPE_SWAPCHAIN, 3) \ + _(XR_OBJECT_TYPE_SPACE, 4) \ + _(XR_OBJECT_TYPE_ACTION_SET, 5) \ + _(XR_OBJECT_TYPE_ACTION, 6) \ + _(XR_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT, 1000019000) \ + _(XR_OBJECT_TYPE_SPATIAL_ANCHOR_MSFT, 1000039000) \ + _(XR_OBJECT_TYPE_HAND_TRACKER_EXT, 1000051000) \ + _(XR_OBJECT_TYPE_SCENE_OBSERVER_MSFT, 1000097000) \ + _(XR_OBJECT_TYPE_SCENE_MSFT, 1000097001) \ + _(XR_OBJECT_TYPE_EXPRESSION_HTC, 1000104000) \ + _(XR_OBJECT_TYPE_FOVEATION_PROFILE_FB, 1000114000) \ + _(XR_OBJECT_TYPE_SPATIAL_ANCHOR_STORE_CONNECTION_MSFT, 1000142000) \ + _(XR_OBJECT_TYPE_MAX_ENUM, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrAndroidThreadTypeKHR(_) \ + _(XR_ANDROID_THREAD_TYPE_APPLICATION_MAIN_KHR, 1) \ + _(XR_ANDROID_THREAD_TYPE_APPLICATION_WORKER_KHR, 2) \ + _(XR_ANDROID_THREAD_TYPE_RENDERER_MAIN_KHR, 3) \ + _(XR_ANDROID_THREAD_TYPE_RENDERER_WORKER_KHR, 4) \ + _(XR_ANDROID_THREAD_TYPE_MAX_ENUM_KHR, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrVisibilityMaskTypeKHR(_) \ + _(XR_VISIBILITY_MASK_TYPE_HIDDEN_TRIANGLE_MESH_KHR, 1) \ + _(XR_VISIBILITY_MASK_TYPE_VISIBLE_TRIANGLE_MESH_KHR, 2) \ + _(XR_VISIBILITY_MASK_TYPE_LINE_LOOP_KHR, 3) \ + _(XR_VISIBILITY_MASK_TYPE_MAX_ENUM_KHR, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrPerfSettingsDomainEXT(_) \ + _(XR_PERF_SETTINGS_DOMAIN_CPU_EXT, 1) \ + _(XR_PERF_SETTINGS_DOMAIN_GPU_EXT, 2) \ + _(XR_PERF_SETTINGS_DOMAIN_MAX_ENUM_EXT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrPerfSettingsSubDomainEXT(_) \ + _(XR_PERF_SETTINGS_SUB_DOMAIN_COMPOSITING_EXT, 1) \ + _(XR_PERF_SETTINGS_SUB_DOMAIN_RENDERING_EXT, 2) \ + _(XR_PERF_SETTINGS_SUB_DOMAIN_THERMAL_EXT, 3) \ + _(XR_PERF_SETTINGS_SUB_DOMAIN_MAX_ENUM_EXT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrPerfSettingsLevelEXT(_) \ + _(XR_PERF_SETTINGS_LEVEL_POWER_SAVINGS_EXT, 0) \ + _(XR_PERF_SETTINGS_LEVEL_SUSTAINED_LOW_EXT, 25) \ + _(XR_PERF_SETTINGS_LEVEL_SUSTAINED_HIGH_EXT, 50) \ + _(XR_PERF_SETTINGS_LEVEL_BOOST_EXT, 75) \ + _(XR_PERF_SETTINGS_LEVEL_MAX_ENUM_EXT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrPerfSettingsNotificationLevelEXT(_) \ + _(XR_PERF_SETTINGS_NOTIF_LEVEL_NORMAL_EXT, 0) \ + _(XR_PERF_SETTINGS_NOTIF_LEVEL_WARNING_EXT, 25) \ + _(XR_PERF_SETTINGS_NOTIF_LEVEL_IMPAIRED_EXT, 75) \ + _(XR_PERF_SETTINGS_NOTIFICATION_LEVEL_MAX_ENUM_EXT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrBlendFactorFB(_) \ + _(XR_BLEND_FACTOR_ZERO_FB, 0) \ + _(XR_BLEND_FACTOR_ONE_FB, 1) \ + _(XR_BLEND_FACTOR_SRC_ALPHA_FB, 2) \ + _(XR_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA_FB, 3) \ + _(XR_BLEND_FACTOR_DST_ALPHA_FB, 4) \ + _(XR_BLEND_FACTOR_ONE_MINUS_DST_ALPHA_FB, 5) \ + _(XR_BLEND_FACTOR_MAX_ENUM_FB, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrSpatialGraphNodeTypeMSFT(_) \ + _(XR_SPATIAL_GRAPH_NODE_TYPE_STATIC_MSFT, 1) \ + _(XR_SPATIAL_GRAPH_NODE_TYPE_DYNAMIC_MSFT, 2) \ + _(XR_SPATIAL_GRAPH_NODE_TYPE_MAX_ENUM_MSFT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrHandEXT(_) \ + _(XR_HAND_LEFT_EXT, 1) \ + _(XR_HAND_RIGHT_EXT, 2) \ + _(XR_HAND_MAX_ENUM_EXT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrHandJointEXT(_) \ + _(XR_HAND_JOINT_PALM_EXT, 0) \ + _(XR_HAND_JOINT_WRIST_EXT, 1) \ + _(XR_HAND_JOINT_THUMB_METACARPAL_EXT, 2) \ + _(XR_HAND_JOINT_THUMB_PROXIMAL_EXT, 3) \ + _(XR_HAND_JOINT_THUMB_DISTAL_EXT, 4) \ + _(XR_HAND_JOINT_THUMB_TIP_EXT, 5) \ + _(XR_HAND_JOINT_INDEX_METACARPAL_EXT, 6) \ + _(XR_HAND_JOINT_INDEX_PROXIMAL_EXT, 7) \ + _(XR_HAND_JOINT_INDEX_INTERMEDIATE_EXT, 8) \ + _(XR_HAND_JOINT_INDEX_DISTAL_EXT, 9) \ + _(XR_HAND_JOINT_INDEX_TIP_EXT, 10) \ + _(XR_HAND_JOINT_MIDDLE_METACARPAL_EXT, 11) \ + _(XR_HAND_JOINT_MIDDLE_PROXIMAL_EXT, 12) \ + _(XR_HAND_JOINT_MIDDLE_INTERMEDIATE_EXT, 13) \ + _(XR_HAND_JOINT_MIDDLE_DISTAL_EXT, 14) \ + _(XR_HAND_JOINT_MIDDLE_TIP_EXT, 15) \ + _(XR_HAND_JOINT_RING_METACARPAL_EXT, 16) \ + _(XR_HAND_JOINT_RING_PROXIMAL_EXT, 17) \ + _(XR_HAND_JOINT_RING_INTERMEDIATE_EXT, 18) \ + _(XR_HAND_JOINT_RING_DISTAL_EXT, 19) \ + _(XR_HAND_JOINT_RING_TIP_EXT, 20) \ + _(XR_HAND_JOINT_LITTLE_METACARPAL_EXT, 21) \ + _(XR_HAND_JOINT_LITTLE_PROXIMAL_EXT, 22) \ + _(XR_HAND_JOINT_LITTLE_INTERMEDIATE_EXT, 23) \ + _(XR_HAND_JOINT_LITTLE_DISTAL_EXT, 24) \ + _(XR_HAND_JOINT_LITTLE_TIP_EXT, 25) \ + _(XR_HAND_JOINT_MAX_ENUM_EXT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrHandJointSetEXT(_) \ + _(XR_HAND_JOINT_SET_DEFAULT_EXT, 0) \ + _(XR_HAND_JOINT_SET_MAX_ENUM_EXT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrHandPoseTypeMSFT(_) \ + _(XR_HAND_POSE_TYPE_TRACKED_MSFT, 0) \ + _(XR_HAND_POSE_TYPE_REFERENCE_OPEN_PALM_MSFT, 1) \ + _(XR_HAND_POSE_TYPE_MAX_ENUM_MSFT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrReprojectionModeMSFT(_) \ + _(XR_REPROJECTION_MODE_DEPTH_MSFT, 1) \ + _(XR_REPROJECTION_MODE_PLANAR_FROM_DEPTH_MSFT, 2) \ + _(XR_REPROJECTION_MODE_PLANAR_MANUAL_MSFT, 3) \ + _(XR_REPROJECTION_MODE_ORIENTATION_ONLY_MSFT, 4) \ + _(XR_REPROJECTION_MODE_MAX_ENUM_MSFT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrHandJointsMotionRangeEXT(_) \ + _(XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT, 1) \ + _(XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT, 2) \ + _(XR_HAND_JOINTS_MOTION_RANGE_MAX_ENUM_EXT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrSceneComputeFeatureMSFT(_) \ + _(XR_SCENE_COMPUTE_FEATURE_PLANE_MSFT, 1) \ + _(XR_SCENE_COMPUTE_FEATURE_PLANE_MESH_MSFT, 2) \ + _(XR_SCENE_COMPUTE_FEATURE_VISUAL_MESH_MSFT, 3) \ + _(XR_SCENE_COMPUTE_FEATURE_COLLIDER_MESH_MSFT, 4) \ + _(XR_SCENE_COMPUTE_FEATURE_SERIALIZE_SCENE_MSFT, 1000098000) \ + _(XR_SCENE_COMPUTE_FEATURE_MAX_ENUM_MSFT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrSceneComputeConsistencyMSFT(_) \ + _(XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_COMPLETE_MSFT, 1) \ + _(XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_INCOMPLETE_FAST_MSFT, 2) \ + _(XR_SCENE_COMPUTE_CONSISTENCY_OCCLUSION_OPTIMIZED_MSFT, 3) \ + _(XR_SCENE_COMPUTE_CONSISTENCY_MAX_ENUM_MSFT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrMeshComputeLodMSFT(_) \ + _(XR_MESH_COMPUTE_LOD_COARSE_MSFT, 1) \ + _(XR_MESH_COMPUTE_LOD_MEDIUM_MSFT, 2) \ + _(XR_MESH_COMPUTE_LOD_FINE_MSFT, 3) \ + _(XR_MESH_COMPUTE_LOD_UNLIMITED_MSFT, 4) \ + _(XR_MESH_COMPUTE_LOD_MAX_ENUM_MSFT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrSceneComponentTypeMSFT(_) \ + _(XR_SCENE_COMPONENT_TYPE_INVALID_MSFT, -1) \ + _(XR_SCENE_COMPONENT_TYPE_OBJECT_MSFT, 1) \ + _(XR_SCENE_COMPONENT_TYPE_PLANE_MSFT, 2) \ + _(XR_SCENE_COMPONENT_TYPE_VISUAL_MESH_MSFT, 3) \ + _(XR_SCENE_COMPONENT_TYPE_COLLIDER_MESH_MSFT, 4) \ + _(XR_SCENE_COMPONENT_TYPE_SERIALIZED_SCENE_FRAGMENT_MSFT, 1000098000) \ + _(XR_SCENE_COMPONENT_TYPE_MAX_ENUM_MSFT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrSceneObjectTypeMSFT(_) \ + _(XR_SCENE_OBJECT_TYPE_UNCATEGORIZED_MSFT, -1) \ + _(XR_SCENE_OBJECT_TYPE_BACKGROUND_MSFT, 1) \ + _(XR_SCENE_OBJECT_TYPE_WALL_MSFT, 2) \ + _(XR_SCENE_OBJECT_TYPE_FLOOR_MSFT, 3) \ + _(XR_SCENE_OBJECT_TYPE_CEILING_MSFT, 4) \ + _(XR_SCENE_OBJECT_TYPE_PLATFORM_MSFT, 5) \ + _(XR_SCENE_OBJECT_TYPE_INFERRED_MSFT, 6) \ + _(XR_SCENE_OBJECT_TYPE_MAX_ENUM_MSFT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrScenePlaneAlignmentTypeMSFT(_) \ + _(XR_SCENE_PLANE_ALIGNMENT_TYPE_NON_ORTHOGONAL_MSFT, 0) \ + _(XR_SCENE_PLANE_ALIGNMENT_TYPE_HORIZONTAL_MSFT, 1) \ + _(XR_SCENE_PLANE_ALIGNMENT_TYPE_VERTICAL_MSFT, 2) \ + _(XR_SCENE_PLANE_ALIGNMENT_TYPE_MAX_ENUM_MSFT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrSceneComputeStateMSFT(_) \ + _(XR_SCENE_COMPUTE_STATE_NONE_MSFT, 0) \ + _(XR_SCENE_COMPUTE_STATE_UPDATING_MSFT, 1) \ + _(XR_SCENE_COMPUTE_STATE_COMPLETED_MSFT, 2) \ + _(XR_SCENE_COMPUTE_STATE_COMPLETED_WITH_ERROR_MSFT, 3) \ + _(XR_SCENE_COMPUTE_STATE_MAX_ENUM_MSFT, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrEyeShapeHTC(_) \ + _(XR_EYE_SHAPE_NONE_HTC, -1) \ + _(XR_EYE_SHAPE_EYE_LEFT_BLINK_HTC, 0) \ + _(XR_EYE_SHAPE_EYE_LEFT_WIDE_HTC, 1) \ + _(XR_EYE_SHAPE_EYE_RIGHT_BLINK_HTC, 2) \ + _(XR_EYE_SHAPE_EYE_RIGHT_WIDE_HTC, 3) \ + _(XR_EYE_SHAPE_EYE_LEFT_SQUEEZE_HTC, 4) \ + _(XR_EYE_SHAPE_EYE_RIGHT_SQUEEZE_HTC, 5) \ + _(XR_EYE_SHAPE_MAX_ENUM_HTC, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrLipShapeHTC(_) \ + _(XR_LIP_SHAPE_NONE_HTC, -1) \ + _(XR_LIP_SHAPE_JAW_RIGHT_HTC, 0) \ + _(XR_LIP_SHAPE_JAW_LEFT_HTC, 1) \ + _(XR_LIP_SHAPE_JAW_FORWARD_HTC, 2) \ + _(XR_LIP_SHAPE_JAW_OPEN_HTC, 3) \ + _(XR_LIP_SHAPE_MOUTH_APE_SHAPE_HTC, 4) \ + _(XR_LIP_SHAPE_MOUTH_UPPER_RIGHT_HTC, 5) \ + _(XR_LIP_SHAPE_MOUTH_UPPER_LEFT_HTC, 6) \ + _(XR_LIP_SHAPE_MOUTH_LOWER_RIGHT_HTC, 7) \ + _(XR_LIP_SHAPE_MOUTH_LOWER_LEFT_HTC, 8) \ + _(XR_LIP_SHAPE_MOUTH_UPPER_OVERTURN_HTC, 9) \ + _(XR_LIP_SHAPE_MOUTH_LOWER_OVERTURN_HTC, 10) \ + _(XR_LIP_SHAPE_MOUTH_POUT_HTC, 11) \ + _(XR_LIP_SHAPE_MOUTH_SMILE_RIGHT_HTC, 12) \ + _(XR_LIP_SHAPE_MOUTH_SMILE_LEFT_HTC, 13) \ + _(XR_LIP_SHAPE_MOUTH_SAD_RIGHT_HTC, 14) \ + _(XR_LIP_SHAPE_MOUTH_SAD_LEFT_HTC, 15) \ + _(XR_LIP_SHAPE_CHEEK_PUFF_RIGHT_HTC, 16) \ + _(XR_LIP_SHAPE_CHEEK_PUFF_LEFT_HTC, 17) \ + _(XR_LIP_SHAPE_CHEEK_SUCK_HTC, 18) \ + _(XR_LIP_SHAPE_MOUTH_UPPER_UPRIGHT_HTC, 19) \ + _(XR_LIP_SHAPE_MOUTH_UPPER_UPLEFT_HTC, 20) \ + _(XR_LIP_SHAPE_MOUTH_LOWER_DOWNRIGHT_HTC, 21) \ + _(XR_LIP_SHAPE_MOUTH_LOWER_DOWNLEFT_HTC, 22) \ + _(XR_LIP_SHAPE_MOUTH_UPPER_INSIDE_HTC, 23) \ + _(XR_LIP_SHAPE_MOUTH_LOWER_INSIDE_HTC, 24) \ + _(XR_LIP_SHAPE_MOUTH_LOWER_OVERLAY_HTC, 25) \ + _(XR_LIP_SHAPE_TONGUE_LONGSTEP1_HTC, 26) \ + _(XR_LIP_SHAPE_TONGUE_LEFT_HTC, 27) \ + _(XR_LIP_SHAPE_TONGUE_RIGHT_HTC, 28) \ + _(XR_LIP_SHAPE_TONGUE_UP_HTC, 29) \ + _(XR_LIP_SHAPE_TONGUE_DOWN_HTC, 30) \ + _(XR_LIP_SHAPE_TONGUE_ROLL_HTC, 31) \ + _(XR_LIP_SHAPE_TONGUE_LONGSTEP2_HTC, 32) \ + _(XR_LIP_SHAPE_TONGUE_UPRIGHT_MORPH_HTC, 33) \ + _(XR_LIP_SHAPE_TONGUE_UPLEFT_MORPH_HTC, 34) \ + _(XR_LIP_SHAPE_TONGUE_DOWNRIGHT_MORPH_HTC, 35) \ + _(XR_LIP_SHAPE_TONGUE_DOWNLEFT_MORPH_HTC, 36) \ + _(XR_LIP_SHAPE_MAX_ENUM_HTC, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrExpressionTypeHTC(_) \ + _(XR_EXPRESSION_TYPE_EYE_HTC, 1) \ + _(XR_EXPRESSION_TYPE_LIP_HTC, 2) \ + _(XR_EXPRESSION_TYPE_MAX_ENUM_HTC, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrColorSpaceFB(_) \ + _(XR_COLOR_SPACE_UNMANAGED_FB, 0) \ + _(XR_COLOR_SPACE_REC2020_FB, 1) \ + _(XR_COLOR_SPACE_REC709_FB, 2) \ + _(XR_COLOR_SPACE_RIFT_CV1_FB, 3) \ + _(XR_COLOR_SPACE_RIFT_S_FB, 4) \ + _(XR_COLOR_SPACE_QUEST_FB, 5) \ + _(XR_COLOR_SPACE_P3_FB, 6) \ + _(XR_COLOR_SPACE_ADOBE_RGB_FB, 7) \ + _(XR_COLOR_SPACE_MAX_ENUM_FB, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrFoveationLevelFB(_) \ + _(XR_FOVEATION_LEVEL_NONE_FB, 0) \ + _(XR_FOVEATION_LEVEL_LOW_FB, 1) \ + _(XR_FOVEATION_LEVEL_MEDIUM_FB, 2) \ + _(XR_FOVEATION_LEVEL_HIGH_FB, 3) \ + _(XR_FOVEATION_LEVEL_MAX_ENUM_FB, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrFoveationDynamicFB(_) \ + _(XR_FOVEATION_DYNAMIC_DISABLED_FB, 0) \ + _(XR_FOVEATION_DYNAMIC_LEVEL_ENABLED_FB, 1) \ + _(XR_FOVEATION_DYNAMIC_MAX_ENUM_FB, 0x7FFFFFFF) + +#define XR_LIST_BITS_XrInstanceCreateFlags(_) + +#define XR_LIST_BITS_XrSessionCreateFlags(_) + +#define XR_LIST_BITS_XrSpaceVelocityFlags(_) \ + _(XR_SPACE_VELOCITY_LINEAR_VALID_BIT, 0x00000001) \ + _(XR_SPACE_VELOCITY_ANGULAR_VALID_BIT, 0x00000002) \ + +#define XR_LIST_BITS_XrSpaceLocationFlags(_) \ + _(XR_SPACE_LOCATION_ORIENTATION_VALID_BIT, 0x00000001) \ + _(XR_SPACE_LOCATION_POSITION_VALID_BIT, 0x00000002) \ + _(XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT, 0x00000004) \ + _(XR_SPACE_LOCATION_POSITION_TRACKED_BIT, 0x00000008) \ + +#define XR_LIST_BITS_XrSwapchainCreateFlags(_) \ + _(XR_SWAPCHAIN_CREATE_PROTECTED_CONTENT_BIT, 0x00000001) \ + _(XR_SWAPCHAIN_CREATE_STATIC_IMAGE_BIT, 0x00000002) \ + +#define XR_LIST_BITS_XrSwapchainUsageFlags(_) \ + _(XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT, 0x00000001) \ + _(XR_SWAPCHAIN_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0x00000002) \ + _(XR_SWAPCHAIN_USAGE_UNORDERED_ACCESS_BIT, 0x00000004) \ + _(XR_SWAPCHAIN_USAGE_TRANSFER_SRC_BIT, 0x00000008) \ + _(XR_SWAPCHAIN_USAGE_TRANSFER_DST_BIT, 0x00000010) \ + _(XR_SWAPCHAIN_USAGE_SAMPLED_BIT, 0x00000020) \ + _(XR_SWAPCHAIN_USAGE_MUTABLE_FORMAT_BIT, 0x00000040) \ + _(XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_MND, 0x00000080) \ + _(XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_KHR, XR_SWAPCHAIN_USAGE_INPUT_ATTACHMENT_BIT_MND) \ + +#define XR_LIST_BITS_XrCompositionLayerFlags(_) \ + _(XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT, 0x00000001) \ + _(XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT, 0x00000002) \ + _(XR_COMPOSITION_LAYER_UNPREMULTIPLIED_ALPHA_BIT, 0x00000004) \ + +#define XR_LIST_BITS_XrViewStateFlags(_) \ + _(XR_VIEW_STATE_ORIENTATION_VALID_BIT, 0x00000001) \ + _(XR_VIEW_STATE_POSITION_VALID_BIT, 0x00000002) \ + _(XR_VIEW_STATE_ORIENTATION_TRACKED_BIT, 0x00000004) \ + _(XR_VIEW_STATE_POSITION_TRACKED_BIT, 0x00000008) \ + +#define XR_LIST_BITS_XrInputSourceLocalizedNameFlags(_) \ + _(XR_INPUT_SOURCE_LOCALIZED_NAME_USER_PATH_BIT, 0x00000001) \ + _(XR_INPUT_SOURCE_LOCALIZED_NAME_INTERACTION_PROFILE_BIT, 0x00000002) \ + _(XR_INPUT_SOURCE_LOCALIZED_NAME_COMPONENT_BIT, 0x00000004) \ + +#define XR_LIST_BITS_XrVulkanInstanceCreateFlagsKHR(_) + +#define XR_LIST_BITS_XrVulkanDeviceCreateFlagsKHR(_) + +#define XR_LIST_BITS_XrDebugUtilsMessageSeverityFlagsEXT(_) \ + _(XR_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT, 0x00000001) \ + _(XR_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT, 0x00000010) \ + _(XR_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT, 0x00000100) \ + _(XR_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, 0x00001000) \ + +#define XR_LIST_BITS_XrDebugUtilsMessageTypeFlagsEXT(_) \ + _(XR_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, 0x00000001) \ + _(XR_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, 0x00000002) \ + _(XR_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, 0x00000004) \ + _(XR_DEBUG_UTILS_MESSAGE_TYPE_CONFORMANCE_BIT_EXT, 0x00000008) \ + +#define XR_LIST_BITS_XrOverlaySessionCreateFlagsEXTX(_) + +#define XR_LIST_BITS_XrOverlayMainSessionFlagsEXTX(_) \ + _(XR_OVERLAY_MAIN_SESSION_ENABLED_COMPOSITION_LAYER_INFO_DEPTH_BIT_EXTX, 0x00000001) \ + +#define XR_LIST_BITS_XrCompositionLayerImageLayoutFlagsFB(_) \ + _(XR_COMPOSITION_LAYER_IMAGE_LAYOUT_VERTICAL_FLIP_BIT_FB, 0x00000001) \ + +#define XR_LIST_BITS_XrAndroidSurfaceSwapchainFlagsFB(_) \ + _(XR_ANDROID_SURFACE_SWAPCHAIN_SYNCHRONOUS_BIT_FB, 0x00000001) \ + _(XR_ANDROID_SURFACE_SWAPCHAIN_USE_TIMESTAMPS_BIT_FB, 0x00000002) \ + +#define XR_LIST_BITS_XrCompositionLayerSecureContentFlagsFB(_) \ + _(XR_COMPOSITION_LAYER_SECURE_CONTENT_EXCLUDE_LAYER_BIT_FB, 0x00000001) \ + _(XR_COMPOSITION_LAYER_SECURE_CONTENT_REPLACE_LAYER_BIT_FB, 0x00000002) \ + +#define XR_LIST_BITS_XrSwapchainCreateFoveationFlagsFB(_) \ + _(XR_SWAPCHAIN_CREATE_FOVEATION_SCALED_BIN_BIT_FB, 0x00000001) \ + _(XR_SWAPCHAIN_CREATE_FOVEATION_FRAGMENT_DENSITY_MAP_BIT_FB, 0x00000002) \ + +#define XR_LIST_BITS_XrSwapchainStateFoveationFlagsFB(_) + +#define XR_LIST_STRUCT_XrApiLayerProperties(_) \ + _(type) \ + _(next) \ + _(layerName) \ + _(specVersion) \ + _(layerVersion) \ + _(description) \ + +#define XR_LIST_STRUCT_XrExtensionProperties(_) \ + _(type) \ + _(next) \ + _(extensionName) \ + _(extensionVersion) \ + +#define XR_LIST_STRUCT_XrApplicationInfo(_) \ + _(applicationName) \ + _(applicationVersion) \ + _(engineName) \ + _(engineVersion) \ + _(apiVersion) \ + +#define XR_LIST_STRUCT_XrInstanceCreateInfo(_) \ + _(type) \ + _(next) \ + _(createFlags) \ + _(applicationInfo) \ + _(enabledApiLayerCount) \ + _(enabledApiLayerNames) \ + _(enabledExtensionCount) \ + _(enabledExtensionNames) \ + +#define XR_LIST_STRUCT_XrInstanceProperties(_) \ + _(type) \ + _(next) \ + _(runtimeVersion) \ + _(runtimeName) \ + +#define XR_LIST_STRUCT_XrEventDataBuffer(_) \ + _(type) \ + _(next) \ + _(varying) \ + +#define XR_LIST_STRUCT_XrSystemGetInfo(_) \ + _(type) \ + _(next) \ + _(formFactor) \ + +#define XR_LIST_STRUCT_XrSystemGraphicsProperties(_) \ + _(maxSwapchainImageHeight) \ + _(maxSwapchainImageWidth) \ + _(maxLayerCount) \ + +#define XR_LIST_STRUCT_XrSystemTrackingProperties(_) \ + _(orientationTracking) \ + _(positionTracking) \ + +#define XR_LIST_STRUCT_XrSystemProperties(_) \ + _(type) \ + _(next) \ + _(systemId) \ + _(vendorId) \ + _(systemName) \ + _(graphicsProperties) \ + _(trackingProperties) \ + +#define XR_LIST_STRUCT_XrSessionCreateInfo(_) \ + _(type) \ + _(next) \ + _(createFlags) \ + _(systemId) \ + +#define XR_LIST_STRUCT_XrVector3f(_) \ + _(x) \ + _(y) \ + _(z) \ + +#define XR_LIST_STRUCT_XrSpaceVelocity(_) \ + _(type) \ + _(next) \ + _(velocityFlags) \ + _(linearVelocity) \ + _(angularVelocity) \ + +#define XR_LIST_STRUCT_XrQuaternionf(_) \ + _(x) \ + _(y) \ + _(z) \ + _(w) \ + +#define XR_LIST_STRUCT_XrPosef(_) \ + _(orientation) \ + _(position) \ + +#define XR_LIST_STRUCT_XrReferenceSpaceCreateInfo(_) \ + _(type) \ + _(next) \ + _(referenceSpaceType) \ + _(poseInReferenceSpace) \ + +#define XR_LIST_STRUCT_XrExtent2Df(_) \ + _(width) \ + _(height) \ + +#define XR_LIST_STRUCT_XrActionSpaceCreateInfo(_) \ + _(type) \ + _(next) \ + _(action) \ + _(subactionPath) \ + _(poseInActionSpace) \ + +#define XR_LIST_STRUCT_XrSpaceLocation(_) \ + _(type) \ + _(next) \ + _(locationFlags) \ + _(pose) \ + +#define XR_LIST_STRUCT_XrViewConfigurationProperties(_) \ + _(type) \ + _(next) \ + _(viewConfigurationType) \ + _(fovMutable) \ + +#define XR_LIST_STRUCT_XrViewConfigurationView(_) \ + _(type) \ + _(next) \ + _(recommendedImageRectWidth) \ + _(maxImageRectWidth) \ + _(recommendedImageRectHeight) \ + _(maxImageRectHeight) \ + _(recommendedSwapchainSampleCount) \ + _(maxSwapchainSampleCount) \ + +#define XR_LIST_STRUCT_XrSwapchainCreateInfo(_) \ + _(type) \ + _(next) \ + _(createFlags) \ + _(usageFlags) \ + _(format) \ + _(sampleCount) \ + _(width) \ + _(height) \ + _(faceCount) \ + _(arraySize) \ + _(mipCount) \ + +#define XR_LIST_STRUCT_XrSwapchainImageBaseHeader(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrSwapchainImageAcquireInfo(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrSwapchainImageWaitInfo(_) \ + _(type) \ + _(next) \ + _(timeout) \ + +#define XR_LIST_STRUCT_XrSwapchainImageReleaseInfo(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrSessionBeginInfo(_) \ + _(type) \ + _(next) \ + _(primaryViewConfigurationType) \ + +#define XR_LIST_STRUCT_XrFrameWaitInfo(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrFrameState(_) \ + _(type) \ + _(next) \ + _(predictedDisplayTime) \ + _(predictedDisplayPeriod) \ + _(shouldRender) \ + +#define XR_LIST_STRUCT_XrFrameBeginInfo(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrCompositionLayerBaseHeader(_) \ + _(type) \ + _(next) \ + _(layerFlags) \ + _(space) \ + +#define XR_LIST_STRUCT_XrFrameEndInfo(_) \ + _(type) \ + _(next) \ + _(displayTime) \ + _(environmentBlendMode) \ + _(layerCount) \ + _(layers) \ + +#define XR_LIST_STRUCT_XrViewLocateInfo(_) \ + _(type) \ + _(next) \ + _(viewConfigurationType) \ + _(displayTime) \ + _(space) \ + +#define XR_LIST_STRUCT_XrViewState(_) \ + _(type) \ + _(next) \ + _(viewStateFlags) \ + +#define XR_LIST_STRUCT_XrFovf(_) \ + _(angleLeft) \ + _(angleRight) \ + _(angleUp) \ + _(angleDown) \ + +#define XR_LIST_STRUCT_XrView(_) \ + _(type) \ + _(next) \ + _(pose) \ + _(fov) \ + +#define XR_LIST_STRUCT_XrActionSetCreateInfo(_) \ + _(type) \ + _(next) \ + _(actionSetName) \ + _(localizedActionSetName) \ + _(priority) \ + +#define XR_LIST_STRUCT_XrActionCreateInfo(_) \ + _(type) \ + _(next) \ + _(actionName) \ + _(actionType) \ + _(countSubactionPaths) \ + _(subactionPaths) \ + _(localizedActionName) \ + +#define XR_LIST_STRUCT_XrActionSuggestedBinding(_) \ + _(action) \ + _(binding) \ + +#define XR_LIST_STRUCT_XrInteractionProfileSuggestedBinding(_) \ + _(type) \ + _(next) \ + _(interactionProfile) \ + _(countSuggestedBindings) \ + _(suggestedBindings) \ + +#define XR_LIST_STRUCT_XrSessionActionSetsAttachInfo(_) \ + _(type) \ + _(next) \ + _(countActionSets) \ + _(actionSets) \ + +#define XR_LIST_STRUCT_XrInteractionProfileState(_) \ + _(type) \ + _(next) \ + _(interactionProfile) \ + +#define XR_LIST_STRUCT_XrActionStateGetInfo(_) \ + _(type) \ + _(next) \ + _(action) \ + _(subactionPath) \ + +#define XR_LIST_STRUCT_XrActionStateBoolean(_) \ + _(type) \ + _(next) \ + _(currentState) \ + _(changedSinceLastSync) \ + _(lastChangeTime) \ + _(isActive) \ + +#define XR_LIST_STRUCT_XrActionStateFloat(_) \ + _(type) \ + _(next) \ + _(currentState) \ + _(changedSinceLastSync) \ + _(lastChangeTime) \ + _(isActive) \ + +#define XR_LIST_STRUCT_XrVector2f(_) \ + _(x) \ + _(y) \ + +#define XR_LIST_STRUCT_XrActionStateVector2f(_) \ + _(type) \ + _(next) \ + _(currentState) \ + _(changedSinceLastSync) \ + _(lastChangeTime) \ + _(isActive) \ + +#define XR_LIST_STRUCT_XrActionStatePose(_) \ + _(type) \ + _(next) \ + _(isActive) \ + +#define XR_LIST_STRUCT_XrActiveActionSet(_) \ + _(actionSet) \ + _(subactionPath) \ + +#define XR_LIST_STRUCT_XrActionsSyncInfo(_) \ + _(type) \ + _(next) \ + _(countActiveActionSets) \ + _(activeActionSets) \ + +#define XR_LIST_STRUCT_XrBoundSourcesForActionEnumerateInfo(_) \ + _(type) \ + _(next) \ + _(action) \ + +#define XR_LIST_STRUCT_XrInputSourceLocalizedNameGetInfo(_) \ + _(type) \ + _(next) \ + _(sourcePath) \ + _(whichComponents) \ + +#define XR_LIST_STRUCT_XrHapticActionInfo(_) \ + _(type) \ + _(next) \ + _(action) \ + _(subactionPath) \ + +#define XR_LIST_STRUCT_XrHapticBaseHeader(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrBaseInStructure(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrBaseOutStructure(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrOffset2Di(_) \ + _(x) \ + _(y) \ + +#define XR_LIST_STRUCT_XrExtent2Di(_) \ + _(width) \ + _(height) \ + +#define XR_LIST_STRUCT_XrRect2Di(_) \ + _(offset) \ + _(extent) \ + +#define XR_LIST_STRUCT_XrSwapchainSubImage(_) \ + _(swapchain) \ + _(imageRect) \ + _(imageArrayIndex) \ + +#define XR_LIST_STRUCT_XrCompositionLayerProjectionView(_) \ + _(type) \ + _(next) \ + _(pose) \ + _(fov) \ + _(subImage) \ + +#define XR_LIST_STRUCT_XrCompositionLayerProjection(_) \ + _(type) \ + _(next) \ + _(layerFlags) \ + _(space) \ + _(viewCount) \ + _(views) \ + +#define XR_LIST_STRUCT_XrCompositionLayerQuad(_) \ + _(type) \ + _(next) \ + _(layerFlags) \ + _(space) \ + _(eyeVisibility) \ + _(subImage) \ + _(pose) \ + _(size) \ + +#define XR_LIST_STRUCT_XrEventDataBaseHeader(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrEventDataEventsLost(_) \ + _(type) \ + _(next) \ + _(lostEventCount) \ + +#define XR_LIST_STRUCT_XrEventDataInstanceLossPending(_) \ + _(type) \ + _(next) \ + _(lossTime) \ + +#define XR_LIST_STRUCT_XrEventDataSessionStateChanged(_) \ + _(type) \ + _(next) \ + _(session) \ + _(state) \ + _(time) \ + +#define XR_LIST_STRUCT_XrEventDataReferenceSpaceChangePending(_) \ + _(type) \ + _(next) \ + _(session) \ + _(referenceSpaceType) \ + _(changeTime) \ + _(poseValid) \ + _(poseInPreviousSpace) \ + +#define XR_LIST_STRUCT_XrEventDataInteractionProfileChanged(_) \ + _(type) \ + _(next) \ + _(session) \ + +#define XR_LIST_STRUCT_XrHapticVibration(_) \ + _(type) \ + _(next) \ + _(duration) \ + _(frequency) \ + _(amplitude) \ + +#define XR_LIST_STRUCT_XrOffset2Df(_) \ + _(x) \ + _(y) \ + +#define XR_LIST_STRUCT_XrRect2Df(_) \ + _(offset) \ + _(extent) \ + +#define XR_LIST_STRUCT_XrVector4f(_) \ + _(x) \ + _(y) \ + _(z) \ + _(w) \ + +#define XR_LIST_STRUCT_XrColor4f(_) \ + _(r) \ + _(g) \ + _(b) \ + _(a) \ + +#define XR_LIST_STRUCT_XrCompositionLayerCubeKHR(_) \ + _(type) \ + _(next) \ + _(layerFlags) \ + _(space) \ + _(eyeVisibility) \ + _(swapchain) \ + _(imageArrayIndex) \ + _(orientation) \ + +#define XR_LIST_STRUCT_XrInstanceCreateInfoAndroidKHR(_) \ + _(type) \ + _(next) \ + _(applicationVM) \ + _(applicationActivity) \ + +#define XR_LIST_STRUCT_XrCompositionLayerDepthInfoKHR(_) \ + _(type) \ + _(next) \ + _(subImage) \ + _(minDepth) \ + _(maxDepth) \ + _(nearZ) \ + _(farZ) \ + +#define XR_LIST_STRUCT_XrVulkanSwapchainFormatListCreateInfoKHR(_) \ + _(type) \ + _(next) \ + _(viewFormatCount) \ + _(viewFormats) \ + +#define XR_LIST_STRUCT_XrCompositionLayerCylinderKHR(_) \ + _(type) \ + _(next) \ + _(layerFlags) \ + _(space) \ + _(eyeVisibility) \ + _(subImage) \ + _(pose) \ + _(radius) \ + _(centralAngle) \ + _(aspectRatio) \ + +#define XR_LIST_STRUCT_XrCompositionLayerEquirectKHR(_) \ + _(type) \ + _(next) \ + _(layerFlags) \ + _(space) \ + _(eyeVisibility) \ + _(subImage) \ + _(pose) \ + _(radius) \ + _(scale) \ + _(bias) \ + +#define XR_LIST_STRUCT_XrGraphicsBindingOpenGLWin32KHR(_) \ + _(type) \ + _(next) \ + _(hDC) \ + _(hGLRC) \ + +#define XR_LIST_STRUCT_XrGraphicsBindingOpenGLXlibKHR(_) \ + _(type) \ + _(next) \ + _(xDisplay) \ + _(visualid) \ + _(glxFBConfig) \ + _(glxDrawable) \ + _(glxContext) \ + +#define XR_LIST_STRUCT_XrGraphicsBindingOpenGLXcbKHR(_) \ + _(type) \ + _(next) \ + _(connection) \ + _(screenNumber) \ + _(fbconfigid) \ + _(visualid) \ + _(glxDrawable) \ + _(glxContext) \ + +#define XR_LIST_STRUCT_XrGraphicsBindingOpenGLWaylandKHR(_) \ + _(type) \ + _(next) \ + _(display) \ + +#define XR_LIST_STRUCT_XrSwapchainImageOpenGLKHR(_) \ + _(type) \ + _(next) \ + _(image) \ + +#define XR_LIST_STRUCT_XrGraphicsRequirementsOpenGLKHR(_) \ + _(type) \ + _(next) \ + _(minApiVersionSupported) \ + _(maxApiVersionSupported) \ + +#define XR_LIST_STRUCT_XrGraphicsBindingOpenGLESAndroidKHR(_) \ + _(type) \ + _(next) \ + _(display) \ + _(config) \ + _(context) \ + +#define XR_LIST_STRUCT_XrSwapchainImageOpenGLESKHR(_) \ + _(type) \ + _(next) \ + _(image) \ + +#define XR_LIST_STRUCT_XrGraphicsRequirementsOpenGLESKHR(_) \ + _(type) \ + _(next) \ + _(minApiVersionSupported) \ + _(maxApiVersionSupported) \ + +#define XR_LIST_STRUCT_XrGraphicsBindingVulkanKHR(_) \ + _(type) \ + _(next) \ + _(instance) \ + _(physicalDevice) \ + _(device) \ + _(queueFamilyIndex) \ + _(queueIndex) \ + +#define XR_LIST_STRUCT_XrSwapchainImageVulkanKHR(_) \ + _(type) \ + _(next) \ + _(image) \ + +#define XR_LIST_STRUCT_XrGraphicsRequirementsVulkanKHR(_) \ + _(type) \ + _(next) \ + _(minApiVersionSupported) \ + _(maxApiVersionSupported) \ + +#define XR_LIST_STRUCT_XrGraphicsBindingD3D11KHR(_) \ + _(type) \ + _(next) \ + _(device) \ + +#define XR_LIST_STRUCT_XrSwapchainImageD3D11KHR(_) \ + _(type) \ + _(next) \ + _(texture) \ + +#define XR_LIST_STRUCT_XrGraphicsRequirementsD3D11KHR(_) \ + _(type) \ + _(next) \ + _(adapterLuid) \ + _(minFeatureLevel) \ + +#define XR_LIST_STRUCT_XrGraphicsBindingD3D12KHR(_) \ + _(type) \ + _(next) \ + _(device) \ + _(queue) \ + +#define XR_LIST_STRUCT_XrSwapchainImageD3D12KHR(_) \ + _(type) \ + _(next) \ + _(texture) \ + +#define XR_LIST_STRUCT_XrGraphicsRequirementsD3D12KHR(_) \ + _(type) \ + _(next) \ + _(adapterLuid) \ + _(minFeatureLevel) \ + +#define XR_LIST_STRUCT_XrVisibilityMaskKHR(_) \ + _(type) \ + _(next) \ + _(vertexCapacityInput) \ + _(vertexCountOutput) \ + _(vertices) \ + _(indexCapacityInput) \ + _(indexCountOutput) \ + _(indices) \ + +#define XR_LIST_STRUCT_XrEventDataVisibilityMaskChangedKHR(_) \ + _(type) \ + _(next) \ + _(session) \ + _(viewConfigurationType) \ + _(viewIndex) \ + +#define XR_LIST_STRUCT_XrCompositionLayerColorScaleBiasKHR(_) \ + _(type) \ + _(next) \ + _(colorScale) \ + _(colorBias) \ + +#define XR_LIST_STRUCT_XrLoaderInitInfoBaseHeaderKHR(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrLoaderInitInfoAndroidKHR(_) \ + _(type) \ + _(next) \ + _(applicationVM) \ + _(applicationContext) \ + +#define XR_LIST_STRUCT_XrVulkanInstanceCreateInfoKHR(_) \ + _(type) \ + _(next) \ + _(systemId) \ + _(createFlags) \ + _(pfnGetInstanceProcAddr) \ + _(vulkanCreateInfo) \ + _(vulkanAllocator) \ + +#define XR_LIST_STRUCT_XrVulkanDeviceCreateInfoKHR(_) \ + _(type) \ + _(next) \ + _(systemId) \ + _(createFlags) \ + _(pfnGetInstanceProcAddr) \ + _(vulkanPhysicalDevice) \ + _(vulkanCreateInfo) \ + _(vulkanAllocator) \ + +#define XR_LIST_STRUCT_XrVulkanGraphicsDeviceGetInfoKHR(_) \ + _(type) \ + _(next) \ + _(systemId) \ + _(vulkanInstance) \ + +#define XR_LIST_STRUCT_XrCompositionLayerEquirect2KHR(_) \ + _(type) \ + _(next) \ + _(layerFlags) \ + _(space) \ + _(eyeVisibility) \ + _(subImage) \ + _(pose) \ + _(radius) \ + _(centralHorizontalAngle) \ + _(upperVerticalAngle) \ + _(lowerVerticalAngle) \ + +#define XR_LIST_STRUCT_XrBindingModificationBaseHeaderKHR(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrBindingModificationsKHR(_) \ + _(type) \ + _(next) \ + _(bindingModificationCount) \ + _(bindingModifications) \ + +#define XR_LIST_STRUCT_XrEventDataPerfSettingsEXT(_) \ + _(type) \ + _(next) \ + _(domain) \ + _(subDomain) \ + _(fromLevel) \ + _(toLevel) \ + +#define XR_LIST_STRUCT_XrDebugUtilsObjectNameInfoEXT(_) \ + _(type) \ + _(next) \ + _(objectType) \ + _(objectHandle) \ + _(objectName) \ + +#define XR_LIST_STRUCT_XrDebugUtilsLabelEXT(_) \ + _(type) \ + _(next) \ + _(labelName) \ + +#define XR_LIST_STRUCT_XrDebugUtilsMessengerCallbackDataEXT(_) \ + _(type) \ + _(next) \ + _(messageId) \ + _(functionName) \ + _(message) \ + _(objectCount) \ + _(objects) \ + _(sessionLabelCount) \ + _(sessionLabels) \ + +#define XR_LIST_STRUCT_XrDebugUtilsMessengerCreateInfoEXT(_) \ + _(type) \ + _(next) \ + _(messageSeverities) \ + _(messageTypes) \ + _(userCallback) \ + _(userData) \ + +#define XR_LIST_STRUCT_XrSystemEyeGazeInteractionPropertiesEXT(_) \ + _(type) \ + _(next) \ + _(supportsEyeGazeInteraction) \ + +#define XR_LIST_STRUCT_XrEyeGazeSampleTimeEXT(_) \ + _(type) \ + _(next) \ + _(time) \ + +#define XR_LIST_STRUCT_XrSessionCreateInfoOverlayEXTX(_) \ + _(type) \ + _(next) \ + _(createFlags) \ + _(sessionLayersPlacement) \ + +#define XR_LIST_STRUCT_XrEventDataMainSessionVisibilityChangedEXTX(_) \ + _(type) \ + _(next) \ + _(visible) \ + _(flags) \ + +#define XR_LIST_STRUCT_XrSpatialAnchorCreateInfoMSFT(_) \ + _(type) \ + _(next) \ + _(space) \ + _(pose) \ + _(time) \ + +#define XR_LIST_STRUCT_XrSpatialAnchorSpaceCreateInfoMSFT(_) \ + _(type) \ + _(next) \ + _(anchor) \ + _(poseInAnchorSpace) \ + +#define XR_LIST_STRUCT_XrCompositionLayerImageLayoutFB(_) \ + _(type) \ + _(next) \ + _(flags) \ + +#define XR_LIST_STRUCT_XrCompositionLayerAlphaBlendFB(_) \ + _(type) \ + _(next) \ + _(srcFactorColor) \ + _(dstFactorColor) \ + _(srcFactorAlpha) \ + _(dstFactorAlpha) \ + +#define XR_LIST_STRUCT_XrViewConfigurationDepthRangeEXT(_) \ + _(type) \ + _(next) \ + _(recommendedNearZ) \ + _(minNearZ) \ + _(recommendedFarZ) \ + _(maxFarZ) \ + +#define XR_LIST_STRUCT_XrGraphicsBindingEGLMNDX(_) \ + _(type) \ + _(next) \ + _(getProcAddress) \ + _(display) \ + _(config) \ + _(context) \ + +#define XR_LIST_STRUCT_XrSpatialGraphNodeSpaceCreateInfoMSFT(_) \ + _(type) \ + _(next) \ + _(nodeType) \ + _(nodeId) \ + _(pose) \ + +#define XR_LIST_STRUCT_XrSystemHandTrackingPropertiesEXT(_) \ + _(type) \ + _(next) \ + _(supportsHandTracking) \ + +#define XR_LIST_STRUCT_XrHandTrackerCreateInfoEXT(_) \ + _(type) \ + _(next) \ + _(hand) \ + _(handJointSet) \ + +#define XR_LIST_STRUCT_XrHandJointsLocateInfoEXT(_) \ + _(type) \ + _(next) \ + _(baseSpace) \ + _(time) \ + +#define XR_LIST_STRUCT_XrHandJointLocationEXT(_) \ + _(locationFlags) \ + _(pose) \ + _(radius) \ + +#define XR_LIST_STRUCT_XrHandJointVelocityEXT(_) \ + _(velocityFlags) \ + _(linearVelocity) \ + _(angularVelocity) \ + +#define XR_LIST_STRUCT_XrHandJointLocationsEXT(_) \ + _(type) \ + _(next) \ + _(isActive) \ + _(jointCount) \ + _(jointLocations) \ + +#define XR_LIST_STRUCT_XrHandJointVelocitiesEXT(_) \ + _(type) \ + _(next) \ + _(jointCount) \ + _(jointVelocities) \ + +#define XR_LIST_STRUCT_XrSystemHandTrackingMeshPropertiesMSFT(_) \ + _(type) \ + _(next) \ + _(supportsHandTrackingMesh) \ + _(maxHandMeshIndexCount) \ + _(maxHandMeshVertexCount) \ + +#define XR_LIST_STRUCT_XrHandMeshSpaceCreateInfoMSFT(_) \ + _(type) \ + _(next) \ + _(handPoseType) \ + _(poseInHandMeshSpace) \ + +#define XR_LIST_STRUCT_XrHandMeshUpdateInfoMSFT(_) \ + _(type) \ + _(next) \ + _(time) \ + _(handPoseType) \ + +#define XR_LIST_STRUCT_XrHandMeshIndexBufferMSFT(_) \ + _(indexBufferKey) \ + _(indexCapacityInput) \ + _(indexCountOutput) \ + _(indices) \ + +#define XR_LIST_STRUCT_XrHandMeshVertexMSFT(_) \ + _(position) \ + _(normal) \ + +#define XR_LIST_STRUCT_XrHandMeshVertexBufferMSFT(_) \ + _(vertexUpdateTime) \ + _(vertexCapacityInput) \ + _(vertexCountOutput) \ + _(vertices) \ + +#define XR_LIST_STRUCT_XrHandMeshMSFT(_) \ + _(type) \ + _(next) \ + _(isActive) \ + _(indexBufferChanged) \ + _(vertexBufferChanged) \ + _(indexBuffer) \ + _(vertexBuffer) \ + +#define XR_LIST_STRUCT_XrHandPoseTypeInfoMSFT(_) \ + _(type) \ + _(next) \ + _(handPoseType) \ + +#define XR_LIST_STRUCT_XrSecondaryViewConfigurationSessionBeginInfoMSFT(_) \ + _(type) \ + _(next) \ + _(viewConfigurationCount) \ + _(enabledViewConfigurationTypes) \ + +#define XR_LIST_STRUCT_XrSecondaryViewConfigurationStateMSFT(_) \ + _(type) \ + _(next) \ + _(viewConfigurationType) \ + _(active) \ + +#define XR_LIST_STRUCT_XrSecondaryViewConfigurationFrameStateMSFT(_) \ + _(type) \ + _(next) \ + _(viewConfigurationCount) \ + _(viewConfigurationStates) \ + +#define XR_LIST_STRUCT_XrSecondaryViewConfigurationLayerInfoMSFT(_) \ + _(type) \ + _(next) \ + _(viewConfigurationType) \ + _(environmentBlendMode) \ + _(layerCount) \ + _(layers) \ + +#define XR_LIST_STRUCT_XrSecondaryViewConfigurationFrameEndInfoMSFT(_) \ + _(type) \ + _(next) \ + _(viewConfigurationCount) \ + _(viewConfigurationLayersInfo) \ + +#define XR_LIST_STRUCT_XrSecondaryViewConfigurationSwapchainCreateInfoMSFT(_) \ + _(type) \ + _(next) \ + _(viewConfigurationType) \ + +#define XR_LIST_STRUCT_XrControllerModelKeyStateMSFT(_) \ + _(type) \ + _(next) \ + _(modelKey) \ + +#define XR_LIST_STRUCT_XrControllerModelNodePropertiesMSFT(_) \ + _(type) \ + _(next) \ + _(parentNodeName) \ + _(nodeName) \ + +#define XR_LIST_STRUCT_XrControllerModelPropertiesMSFT(_) \ + _(type) \ + _(next) \ + _(nodeCapacityInput) \ + _(nodeCountOutput) \ + _(nodeProperties) \ + +#define XR_LIST_STRUCT_XrControllerModelNodeStateMSFT(_) \ + _(type) \ + _(next) \ + _(nodePose) \ + +#define XR_LIST_STRUCT_XrControllerModelStateMSFT(_) \ + _(type) \ + _(next) \ + _(nodeCapacityInput) \ + _(nodeCountOutput) \ + _(nodeStates) \ + +#define XR_LIST_STRUCT_XrViewConfigurationViewFovEPIC(_) \ + _(type) \ + _(next) \ + _(recommendedFov) \ + _(maxMutableFov) \ + +#define XR_LIST_STRUCT_XrHolographicWindowAttachmentMSFT(_) \ + _(type) \ + _(next) \ + _(holographicSpace) \ + _(coreWindow) \ + +#define XR_LIST_STRUCT_XrCompositionLayerReprojectionInfoMSFT(_) \ + _(type) \ + _(next) \ + _(reprojectionMode) \ + +#define XR_LIST_STRUCT_XrCompositionLayerReprojectionPlaneOverrideMSFT(_) \ + _(type) \ + _(next) \ + _(position) \ + _(normal) \ + _(velocity) \ + +#define XR_LIST_STRUCT_XrAndroidSurfaceSwapchainCreateInfoFB(_) \ + _(type) \ + _(next) \ + _(createFlags) \ + +#define XR_LIST_STRUCT_XrSwapchainStateBaseHeaderFB(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrCompositionLayerSecureContentFB(_) \ + _(type) \ + _(next) \ + _(flags) \ + +#define XR_LIST_STRUCT_XrInteractionProfileAnalogThresholdVALVE(_) \ + _(type) \ + _(next) \ + _(action) \ + _(binding) \ + _(onThreshold) \ + _(offThreshold) \ + _(onHaptic) \ + _(offHaptic) \ + +#define XR_LIST_STRUCT_XrHandJointsMotionRangeInfoEXT(_) \ + _(type) \ + _(next) \ + _(handJointsMotionRange) \ + +#define XR_LIST_STRUCT_XrUuidMSFT(_) \ + _(bytes) \ + +#define XR_LIST_STRUCT_XrSceneObserverCreateInfoMSFT(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrSceneCreateInfoMSFT(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrSceneSphereBoundMSFT(_) \ + _(center) \ + _(radius) \ + +#define XR_LIST_STRUCT_XrSceneOrientedBoxBoundMSFT(_) \ + _(pose) \ + _(extents) \ + +#define XR_LIST_STRUCT_XrSceneFrustumBoundMSFT(_) \ + _(pose) \ + _(fov) \ + _(farDistance) \ + +#define XR_LIST_STRUCT_XrSceneBoundsMSFT(_) \ + _(space) \ + _(time) \ + _(sphereCount) \ + _(spheres) \ + _(boxCount) \ + _(boxes) \ + _(frustumCount) \ + _(frustums) \ + +#define XR_LIST_STRUCT_XrNewSceneComputeInfoMSFT(_) \ + _(type) \ + _(next) \ + _(requestedFeatureCount) \ + _(requestedFeatures) \ + _(consistency) \ + _(bounds) \ + +#define XR_LIST_STRUCT_XrVisualMeshComputeLodInfoMSFT(_) \ + _(type) \ + _(next) \ + _(lod) \ + +#define XR_LIST_STRUCT_XrSceneComponentMSFT(_) \ + _(componentType) \ + _(id) \ + _(parentId) \ + _(updateTime) \ + +#define XR_LIST_STRUCT_XrSceneComponentsMSFT(_) \ + _(type) \ + _(next) \ + _(componentCapacityInput) \ + _(componentCountOutput) \ + _(components) \ + +#define XR_LIST_STRUCT_XrSceneComponentsGetInfoMSFT(_) \ + _(type) \ + _(next) \ + _(componentType) \ + +#define XR_LIST_STRUCT_XrSceneComponentLocationMSFT(_) \ + _(flags) \ + _(pose) \ + +#define XR_LIST_STRUCT_XrSceneComponentLocationsMSFT(_) \ + _(type) \ + _(next) \ + _(locationCount) \ + _(locations) \ + +#define XR_LIST_STRUCT_XrSceneComponentsLocateInfoMSFT(_) \ + _(type) \ + _(next) \ + _(baseSpace) \ + _(time) \ + _(componentIdCount) \ + _(componentIds) \ + +#define XR_LIST_STRUCT_XrSceneObjectMSFT(_) \ + _(objectType) \ + +#define XR_LIST_STRUCT_XrSceneObjectsMSFT(_) \ + _(type) \ + _(next) \ + _(sceneObjectCount) \ + _(sceneObjects) \ + +#define XR_LIST_STRUCT_XrSceneComponentParentFilterInfoMSFT(_) \ + _(type) \ + _(next) \ + _(parentId) \ + +#define XR_LIST_STRUCT_XrSceneObjectTypesFilterInfoMSFT(_) \ + _(type) \ + _(next) \ + _(objectTypeCount) \ + _(objectTypes) \ + +#define XR_LIST_STRUCT_XrScenePlaneMSFT(_) \ + _(alignment) \ + _(size) \ + _(meshBufferId) \ + _(supportsIndicesUint16) \ + +#define XR_LIST_STRUCT_XrScenePlanesMSFT(_) \ + _(type) \ + _(next) \ + _(scenePlaneCount) \ + _(scenePlanes) \ + +#define XR_LIST_STRUCT_XrScenePlaneAlignmentFilterInfoMSFT(_) \ + _(type) \ + _(next) \ + _(alignmentCount) \ + _(alignments) \ + +#define XR_LIST_STRUCT_XrSceneMeshMSFT(_) \ + _(meshBufferId) \ + _(supportsIndicesUint16) \ + +#define XR_LIST_STRUCT_XrSceneMeshesMSFT(_) \ + _(type) \ + _(next) \ + _(sceneMeshCount) \ + _(sceneMeshes) \ + +#define XR_LIST_STRUCT_XrSceneMeshBuffersGetInfoMSFT(_) \ + _(type) \ + _(next) \ + _(meshBufferId) \ + +#define XR_LIST_STRUCT_XrSceneMeshBuffersMSFT(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrSceneMeshVertexBufferMSFT(_) \ + _(type) \ + _(next) \ + _(vertexCapacityInput) \ + _(vertexCountOutput) \ + _(vertices) \ + +#define XR_LIST_STRUCT_XrSceneMeshIndicesUint32MSFT(_) \ + _(type) \ + _(next) \ + _(indexCapacityInput) \ + _(indexCountOutput) \ + _(indices) \ + +#define XR_LIST_STRUCT_XrSceneMeshIndicesUint16MSFT(_) \ + _(type) \ + _(next) \ + _(indexCapacityInput) \ + _(indexCountOutput) \ + _(indices) \ + +#define XR_LIST_STRUCT_XrSerializedSceneFragmentDataGetInfoMSFT(_) \ + _(type) \ + _(next) \ + _(sceneFragmentId) \ + +#define XR_LIST_STRUCT_XrDeserializeSceneFragmentMSFT(_) \ + _(bufferSize) \ + _(buffer) \ + +#define XR_LIST_STRUCT_XrSceneDeserializeInfoMSFT(_) \ + _(type) \ + _(next) \ + _(fragmentCount) \ + _(fragments) \ + +#define XR_LIST_STRUCT_XrEventDataDisplayRefreshRateChangedFB(_) \ + _(type) \ + _(next) \ + _(fromDisplayRefreshRate) \ + _(toDisplayRefreshRate) \ + +#define XR_LIST_STRUCT_XrSystemExpressionPropertiesHTC(_) \ + _(type) \ + _(next) \ + _(supportEyeExpression) \ + _(supportLipExpression) \ + _(maxBlendShapesCount) \ + +#define XR_LIST_STRUCT_XrExpressionDataHTC(_) \ + _(type) \ + _(next) \ + _(sampleTime) \ + _(blendShapesCapacityInput) \ + _(blendShapesCountOutput) \ + _(blendShapeWeightings) \ + +#define XR_LIST_STRUCT_XrExpressionCreateInfoHTC(_) \ + _(type) \ + _(next) \ + _(expressionType) \ + +#define XR_LIST_STRUCT_XrSystemColorSpacePropertiesFB(_) \ + _(type) \ + _(next) \ + _(colorSpace) \ + +#define XR_LIST_STRUCT_XrFoveationProfileCreateInfoFB(_) \ + _(type) \ + _(next) \ + +#define XR_LIST_STRUCT_XrSwapchainCreateInfoFoveationFB(_) \ + _(type) \ + _(next) \ + _(flags) \ + +#define XR_LIST_STRUCT_XrSwapchainStateFoveationFB(_) \ + _(type) \ + _(next) \ + _(flags) \ + _(profile) \ + +#define XR_LIST_STRUCT_XrFoveationLevelProfileCreateInfoFB(_) \ + _(type) \ + _(next) \ + _(level) \ + _(verticalOffset) \ + _(dynamic) \ + +#define XR_LIST_STRUCT_XrViewLocateFoveatedRenderingVARJO(_) \ + _(type) \ + _(next) \ + _(foveatedRenderingActive) \ + +#define XR_LIST_STRUCT_XrFoveatedViewConfigurationViewVARJO(_) \ + _(type) \ + _(next) \ + _(foveatedRenderingActive) \ + +#define XR_LIST_STRUCT_XrSystemFoveatedRenderingPropertiesVARJO(_) \ + _(type) \ + _(next) \ + _(supportsFoveatedRendering) \ + +#define XR_LIST_STRUCT_XrCompositionLayerDepthTestVARJO(_) \ + _(type) \ + _(next) \ + _(depthTestRangeNearZ) \ + _(depthTestRangeFarZ) \ + +#define XR_LIST_STRUCT_XrSpatialAnchorPersistenceNameMSFT(_) \ + _(name) \ + +#define XR_LIST_STRUCT_XrSpatialAnchorPersistenceInfoMSFT(_) \ + _(type) \ + _(next) \ + _(spatialAnchorPersistenceName) \ + _(spatialAnchor) \ + +#define XR_LIST_STRUCT_XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT(_) \ + _(type) \ + _(next) \ + _(spatialAnchorStore) \ + _(spatialAnchorPersistenceName) \ + +#define XR_LIST_STRUCT_XrSwapchainImageFoveationVulkanFB(_) \ + _(type) \ + _(next) \ + _(image) \ + _(width) \ + _(height) \ + +#define XR_LIST_STRUCT_XrSwapchainStateAndroidSurfaceDimensionsFB(_) \ + _(type) \ + _(next) \ + _(width) \ + _(height) \ + +#define XR_LIST_STRUCT_XrSwapchainStateSamplerOpenGLESFB(_) \ + _(type) \ + _(next) \ + _(minFilter) \ + _(magFilter) \ + _(wrapModeS) \ + _(wrapModeT) \ + _(swizzleRed) \ + _(swizzleGreen) \ + _(swizzleBlue) \ + _(swizzleAlpha) \ + _(maxAnisotropy) \ + _(borderColor) \ + +#define XR_LIST_STRUCT_XrSwapchainStateSamplerVulkanFB(_) \ + _(type) \ + _(next) \ + _(minFilter) \ + _(magFilter) \ + _(mipmapMode) \ + _(wrapModeS) \ + _(wrapModeT) \ + _(swizzleRed) \ + _(swizzleGreen) \ + _(swizzleBlue) \ + _(swizzleAlpha) \ + _(maxAnisotropy) \ + _(borderColor) \ + + + +#define XR_LIST_STRUCTURE_TYPES_CORE(_) \ + _(XrApiLayerProperties, XR_TYPE_API_LAYER_PROPERTIES) \ + _(XrExtensionProperties, XR_TYPE_EXTENSION_PROPERTIES) \ + _(XrInstanceCreateInfo, XR_TYPE_INSTANCE_CREATE_INFO) \ + _(XrInstanceProperties, XR_TYPE_INSTANCE_PROPERTIES) \ + _(XrEventDataBuffer, XR_TYPE_EVENT_DATA_BUFFER) \ + _(XrSystemGetInfo, XR_TYPE_SYSTEM_GET_INFO) \ + _(XrSystemProperties, XR_TYPE_SYSTEM_PROPERTIES) \ + _(XrSessionCreateInfo, XR_TYPE_SESSION_CREATE_INFO) \ + _(XrSpaceVelocity, XR_TYPE_SPACE_VELOCITY) \ + _(XrReferenceSpaceCreateInfo, XR_TYPE_REFERENCE_SPACE_CREATE_INFO) \ + _(XrActionSpaceCreateInfo, XR_TYPE_ACTION_SPACE_CREATE_INFO) \ + _(XrSpaceLocation, XR_TYPE_SPACE_LOCATION) \ + _(XrViewConfigurationProperties, XR_TYPE_VIEW_CONFIGURATION_PROPERTIES) \ + _(XrViewConfigurationView, XR_TYPE_VIEW_CONFIGURATION_VIEW) \ + _(XrSwapchainCreateInfo, XR_TYPE_SWAPCHAIN_CREATE_INFO) \ + _(XrSwapchainImageAcquireInfo, XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO) \ + _(XrSwapchainImageWaitInfo, XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO) \ + _(XrSwapchainImageReleaseInfo, XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO) \ + _(XrSessionBeginInfo, XR_TYPE_SESSION_BEGIN_INFO) \ + _(XrFrameWaitInfo, XR_TYPE_FRAME_WAIT_INFO) \ + _(XrFrameState, XR_TYPE_FRAME_STATE) \ + _(XrFrameBeginInfo, XR_TYPE_FRAME_BEGIN_INFO) \ + _(XrFrameEndInfo, XR_TYPE_FRAME_END_INFO) \ + _(XrViewLocateInfo, XR_TYPE_VIEW_LOCATE_INFO) \ + _(XrViewState, XR_TYPE_VIEW_STATE) \ + _(XrView, XR_TYPE_VIEW) \ + _(XrActionSetCreateInfo, XR_TYPE_ACTION_SET_CREATE_INFO) \ + _(XrActionCreateInfo, XR_TYPE_ACTION_CREATE_INFO) \ + _(XrInteractionProfileSuggestedBinding, XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING) \ + _(XrSessionActionSetsAttachInfo, XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO) \ + _(XrInteractionProfileState, XR_TYPE_INTERACTION_PROFILE_STATE) \ + _(XrActionStateGetInfo, XR_TYPE_ACTION_STATE_GET_INFO) \ + _(XrActionStateBoolean, XR_TYPE_ACTION_STATE_BOOLEAN) \ + _(XrActionStateFloat, XR_TYPE_ACTION_STATE_FLOAT) \ + _(XrActionStateVector2f, XR_TYPE_ACTION_STATE_VECTOR2F) \ + _(XrActionStatePose, XR_TYPE_ACTION_STATE_POSE) \ + _(XrActionsSyncInfo, XR_TYPE_ACTIONS_SYNC_INFO) \ + _(XrBoundSourcesForActionEnumerateInfo, XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO) \ + _(XrInputSourceLocalizedNameGetInfo, XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO) \ + _(XrHapticActionInfo, XR_TYPE_HAPTIC_ACTION_INFO) \ + _(XrCompositionLayerProjectionView, XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW) \ + _(XrCompositionLayerProjection, XR_TYPE_COMPOSITION_LAYER_PROJECTION) \ + _(XrCompositionLayerQuad, XR_TYPE_COMPOSITION_LAYER_QUAD) \ + _(XrEventDataEventsLost, XR_TYPE_EVENT_DATA_EVENTS_LOST) \ + _(XrEventDataInstanceLossPending, XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING) \ + _(XrEventDataSessionStateChanged, XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED) \ + _(XrEventDataReferenceSpaceChangePending, XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING) \ + _(XrEventDataInteractionProfileChanged, XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED) \ + _(XrHapticVibration, XR_TYPE_HAPTIC_VIBRATION) \ + _(XrCompositionLayerCubeKHR, XR_TYPE_COMPOSITION_LAYER_CUBE_KHR) \ + _(XrCompositionLayerDepthInfoKHR, XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR) \ + _(XrCompositionLayerCylinderKHR, XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR) \ + _(XrCompositionLayerEquirectKHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR) \ + _(XrVisibilityMaskKHR, XR_TYPE_VISIBILITY_MASK_KHR) \ + _(XrEventDataVisibilityMaskChangedKHR, XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR) \ + _(XrCompositionLayerColorScaleBiasKHR, XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR) \ + _(XrCompositionLayerEquirect2KHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR) \ + _(XrBindingModificationsKHR, XR_TYPE_BINDING_MODIFICATIONS_KHR) \ + _(XrEventDataPerfSettingsEXT, XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT) \ + _(XrDebugUtilsObjectNameInfoEXT, XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT) \ + _(XrDebugUtilsLabelEXT, XR_TYPE_DEBUG_UTILS_LABEL_EXT) \ + _(XrDebugUtilsMessengerCallbackDataEXT, XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT) \ + _(XrDebugUtilsMessengerCreateInfoEXT, XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT) \ + _(XrSystemEyeGazeInteractionPropertiesEXT, XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT) \ + _(XrEyeGazeSampleTimeEXT, XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT) \ + _(XrSessionCreateInfoOverlayEXTX, XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX) \ + _(XrEventDataMainSessionVisibilityChangedEXTX, XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX) \ + _(XrSpatialAnchorCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT) \ + _(XrSpatialAnchorSpaceCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT) \ + _(XrCompositionLayerImageLayoutFB, XR_TYPE_COMPOSITION_LAYER_IMAGE_LAYOUT_FB) \ + _(XrCompositionLayerAlphaBlendFB, XR_TYPE_COMPOSITION_LAYER_ALPHA_BLEND_FB) \ + _(XrViewConfigurationDepthRangeEXT, XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT) \ + _(XrSpatialGraphNodeSpaceCreateInfoMSFT, XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT) \ + _(XrSystemHandTrackingPropertiesEXT, XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT) \ + _(XrHandTrackerCreateInfoEXT, XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT) \ + _(XrHandJointsLocateInfoEXT, XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT) \ + _(XrHandJointLocationsEXT, XR_TYPE_HAND_JOINT_LOCATIONS_EXT) \ + _(XrHandJointVelocitiesEXT, XR_TYPE_HAND_JOINT_VELOCITIES_EXT) \ + _(XrSystemHandTrackingMeshPropertiesMSFT, XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT) \ + _(XrHandMeshSpaceCreateInfoMSFT, XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT) \ + _(XrHandMeshUpdateInfoMSFT, XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT) \ + _(XrHandMeshMSFT, XR_TYPE_HAND_MESH_MSFT) \ + _(XrHandPoseTypeInfoMSFT, XR_TYPE_HAND_POSE_TYPE_INFO_MSFT) \ + _(XrSecondaryViewConfigurationSessionBeginInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT) \ + _(XrSecondaryViewConfigurationStateMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT) \ + _(XrSecondaryViewConfigurationFrameStateMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT) \ + _(XrSecondaryViewConfigurationLayerInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT) \ + _(XrSecondaryViewConfigurationFrameEndInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT) \ + _(XrSecondaryViewConfigurationSwapchainCreateInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT) \ + _(XrControllerModelKeyStateMSFT, XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT) \ + _(XrControllerModelNodePropertiesMSFT, XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT) \ + _(XrControllerModelPropertiesMSFT, XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT) \ + _(XrControllerModelNodeStateMSFT, XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT) \ + _(XrControllerModelStateMSFT, XR_TYPE_CONTROLLER_MODEL_STATE_MSFT) \ + _(XrViewConfigurationViewFovEPIC, XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC) \ + _(XrCompositionLayerReprojectionInfoMSFT, XR_TYPE_COMPOSITION_LAYER_REPROJECTION_INFO_MSFT) \ + _(XrCompositionLayerReprojectionPlaneOverrideMSFT, XR_TYPE_COMPOSITION_LAYER_REPROJECTION_PLANE_OVERRIDE_MSFT) \ + _(XrCompositionLayerSecureContentFB, XR_TYPE_COMPOSITION_LAYER_SECURE_CONTENT_FB) \ + _(XrInteractionProfileAnalogThresholdVALVE, XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE) \ + _(XrHandJointsMotionRangeInfoEXT, XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT) \ + _(XrSceneObserverCreateInfoMSFT, XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT) \ + _(XrSceneCreateInfoMSFT, XR_TYPE_SCENE_CREATE_INFO_MSFT) \ + _(XrNewSceneComputeInfoMSFT, XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT) \ + _(XrVisualMeshComputeLodInfoMSFT, XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT) \ + _(XrSceneComponentsMSFT, XR_TYPE_SCENE_COMPONENTS_MSFT) \ + _(XrSceneComponentsGetInfoMSFT, XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT) \ + _(XrSceneComponentLocationsMSFT, XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT) \ + _(XrSceneComponentsLocateInfoMSFT, XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT) \ + _(XrSceneObjectsMSFT, XR_TYPE_SCENE_OBJECTS_MSFT) \ + _(XrSceneComponentParentFilterInfoMSFT, XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT) \ + _(XrSceneObjectTypesFilterInfoMSFT, XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT) \ + _(XrScenePlanesMSFT, XR_TYPE_SCENE_PLANES_MSFT) \ + _(XrScenePlaneAlignmentFilterInfoMSFT, XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT) \ + _(XrSceneMeshesMSFT, XR_TYPE_SCENE_MESHES_MSFT) \ + _(XrSceneMeshBuffersGetInfoMSFT, XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT) \ + _(XrSceneMeshBuffersMSFT, XR_TYPE_SCENE_MESH_BUFFERS_MSFT) \ + _(XrSceneMeshVertexBufferMSFT, XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT) \ + _(XrSceneMeshIndicesUint32MSFT, XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT) \ + _(XrSceneMeshIndicesUint16MSFT, XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT) \ + _(XrSerializedSceneFragmentDataGetInfoMSFT, XR_TYPE_SERIALIZED_SCENE_FRAGMENT_DATA_GET_INFO_MSFT) \ + _(XrSceneDeserializeInfoMSFT, XR_TYPE_SCENE_DESERIALIZE_INFO_MSFT) \ + _(XrEventDataDisplayRefreshRateChangedFB, XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB) \ + _(XrSystemExpressionPropertiesHTC, XR_TYPE_SYSTEM_EXPRESSION_PROPERTIES_HTC) \ + _(XrExpressionDataHTC, XR_TYPE_EXPRESSION_DATA_HTC) \ + _(XrExpressionCreateInfoHTC, XR_TYPE_EXPRESSION_CREATE_INFO_HTC) \ + _(XrSystemColorSpacePropertiesFB, XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB) \ + _(XrFoveationProfileCreateInfoFB, XR_TYPE_FOVEATION_PROFILE_CREATE_INFO_FB) \ + _(XrSwapchainCreateInfoFoveationFB, XR_TYPE_SWAPCHAIN_CREATE_INFO_FOVEATION_FB) \ + _(XrSwapchainStateFoveationFB, XR_TYPE_SWAPCHAIN_STATE_FOVEATION_FB) \ + _(XrFoveationLevelProfileCreateInfoFB, XR_TYPE_FOVEATION_LEVEL_PROFILE_CREATE_INFO_FB) \ + _(XrViewLocateFoveatedRenderingVARJO, XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO) \ + _(XrFoveatedViewConfigurationViewVARJO, XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO) \ + _(XrSystemFoveatedRenderingPropertiesVARJO, XR_TYPE_SYSTEM_FOVEATED_RENDERING_PROPERTIES_VARJO) \ + _(XrCompositionLayerDepthTestVARJO, XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_VARJO) \ + _(XrSpatialAnchorPersistenceInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_PERSISTENCE_INFO_MSFT) \ + _(XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_FROM_PERSISTED_ANCHOR_CREATE_INFO_MSFT) \ + + + + +#if defined(XR_USE_GRAPHICS_API_D3D11) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_) \ + _(XrGraphicsBindingD3D11KHR, XR_TYPE_GRAPHICS_BINDING_D3D11_KHR) \ + _(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ + _(XrGraphicsRequirementsD3D11KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_) +#endif + +#if defined(XR_USE_GRAPHICS_API_D3D12) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_) \ + _(XrGraphicsBindingD3D12KHR, XR_TYPE_GRAPHICS_BINDING_D3D12_KHR) \ + _(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ + _(XrGraphicsRequirementsD3D12KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_) +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_) \ + _(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ + _(XrGraphicsRequirementsOpenGLKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_) +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_WAYLAND) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_) \ + _(XrGraphicsBindingOpenGLWaylandKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_) +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_WIN32) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_) \ + _(XrGraphicsBindingOpenGLWin32KHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_) +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_XCB) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_) \ + _(XrGraphicsBindingOpenGLXcbKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_) +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_XLIB) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_) \ + _(XrGraphicsBindingOpenGLXlibKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_) +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL_ES) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_) \ + _(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ + _(XrGraphicsRequirementsOpenGLESKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR) \ + _(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_) +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL_ES) && defined(XR_USE_PLATFORM_ANDROID) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_) \ + _(XrGraphicsBindingOpenGLESAndroidKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_) +#endif + +#if defined(XR_USE_GRAPHICS_API_VULKAN) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_) \ + _(XrVulkanSwapchainFormatListCreateInfoKHR, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR) \ + _(XrGraphicsBindingVulkanKHR, XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR) \ + _(XrSwapchainImageVulkanKHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR) \ + _(XrGraphicsRequirementsVulkanKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR) \ + _(XrVulkanInstanceCreateInfoKHR, XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR) \ + _(XrVulkanDeviceCreateInfoKHR, XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR) \ + _(XrVulkanGraphicsDeviceGetInfoKHR, XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR) \ + _(XrSwapchainImageFoveationVulkanFB, XR_TYPE_SWAPCHAIN_IMAGE_FOVEATION_VULKAN_FB) \ + _(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_) +#endif + +#if defined(XR_USE_PLATFORM_ANDROID) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_) \ + _(XrInstanceCreateInfoAndroidKHR, XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR) \ + _(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ + _(XrAndroidSurfaceSwapchainCreateInfoFB, XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB) \ + _(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_) +#endif + +#if defined(XR_USE_PLATFORM_EGL) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_) \ + _(XrGraphicsBindingEGLMNDX, XR_TYPE_GRAPHICS_BINDING_EGL_MNDX) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_) +#endif + +#if defined(XR_USE_PLATFORM_WIN32) +#define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_) \ + _(XrHolographicWindowAttachmentMSFT, XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT) \ + + +#else +#define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_) +#endif + +#define XR_LIST_STRUCTURE_TYPES(_) \ + XR_LIST_STRUCTURE_TYPES_CORE(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_) \ + + +#define XR_LIST_EXTENSIONS(_) \ + _(XR_KHR_android_thread_settings, 4) \ + _(XR_KHR_android_surface_swapchain, 5) \ + _(XR_KHR_composition_layer_cube, 7) \ + _(XR_KHR_android_create_instance, 9) \ + _(XR_KHR_composition_layer_depth, 11) \ + _(XR_KHR_vulkan_swapchain_format_list, 15) \ + _(XR_EXT_performance_settings, 16) \ + _(XR_EXT_thermal_query, 17) \ + _(XR_KHR_composition_layer_cylinder, 18) \ + _(XR_KHR_composition_layer_equirect, 19) \ + _(XR_EXT_debug_utils, 20) \ + _(XR_KHR_opengl_enable, 24) \ + _(XR_KHR_opengl_es_enable, 25) \ + _(XR_KHR_vulkan_enable, 26) \ + _(XR_KHR_D3D11_enable, 28) \ + _(XR_KHR_D3D12_enable, 29) \ + _(XR_EXT_eye_gaze_interaction, 31) \ + _(XR_KHR_visibility_mask, 32) \ + _(XR_EXTX_overlay, 34) \ + _(XR_KHR_composition_layer_color_scale_bias, 35) \ + _(XR_KHR_win32_convert_performance_counter_time, 36) \ + _(XR_KHR_convert_timespec_time, 37) \ + _(XR_VARJO_quad_views, 38) \ + _(XR_MSFT_unbounded_reference_space, 39) \ + _(XR_MSFT_spatial_anchor, 40) \ + _(XR_FB_composition_layer_image_layout, 41) \ + _(XR_FB_composition_layer_alpha_blend, 42) \ + _(XR_MND_headless, 43) \ + _(XR_OCULUS_android_session_state_enable, 45) \ + _(XR_EXT_view_configuration_depth_range, 47) \ + _(XR_EXT_conformance_automation, 48) \ + _(XR_MNDX_egl_enable, 49) \ + _(XR_MSFT_spatial_graph_bridge, 50) \ + _(XR_MSFT_hand_interaction, 51) \ + _(XR_EXT_hand_tracking, 52) \ + _(XR_MSFT_hand_tracking_mesh, 53) \ + _(XR_MSFT_secondary_view_configuration, 54) \ + _(XR_MSFT_first_person_observer, 55) \ + _(XR_MSFT_controller_model, 56) \ + _(XR_MSFT_perception_anchor_interop, 57) \ + _(XR_EXT_win32_appcontainer_compatible, 58) \ + _(XR_EPIC_view_configuration_fov, 60) \ + _(XR_MSFT_holographic_window_attachment, 64) \ + _(XR_MSFT_composition_layer_reprojection, 67) \ + _(XR_HUAWEI_controller_interaction, 70) \ + _(XR_FB_android_surface_swapchain_create, 71) \ + _(XR_FB_swapchain_update_state, 72) \ + _(XR_FB_composition_layer_secure_content, 73) \ + _(XR_VALVE_analog_threshold, 80) \ + _(XR_EXT_hand_joints_motion_range, 81) \ + _(XR_KHR_loader_init, 89) \ + _(XR_KHR_loader_init_android, 90) \ + _(XR_KHR_vulkan_enable2, 91) \ + _(XR_KHR_composition_layer_equirect2, 92) \ + _(XR_EXT_samsung_odyssey_controller, 95) \ + _(XR_EXT_hp_mixed_reality_controller, 96) \ + _(XR_MND_swapchain_usage_input_attachment_bit, 97) \ + _(XR_MSFT_scene_understanding, 98) \ + _(XR_MSFT_scene_understanding_serialization, 99) \ + _(XR_FB_display_refresh_rate, 102) \ + _(XR_HTC_vive_cosmos_controller_interaction, 103) \ + _(XR_HTC_facial_expression, 105) \ + _(XR_FB_color_space, 109) \ + _(XR_FB_foveation, 115) \ + _(XR_FB_foveation_configuration, 116) \ + _(XR_KHR_binding_modification, 121) \ + _(XR_VARJO_foveated_rendering, 122) \ + _(XR_VARJO_composition_layer_depth_test, 123) \ + _(XR_VARJO_environment_depth_estimation, 124) \ + _(XR_MSFT_spatial_anchor_persistence, 143) \ + _(XR_OCULUS_audio_device_guid, 160) \ + _(XR_FB_foveation_vulkan, 161) \ + _(XR_FB_swapchain_update_state_android_surface, 162) \ + _(XR_FB_swapchain_update_state_opengl_es, 163) \ + _(XR_FB_swapchain_update_state_vulkan, 164) \ + _(XR_KHR_swapchain_usage_input_attachment_bit, 166) \ + + +#endif + diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/xr_generated_dispatch_table.c b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/xr_generated_dispatch_table.c new file mode 100644 index 0000000..93a7014 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/xr_generated_dispatch_table.c @@ -0,0 +1,277 @@ +// Copyright (c) 2017-2021, The Khronos Group Inc. +// Copyright (c) 2017-2019 Valve Corporation +// Copyright (c) 2017-2019 LunarG, Inc. +// SPDX-License-Identifier: Apache-2.0 OR MIT +// *********** THIS FILE IS GENERATED - DO NOT EDIT *********** +// See utility_source_generator.py for modifications +// ************************************************************ + +// Copyright (c) 2017-2021, The Khronos Group Inc. +// Copyright (c) 2017-2019 Valve Corporation +// Copyright (c) 2017-2019 LunarG, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Author: Mark Young +// + +#include "xr_generated_dispatch_table.h" +#include "common/xr_dependencies.h" +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif +// Helper function to populate an instance dispatch table +void GeneratedXrPopulateDispatchTable(struct XrGeneratedDispatchTable *table, + XrInstance instance, + PFN_xrGetInstanceProcAddr get_inst_proc_addr) { + + // ---- Core 1.0 commands + table->GetInstanceProcAddr = get_inst_proc_addr; + (get_inst_proc_addr(instance, "xrCreateInstance", (PFN_xrVoidFunction*)&table->CreateInstance)); + (get_inst_proc_addr(instance, "xrDestroyInstance", (PFN_xrVoidFunction*)&table->DestroyInstance)); + (get_inst_proc_addr(instance, "xrGetInstanceProperties", (PFN_xrVoidFunction*)&table->GetInstanceProperties)); + (get_inst_proc_addr(instance, "xrPollEvent", (PFN_xrVoidFunction*)&table->PollEvent)); + (get_inst_proc_addr(instance, "xrResultToString", (PFN_xrVoidFunction*)&table->ResultToString)); + (get_inst_proc_addr(instance, "xrStructureTypeToString", (PFN_xrVoidFunction*)&table->StructureTypeToString)); + (get_inst_proc_addr(instance, "xrGetSystem", (PFN_xrVoidFunction*)&table->GetSystem)); + (get_inst_proc_addr(instance, "xrGetSystemProperties", (PFN_xrVoidFunction*)&table->GetSystemProperties)); + (get_inst_proc_addr(instance, "xrEnumerateEnvironmentBlendModes", (PFN_xrVoidFunction*)&table->EnumerateEnvironmentBlendModes)); + (get_inst_proc_addr(instance, "xrCreateSession", (PFN_xrVoidFunction*)&table->CreateSession)); + (get_inst_proc_addr(instance, "xrDestroySession", (PFN_xrVoidFunction*)&table->DestroySession)); + (get_inst_proc_addr(instance, "xrEnumerateReferenceSpaces", (PFN_xrVoidFunction*)&table->EnumerateReferenceSpaces)); + (get_inst_proc_addr(instance, "xrCreateReferenceSpace", (PFN_xrVoidFunction*)&table->CreateReferenceSpace)); + (get_inst_proc_addr(instance, "xrGetReferenceSpaceBoundsRect", (PFN_xrVoidFunction*)&table->GetReferenceSpaceBoundsRect)); + (get_inst_proc_addr(instance, "xrCreateActionSpace", (PFN_xrVoidFunction*)&table->CreateActionSpace)); + (get_inst_proc_addr(instance, "xrLocateSpace", (PFN_xrVoidFunction*)&table->LocateSpace)); + (get_inst_proc_addr(instance, "xrDestroySpace", (PFN_xrVoidFunction*)&table->DestroySpace)); + (get_inst_proc_addr(instance, "xrEnumerateViewConfigurations", (PFN_xrVoidFunction*)&table->EnumerateViewConfigurations)); + (get_inst_proc_addr(instance, "xrGetViewConfigurationProperties", (PFN_xrVoidFunction*)&table->GetViewConfigurationProperties)); + (get_inst_proc_addr(instance, "xrEnumerateViewConfigurationViews", (PFN_xrVoidFunction*)&table->EnumerateViewConfigurationViews)); + (get_inst_proc_addr(instance, "xrEnumerateSwapchainFormats", (PFN_xrVoidFunction*)&table->EnumerateSwapchainFormats)); + (get_inst_proc_addr(instance, "xrCreateSwapchain", (PFN_xrVoidFunction*)&table->CreateSwapchain)); + (get_inst_proc_addr(instance, "xrDestroySwapchain", (PFN_xrVoidFunction*)&table->DestroySwapchain)); + (get_inst_proc_addr(instance, "xrEnumerateSwapchainImages", (PFN_xrVoidFunction*)&table->EnumerateSwapchainImages)); + (get_inst_proc_addr(instance, "xrAcquireSwapchainImage", (PFN_xrVoidFunction*)&table->AcquireSwapchainImage)); + (get_inst_proc_addr(instance, "xrWaitSwapchainImage", (PFN_xrVoidFunction*)&table->WaitSwapchainImage)); + (get_inst_proc_addr(instance, "xrReleaseSwapchainImage", (PFN_xrVoidFunction*)&table->ReleaseSwapchainImage)); + (get_inst_proc_addr(instance, "xrBeginSession", (PFN_xrVoidFunction*)&table->BeginSession)); + (get_inst_proc_addr(instance, "xrEndSession", (PFN_xrVoidFunction*)&table->EndSession)); + (get_inst_proc_addr(instance, "xrRequestExitSession", (PFN_xrVoidFunction*)&table->RequestExitSession)); + (get_inst_proc_addr(instance, "xrWaitFrame", (PFN_xrVoidFunction*)&table->WaitFrame)); + (get_inst_proc_addr(instance, "xrBeginFrame", (PFN_xrVoidFunction*)&table->BeginFrame)); + (get_inst_proc_addr(instance, "xrEndFrame", (PFN_xrVoidFunction*)&table->EndFrame)); + (get_inst_proc_addr(instance, "xrLocateViews", (PFN_xrVoidFunction*)&table->LocateViews)); + (get_inst_proc_addr(instance, "xrStringToPath", (PFN_xrVoidFunction*)&table->StringToPath)); + (get_inst_proc_addr(instance, "xrPathToString", (PFN_xrVoidFunction*)&table->PathToString)); + (get_inst_proc_addr(instance, "xrCreateActionSet", (PFN_xrVoidFunction*)&table->CreateActionSet)); + (get_inst_proc_addr(instance, "xrDestroyActionSet", (PFN_xrVoidFunction*)&table->DestroyActionSet)); + (get_inst_proc_addr(instance, "xrCreateAction", (PFN_xrVoidFunction*)&table->CreateAction)); + (get_inst_proc_addr(instance, "xrDestroyAction", (PFN_xrVoidFunction*)&table->DestroyAction)); + (get_inst_proc_addr(instance, "xrSuggestInteractionProfileBindings", (PFN_xrVoidFunction*)&table->SuggestInteractionProfileBindings)); + (get_inst_proc_addr(instance, "xrAttachSessionActionSets", (PFN_xrVoidFunction*)&table->AttachSessionActionSets)); + (get_inst_proc_addr(instance, "xrGetCurrentInteractionProfile", (PFN_xrVoidFunction*)&table->GetCurrentInteractionProfile)); + (get_inst_proc_addr(instance, "xrGetActionStateBoolean", (PFN_xrVoidFunction*)&table->GetActionStateBoolean)); + (get_inst_proc_addr(instance, "xrGetActionStateFloat", (PFN_xrVoidFunction*)&table->GetActionStateFloat)); + (get_inst_proc_addr(instance, "xrGetActionStateVector2f", (PFN_xrVoidFunction*)&table->GetActionStateVector2f)); + (get_inst_proc_addr(instance, "xrGetActionStatePose", (PFN_xrVoidFunction*)&table->GetActionStatePose)); + (get_inst_proc_addr(instance, "xrSyncActions", (PFN_xrVoidFunction*)&table->SyncActions)); + (get_inst_proc_addr(instance, "xrEnumerateBoundSourcesForAction", (PFN_xrVoidFunction*)&table->EnumerateBoundSourcesForAction)); + (get_inst_proc_addr(instance, "xrGetInputSourceLocalizedName", (PFN_xrVoidFunction*)&table->GetInputSourceLocalizedName)); + (get_inst_proc_addr(instance, "xrApplyHapticFeedback", (PFN_xrVoidFunction*)&table->ApplyHapticFeedback)); + (get_inst_proc_addr(instance, "xrStopHapticFeedback", (PFN_xrVoidFunction*)&table->StopHapticFeedback)); + + // ---- XR_KHR_android_thread_settings extension commands +#if defined(XR_USE_PLATFORM_ANDROID) + (get_inst_proc_addr(instance, "xrSetAndroidApplicationThreadKHR", (PFN_xrVoidFunction*)&table->SetAndroidApplicationThreadKHR)); +#endif // defined(XR_USE_PLATFORM_ANDROID) + + // ---- XR_KHR_android_surface_swapchain extension commands +#if defined(XR_USE_PLATFORM_ANDROID) + (get_inst_proc_addr(instance, "xrCreateSwapchainAndroidSurfaceKHR", (PFN_xrVoidFunction*)&table->CreateSwapchainAndroidSurfaceKHR)); +#endif // defined(XR_USE_PLATFORM_ANDROID) + + // ---- XR_KHR_opengl_enable extension commands +#if defined(XR_USE_GRAPHICS_API_OPENGL) + (get_inst_proc_addr(instance, "xrGetOpenGLGraphicsRequirementsKHR", (PFN_xrVoidFunction*)&table->GetOpenGLGraphicsRequirementsKHR)); +#endif // defined(XR_USE_GRAPHICS_API_OPENGL) + + // ---- XR_KHR_opengl_es_enable extension commands +#if defined(XR_USE_GRAPHICS_API_OPENGL_ES) + (get_inst_proc_addr(instance, "xrGetOpenGLESGraphicsRequirementsKHR", (PFN_xrVoidFunction*)&table->GetOpenGLESGraphicsRequirementsKHR)); +#endif // defined(XR_USE_GRAPHICS_API_OPENGL_ES) + + // ---- XR_KHR_vulkan_enable extension commands +#if defined(XR_USE_GRAPHICS_API_VULKAN) + (get_inst_proc_addr(instance, "xrGetVulkanInstanceExtensionsKHR", (PFN_xrVoidFunction*)&table->GetVulkanInstanceExtensionsKHR)); +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + (get_inst_proc_addr(instance, "xrGetVulkanDeviceExtensionsKHR", (PFN_xrVoidFunction*)&table->GetVulkanDeviceExtensionsKHR)); +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + (get_inst_proc_addr(instance, "xrGetVulkanGraphicsDeviceKHR", (PFN_xrVoidFunction*)&table->GetVulkanGraphicsDeviceKHR)); +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + (get_inst_proc_addr(instance, "xrGetVulkanGraphicsRequirementsKHR", (PFN_xrVoidFunction*)&table->GetVulkanGraphicsRequirementsKHR)); +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) + + // ---- XR_KHR_D3D11_enable extension commands +#if defined(XR_USE_GRAPHICS_API_D3D11) + (get_inst_proc_addr(instance, "xrGetD3D11GraphicsRequirementsKHR", (PFN_xrVoidFunction*)&table->GetD3D11GraphicsRequirementsKHR)); +#endif // defined(XR_USE_GRAPHICS_API_D3D11) + + // ---- XR_KHR_D3D12_enable extension commands +#if defined(XR_USE_GRAPHICS_API_D3D12) + (get_inst_proc_addr(instance, "xrGetD3D12GraphicsRequirementsKHR", (PFN_xrVoidFunction*)&table->GetD3D12GraphicsRequirementsKHR)); +#endif // defined(XR_USE_GRAPHICS_API_D3D12) + + // ---- XR_KHR_visibility_mask extension commands + (get_inst_proc_addr(instance, "xrGetVisibilityMaskKHR", (PFN_xrVoidFunction*)&table->GetVisibilityMaskKHR)); + + // ---- XR_KHR_win32_convert_performance_counter_time extension commands +#if defined(XR_USE_PLATFORM_WIN32) + (get_inst_proc_addr(instance, "xrConvertWin32PerformanceCounterToTimeKHR", (PFN_xrVoidFunction*)&table->ConvertWin32PerformanceCounterToTimeKHR)); +#endif // defined(XR_USE_PLATFORM_WIN32) +#if defined(XR_USE_PLATFORM_WIN32) + (get_inst_proc_addr(instance, "xrConvertTimeToWin32PerformanceCounterKHR", (PFN_xrVoidFunction*)&table->ConvertTimeToWin32PerformanceCounterKHR)); +#endif // defined(XR_USE_PLATFORM_WIN32) + + // ---- XR_KHR_convert_timespec_time extension commands +#if defined(XR_USE_TIMESPEC) + (get_inst_proc_addr(instance, "xrConvertTimespecTimeToTimeKHR", (PFN_xrVoidFunction*)&table->ConvertTimespecTimeToTimeKHR)); +#endif // defined(XR_USE_TIMESPEC) +#if defined(XR_USE_TIMESPEC) + (get_inst_proc_addr(instance, "xrConvertTimeToTimespecTimeKHR", (PFN_xrVoidFunction*)&table->ConvertTimeToTimespecTimeKHR)); +#endif // defined(XR_USE_TIMESPEC) + + // ---- XR_KHR_vulkan_enable2 extension commands +#if defined(XR_USE_GRAPHICS_API_VULKAN) + (get_inst_proc_addr(instance, "xrCreateVulkanInstanceKHR", (PFN_xrVoidFunction*)&table->CreateVulkanInstanceKHR)); +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + (get_inst_proc_addr(instance, "xrCreateVulkanDeviceKHR", (PFN_xrVoidFunction*)&table->CreateVulkanDeviceKHR)); +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + (get_inst_proc_addr(instance, "xrGetVulkanGraphicsDevice2KHR", (PFN_xrVoidFunction*)&table->GetVulkanGraphicsDevice2KHR)); +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + (get_inst_proc_addr(instance, "xrGetVulkanGraphicsRequirements2KHR", (PFN_xrVoidFunction*)&table->GetVulkanGraphicsRequirements2KHR)); +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) + + // ---- XR_EXT_performance_settings extension commands + (get_inst_proc_addr(instance, "xrPerfSettingsSetPerformanceLevelEXT", (PFN_xrVoidFunction*)&table->PerfSettingsSetPerformanceLevelEXT)); + + // ---- XR_EXT_thermal_query extension commands + (get_inst_proc_addr(instance, "xrThermalGetTemperatureTrendEXT", (PFN_xrVoidFunction*)&table->ThermalGetTemperatureTrendEXT)); + + // ---- XR_EXT_debug_utils extension commands + (get_inst_proc_addr(instance, "xrSetDebugUtilsObjectNameEXT", (PFN_xrVoidFunction*)&table->SetDebugUtilsObjectNameEXT)); + (get_inst_proc_addr(instance, "xrCreateDebugUtilsMessengerEXT", (PFN_xrVoidFunction*)&table->CreateDebugUtilsMessengerEXT)); + (get_inst_proc_addr(instance, "xrDestroyDebugUtilsMessengerEXT", (PFN_xrVoidFunction*)&table->DestroyDebugUtilsMessengerEXT)); + (get_inst_proc_addr(instance, "xrSubmitDebugUtilsMessageEXT", (PFN_xrVoidFunction*)&table->SubmitDebugUtilsMessageEXT)); + (get_inst_proc_addr(instance, "xrSessionBeginDebugUtilsLabelRegionEXT", (PFN_xrVoidFunction*)&table->SessionBeginDebugUtilsLabelRegionEXT)); + (get_inst_proc_addr(instance, "xrSessionEndDebugUtilsLabelRegionEXT", (PFN_xrVoidFunction*)&table->SessionEndDebugUtilsLabelRegionEXT)); + (get_inst_proc_addr(instance, "xrSessionInsertDebugUtilsLabelEXT", (PFN_xrVoidFunction*)&table->SessionInsertDebugUtilsLabelEXT)); + + // ---- XR_MSFT_spatial_anchor extension commands + (get_inst_proc_addr(instance, "xrCreateSpatialAnchorMSFT", (PFN_xrVoidFunction*)&table->CreateSpatialAnchorMSFT)); + (get_inst_proc_addr(instance, "xrCreateSpatialAnchorSpaceMSFT", (PFN_xrVoidFunction*)&table->CreateSpatialAnchorSpaceMSFT)); + (get_inst_proc_addr(instance, "xrDestroySpatialAnchorMSFT", (PFN_xrVoidFunction*)&table->DestroySpatialAnchorMSFT)); + + // ---- XR_EXT_conformance_automation extension commands + (get_inst_proc_addr(instance, "xrSetInputDeviceActiveEXT", (PFN_xrVoidFunction*)&table->SetInputDeviceActiveEXT)); + (get_inst_proc_addr(instance, "xrSetInputDeviceStateBoolEXT", (PFN_xrVoidFunction*)&table->SetInputDeviceStateBoolEXT)); + (get_inst_proc_addr(instance, "xrSetInputDeviceStateFloatEXT", (PFN_xrVoidFunction*)&table->SetInputDeviceStateFloatEXT)); + (get_inst_proc_addr(instance, "xrSetInputDeviceStateVector2fEXT", (PFN_xrVoidFunction*)&table->SetInputDeviceStateVector2fEXT)); + (get_inst_proc_addr(instance, "xrSetInputDeviceLocationEXT", (PFN_xrVoidFunction*)&table->SetInputDeviceLocationEXT)); + + // ---- XR_MSFT_spatial_graph_bridge extension commands + (get_inst_proc_addr(instance, "xrCreateSpatialGraphNodeSpaceMSFT", (PFN_xrVoidFunction*)&table->CreateSpatialGraphNodeSpaceMSFT)); + + // ---- XR_EXT_hand_tracking extension commands + (get_inst_proc_addr(instance, "xrCreateHandTrackerEXT", (PFN_xrVoidFunction*)&table->CreateHandTrackerEXT)); + (get_inst_proc_addr(instance, "xrDestroyHandTrackerEXT", (PFN_xrVoidFunction*)&table->DestroyHandTrackerEXT)); + (get_inst_proc_addr(instance, "xrLocateHandJointsEXT", (PFN_xrVoidFunction*)&table->LocateHandJointsEXT)); + + // ---- XR_MSFT_hand_tracking_mesh extension commands + (get_inst_proc_addr(instance, "xrCreateHandMeshSpaceMSFT", (PFN_xrVoidFunction*)&table->CreateHandMeshSpaceMSFT)); + (get_inst_proc_addr(instance, "xrUpdateHandMeshMSFT", (PFN_xrVoidFunction*)&table->UpdateHandMeshMSFT)); + + // ---- XR_MSFT_controller_model extension commands + (get_inst_proc_addr(instance, "xrGetControllerModelKeyMSFT", (PFN_xrVoidFunction*)&table->GetControllerModelKeyMSFT)); + (get_inst_proc_addr(instance, "xrLoadControllerModelMSFT", (PFN_xrVoidFunction*)&table->LoadControllerModelMSFT)); + (get_inst_proc_addr(instance, "xrGetControllerModelPropertiesMSFT", (PFN_xrVoidFunction*)&table->GetControllerModelPropertiesMSFT)); + (get_inst_proc_addr(instance, "xrGetControllerModelStateMSFT", (PFN_xrVoidFunction*)&table->GetControllerModelStateMSFT)); + + // ---- XR_MSFT_perception_anchor_interop extension commands +#if defined(XR_USE_PLATFORM_WIN32) + (get_inst_proc_addr(instance, "xrCreateSpatialAnchorFromPerceptionAnchorMSFT", (PFN_xrVoidFunction*)&table->CreateSpatialAnchorFromPerceptionAnchorMSFT)); +#endif // defined(XR_USE_PLATFORM_WIN32) +#if defined(XR_USE_PLATFORM_WIN32) + (get_inst_proc_addr(instance, "xrTryGetPerceptionAnchorFromSpatialAnchorMSFT", (PFN_xrVoidFunction*)&table->TryGetPerceptionAnchorFromSpatialAnchorMSFT)); +#endif // defined(XR_USE_PLATFORM_WIN32) + + // ---- XR_MSFT_composition_layer_reprojection extension commands + (get_inst_proc_addr(instance, "xrEnumerateReprojectionModesMSFT", (PFN_xrVoidFunction*)&table->EnumerateReprojectionModesMSFT)); + + // ---- XR_FB_swapchain_update_state extension commands + (get_inst_proc_addr(instance, "xrUpdateSwapchainFB", (PFN_xrVoidFunction*)&table->UpdateSwapchainFB)); + (get_inst_proc_addr(instance, "xrGetSwapchainStateFB", (PFN_xrVoidFunction*)&table->GetSwapchainStateFB)); + + // ---- XR_MSFT_scene_understanding extension commands + (get_inst_proc_addr(instance, "xrEnumerateSceneComputeFeaturesMSFT", (PFN_xrVoidFunction*)&table->EnumerateSceneComputeFeaturesMSFT)); + (get_inst_proc_addr(instance, "xrCreateSceneObserverMSFT", (PFN_xrVoidFunction*)&table->CreateSceneObserverMSFT)); + (get_inst_proc_addr(instance, "xrDestroySceneObserverMSFT", (PFN_xrVoidFunction*)&table->DestroySceneObserverMSFT)); + (get_inst_proc_addr(instance, "xrCreateSceneMSFT", (PFN_xrVoidFunction*)&table->CreateSceneMSFT)); + (get_inst_proc_addr(instance, "xrDestroySceneMSFT", (PFN_xrVoidFunction*)&table->DestroySceneMSFT)); + (get_inst_proc_addr(instance, "xrComputeNewSceneMSFT", (PFN_xrVoidFunction*)&table->ComputeNewSceneMSFT)); + (get_inst_proc_addr(instance, "xrGetSceneComputeStateMSFT", (PFN_xrVoidFunction*)&table->GetSceneComputeStateMSFT)); + (get_inst_proc_addr(instance, "xrGetSceneComponentsMSFT", (PFN_xrVoidFunction*)&table->GetSceneComponentsMSFT)); + (get_inst_proc_addr(instance, "xrLocateSceneComponentsMSFT", (PFN_xrVoidFunction*)&table->LocateSceneComponentsMSFT)); + (get_inst_proc_addr(instance, "xrGetSceneMeshBuffersMSFT", (PFN_xrVoidFunction*)&table->GetSceneMeshBuffersMSFT)); + + // ---- XR_MSFT_scene_understanding_serialization extension commands + (get_inst_proc_addr(instance, "xrDeserializeSceneMSFT", (PFN_xrVoidFunction*)&table->DeserializeSceneMSFT)); + (get_inst_proc_addr(instance, "xrGetSerializedSceneFragmentDataMSFT", (PFN_xrVoidFunction*)&table->GetSerializedSceneFragmentDataMSFT)); + + // ---- XR_FB_display_refresh_rate extension commands + (get_inst_proc_addr(instance, "xrEnumerateDisplayRefreshRatesFB", (PFN_xrVoidFunction*)&table->EnumerateDisplayRefreshRatesFB)); + (get_inst_proc_addr(instance, "xrGetDisplayRefreshRateFB", (PFN_xrVoidFunction*)&table->GetDisplayRefreshRateFB)); + (get_inst_proc_addr(instance, "xrRequestDisplayRefreshRateFB", (PFN_xrVoidFunction*)&table->RequestDisplayRefreshRateFB)); + + // ---- XR_FB_color_space extension commands + (get_inst_proc_addr(instance, "xrEnumerateColorSpacesFB", (PFN_xrVoidFunction*)&table->EnumerateColorSpacesFB)); + (get_inst_proc_addr(instance, "xrSetColorSpaceFB", (PFN_xrVoidFunction*)&table->SetColorSpaceFB)); + + // ---- XR_VARJO_environment_depth_estimation extension commands + (get_inst_proc_addr(instance, "xrSetEnvironmentDepthEstimationVARJO", (PFN_xrVoidFunction*)&table->SetEnvironmentDepthEstimationVARJO)); + + // ---- XR_OCULUS_audio_device_guid extension commands +#if defined(XR_USE_PLATFORM_WIN32) + (get_inst_proc_addr(instance, "xrGetAudioOutputDeviceGuidOculus", (PFN_xrVoidFunction*)&table->GetAudioOutputDeviceGuidOculus)); +#endif // defined(XR_USE_PLATFORM_WIN32) +#if defined(XR_USE_PLATFORM_WIN32) + (get_inst_proc_addr(instance, "xrGetAudioInputDeviceGuidOculus", (PFN_xrVoidFunction*)&table->GetAudioInputDeviceGuidOculus)); +#endif // defined(XR_USE_PLATFORM_WIN32) +} + + +#ifdef __cplusplus +} // extern "C" +#endif + diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/xr_generated_dispatch_table.h b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/xr_generated_dispatch_table.h new file mode 100644 index 0000000..f33d84e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/Native~/openxr/xr_generated_dispatch_table.h @@ -0,0 +1,285 @@ +// Copyright (c) 2017-2021, The Khronos Group Inc. +// Copyright (c) 2017-2019 Valve Corporation +// Copyright (c) 2017-2019 LunarG, Inc. +// SPDX-License-Identifier: Apache-2.0 OR MIT +// *********** THIS FILE IS GENERATED - DO NOT EDIT *********** +// See utility_source_generator.py for modifications +// ************************************************************ + +// Copyright (c) 2017-2021, The Khronos Group Inc. +// Copyright (c) 2017-2019 Valve Corporation +// Copyright (c) 2017-2019 LunarG, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Author: Mark Young +// + +#pragma once +#include "common/xr_dependencies.h" +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif +// Generated dispatch table +struct XrGeneratedDispatchTable { + + // ---- Core 1.0 commands + PFN_xrGetInstanceProcAddr GetInstanceProcAddr; + PFN_xrEnumerateApiLayerProperties EnumerateApiLayerProperties; + PFN_xrEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties; + PFN_xrCreateInstance CreateInstance; + PFN_xrDestroyInstance DestroyInstance; + PFN_xrGetInstanceProperties GetInstanceProperties; + PFN_xrPollEvent PollEvent; + PFN_xrResultToString ResultToString; + PFN_xrStructureTypeToString StructureTypeToString; + PFN_xrGetSystem GetSystem; + PFN_xrGetSystemProperties GetSystemProperties; + PFN_xrEnumerateEnvironmentBlendModes EnumerateEnvironmentBlendModes; + PFN_xrCreateSession CreateSession; + PFN_xrDestroySession DestroySession; + PFN_xrEnumerateReferenceSpaces EnumerateReferenceSpaces; + PFN_xrCreateReferenceSpace CreateReferenceSpace; + PFN_xrGetReferenceSpaceBoundsRect GetReferenceSpaceBoundsRect; + PFN_xrCreateActionSpace CreateActionSpace; + PFN_xrLocateSpace LocateSpace; + PFN_xrDestroySpace DestroySpace; + PFN_xrEnumerateViewConfigurations EnumerateViewConfigurations; + PFN_xrGetViewConfigurationProperties GetViewConfigurationProperties; + PFN_xrEnumerateViewConfigurationViews EnumerateViewConfigurationViews; + PFN_xrEnumerateSwapchainFormats EnumerateSwapchainFormats; + PFN_xrCreateSwapchain CreateSwapchain; + PFN_xrDestroySwapchain DestroySwapchain; + PFN_xrEnumerateSwapchainImages EnumerateSwapchainImages; + PFN_xrAcquireSwapchainImage AcquireSwapchainImage; + PFN_xrWaitSwapchainImage WaitSwapchainImage; + PFN_xrReleaseSwapchainImage ReleaseSwapchainImage; + PFN_xrBeginSession BeginSession; + PFN_xrEndSession EndSession; + PFN_xrRequestExitSession RequestExitSession; + PFN_xrWaitFrame WaitFrame; + PFN_xrBeginFrame BeginFrame; + PFN_xrEndFrame EndFrame; + PFN_xrLocateViews LocateViews; + PFN_xrStringToPath StringToPath; + PFN_xrPathToString PathToString; + PFN_xrCreateActionSet CreateActionSet; + PFN_xrDestroyActionSet DestroyActionSet; + PFN_xrCreateAction CreateAction; + PFN_xrDestroyAction DestroyAction; + PFN_xrSuggestInteractionProfileBindings SuggestInteractionProfileBindings; + PFN_xrAttachSessionActionSets AttachSessionActionSets; + PFN_xrGetCurrentInteractionProfile GetCurrentInteractionProfile; + PFN_xrGetActionStateBoolean GetActionStateBoolean; + PFN_xrGetActionStateFloat GetActionStateFloat; + PFN_xrGetActionStateVector2f GetActionStateVector2f; + PFN_xrGetActionStatePose GetActionStatePose; + PFN_xrSyncActions SyncActions; + PFN_xrEnumerateBoundSourcesForAction EnumerateBoundSourcesForAction; + PFN_xrGetInputSourceLocalizedName GetInputSourceLocalizedName; + PFN_xrApplyHapticFeedback ApplyHapticFeedback; + PFN_xrStopHapticFeedback StopHapticFeedback; + + // ---- XR_KHR_android_thread_settings extension commands +#if defined(XR_USE_PLATFORM_ANDROID) + PFN_xrSetAndroidApplicationThreadKHR SetAndroidApplicationThreadKHR; +#endif // defined(XR_USE_PLATFORM_ANDROID) + + // ---- XR_KHR_android_surface_swapchain extension commands +#if defined(XR_USE_PLATFORM_ANDROID) + PFN_xrCreateSwapchainAndroidSurfaceKHR CreateSwapchainAndroidSurfaceKHR; +#endif // defined(XR_USE_PLATFORM_ANDROID) + + // ---- XR_KHR_opengl_enable extension commands +#if defined(XR_USE_GRAPHICS_API_OPENGL) + PFN_xrGetOpenGLGraphicsRequirementsKHR GetOpenGLGraphicsRequirementsKHR; +#endif // defined(XR_USE_GRAPHICS_API_OPENGL) + + // ---- XR_KHR_opengl_es_enable extension commands +#if defined(XR_USE_GRAPHICS_API_OPENGL_ES) + PFN_xrGetOpenGLESGraphicsRequirementsKHR GetOpenGLESGraphicsRequirementsKHR; +#endif // defined(XR_USE_GRAPHICS_API_OPENGL_ES) + + // ---- XR_KHR_vulkan_enable extension commands +#if defined(XR_USE_GRAPHICS_API_VULKAN) + PFN_xrGetVulkanInstanceExtensionsKHR GetVulkanInstanceExtensionsKHR; +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + PFN_xrGetVulkanDeviceExtensionsKHR GetVulkanDeviceExtensionsKHR; +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + PFN_xrGetVulkanGraphicsDeviceKHR GetVulkanGraphicsDeviceKHR; +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + PFN_xrGetVulkanGraphicsRequirementsKHR GetVulkanGraphicsRequirementsKHR; +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) + + // ---- XR_KHR_D3D11_enable extension commands +#if defined(XR_USE_GRAPHICS_API_D3D11) + PFN_xrGetD3D11GraphicsRequirementsKHR GetD3D11GraphicsRequirementsKHR; +#endif // defined(XR_USE_GRAPHICS_API_D3D11) + + // ---- XR_KHR_D3D12_enable extension commands +#if defined(XR_USE_GRAPHICS_API_D3D12) + PFN_xrGetD3D12GraphicsRequirementsKHR GetD3D12GraphicsRequirementsKHR; +#endif // defined(XR_USE_GRAPHICS_API_D3D12) + + // ---- XR_KHR_visibility_mask extension commands + PFN_xrGetVisibilityMaskKHR GetVisibilityMaskKHR; + + // ---- XR_KHR_win32_convert_performance_counter_time extension commands +#if defined(XR_USE_PLATFORM_WIN32) + PFN_xrConvertWin32PerformanceCounterToTimeKHR ConvertWin32PerformanceCounterToTimeKHR; +#endif // defined(XR_USE_PLATFORM_WIN32) +#if defined(XR_USE_PLATFORM_WIN32) + PFN_xrConvertTimeToWin32PerformanceCounterKHR ConvertTimeToWin32PerformanceCounterKHR; +#endif // defined(XR_USE_PLATFORM_WIN32) + + // ---- XR_KHR_convert_timespec_time extension commands +#if defined(XR_USE_TIMESPEC) + PFN_xrConvertTimespecTimeToTimeKHR ConvertTimespecTimeToTimeKHR; +#endif // defined(XR_USE_TIMESPEC) +#if defined(XR_USE_TIMESPEC) + PFN_xrConvertTimeToTimespecTimeKHR ConvertTimeToTimespecTimeKHR; +#endif // defined(XR_USE_TIMESPEC) + + // ---- XR_KHR_loader_init extension commands + PFN_xrInitializeLoaderKHR InitializeLoaderKHR; + + // ---- XR_KHR_vulkan_enable2 extension commands +#if defined(XR_USE_GRAPHICS_API_VULKAN) + PFN_xrCreateVulkanInstanceKHR CreateVulkanInstanceKHR; +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + PFN_xrCreateVulkanDeviceKHR CreateVulkanDeviceKHR; +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + PFN_xrGetVulkanGraphicsDevice2KHR GetVulkanGraphicsDevice2KHR; +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) +#if defined(XR_USE_GRAPHICS_API_VULKAN) + PFN_xrGetVulkanGraphicsRequirements2KHR GetVulkanGraphicsRequirements2KHR; +#endif // defined(XR_USE_GRAPHICS_API_VULKAN) + + // ---- XR_EXT_performance_settings extension commands + PFN_xrPerfSettingsSetPerformanceLevelEXT PerfSettingsSetPerformanceLevelEXT; + + // ---- XR_EXT_thermal_query extension commands + PFN_xrThermalGetTemperatureTrendEXT ThermalGetTemperatureTrendEXT; + + // ---- XR_EXT_debug_utils extension commands + PFN_xrSetDebugUtilsObjectNameEXT SetDebugUtilsObjectNameEXT; + PFN_xrCreateDebugUtilsMessengerEXT CreateDebugUtilsMessengerEXT; + PFN_xrDestroyDebugUtilsMessengerEXT DestroyDebugUtilsMessengerEXT; + PFN_xrSubmitDebugUtilsMessageEXT SubmitDebugUtilsMessageEXT; + PFN_xrSessionBeginDebugUtilsLabelRegionEXT SessionBeginDebugUtilsLabelRegionEXT; + PFN_xrSessionEndDebugUtilsLabelRegionEXT SessionEndDebugUtilsLabelRegionEXT; + PFN_xrSessionInsertDebugUtilsLabelEXT SessionInsertDebugUtilsLabelEXT; + + // ---- XR_MSFT_spatial_anchor extension commands + PFN_xrCreateSpatialAnchorMSFT CreateSpatialAnchorMSFT; + PFN_xrCreateSpatialAnchorSpaceMSFT CreateSpatialAnchorSpaceMSFT; + PFN_xrDestroySpatialAnchorMSFT DestroySpatialAnchorMSFT; + + // ---- XR_EXT_conformance_automation extension commands + PFN_xrSetInputDeviceActiveEXT SetInputDeviceActiveEXT; + PFN_xrSetInputDeviceStateBoolEXT SetInputDeviceStateBoolEXT; + PFN_xrSetInputDeviceStateFloatEXT SetInputDeviceStateFloatEXT; + PFN_xrSetInputDeviceStateVector2fEXT SetInputDeviceStateVector2fEXT; + PFN_xrSetInputDeviceLocationEXT SetInputDeviceLocationEXT; + + // ---- XR_MSFT_spatial_graph_bridge extension commands + PFN_xrCreateSpatialGraphNodeSpaceMSFT CreateSpatialGraphNodeSpaceMSFT; + + // ---- XR_EXT_hand_tracking extension commands + PFN_xrCreateHandTrackerEXT CreateHandTrackerEXT; + PFN_xrDestroyHandTrackerEXT DestroyHandTrackerEXT; + PFN_xrLocateHandJointsEXT LocateHandJointsEXT; + + // ---- XR_MSFT_hand_tracking_mesh extension commands + PFN_xrCreateHandMeshSpaceMSFT CreateHandMeshSpaceMSFT; + PFN_xrUpdateHandMeshMSFT UpdateHandMeshMSFT; + + // ---- XR_MSFT_controller_model extension commands + PFN_xrGetControllerModelKeyMSFT GetControllerModelKeyMSFT; + PFN_xrLoadControllerModelMSFT LoadControllerModelMSFT; + PFN_xrGetControllerModelPropertiesMSFT GetControllerModelPropertiesMSFT; + PFN_xrGetControllerModelStateMSFT GetControllerModelStateMSFT; + + // ---- XR_MSFT_perception_anchor_interop extension commands +#if defined(XR_USE_PLATFORM_WIN32) + PFN_xrCreateSpatialAnchorFromPerceptionAnchorMSFT CreateSpatialAnchorFromPerceptionAnchorMSFT; +#endif // defined(XR_USE_PLATFORM_WIN32) +#if defined(XR_USE_PLATFORM_WIN32) + PFN_xrTryGetPerceptionAnchorFromSpatialAnchorMSFT TryGetPerceptionAnchorFromSpatialAnchorMSFT; +#endif // defined(XR_USE_PLATFORM_WIN32) + + // ---- XR_MSFT_composition_layer_reprojection extension commands + PFN_xrEnumerateReprojectionModesMSFT EnumerateReprojectionModesMSFT; + + // ---- XR_FB_swapchain_update_state extension commands + PFN_xrUpdateSwapchainFB UpdateSwapchainFB; + PFN_xrGetSwapchainStateFB GetSwapchainStateFB; + + // ---- XR_MSFT_scene_understanding extension commands + PFN_xrEnumerateSceneComputeFeaturesMSFT EnumerateSceneComputeFeaturesMSFT; + PFN_xrCreateSceneObserverMSFT CreateSceneObserverMSFT; + PFN_xrDestroySceneObserverMSFT DestroySceneObserverMSFT; + PFN_xrCreateSceneMSFT CreateSceneMSFT; + PFN_xrDestroySceneMSFT DestroySceneMSFT; + PFN_xrComputeNewSceneMSFT ComputeNewSceneMSFT; + PFN_xrGetSceneComputeStateMSFT GetSceneComputeStateMSFT; + PFN_xrGetSceneComponentsMSFT GetSceneComponentsMSFT; + PFN_xrLocateSceneComponentsMSFT LocateSceneComponentsMSFT; + PFN_xrGetSceneMeshBuffersMSFT GetSceneMeshBuffersMSFT; + + // ---- XR_MSFT_scene_understanding_serialization extension commands + PFN_xrDeserializeSceneMSFT DeserializeSceneMSFT; + PFN_xrGetSerializedSceneFragmentDataMSFT GetSerializedSceneFragmentDataMSFT; + + // ---- XR_FB_display_refresh_rate extension commands + PFN_xrEnumerateDisplayRefreshRatesFB EnumerateDisplayRefreshRatesFB; + PFN_xrGetDisplayRefreshRateFB GetDisplayRefreshRateFB; + PFN_xrRequestDisplayRefreshRateFB RequestDisplayRefreshRateFB; + + // ---- XR_FB_color_space extension commands + PFN_xrEnumerateColorSpacesFB EnumerateColorSpacesFB; + PFN_xrSetColorSpaceFB SetColorSpaceFB; + + // ---- XR_VARJO_environment_depth_estimation extension commands + PFN_xrSetEnvironmentDepthEstimationVARJO SetEnvironmentDepthEstimationVARJO; + + // ---- XR_OCULUS_audio_device_guid extension commands +#if defined(XR_USE_PLATFORM_WIN32) + PFN_xrGetAudioOutputDeviceGuidOculus GetAudioOutputDeviceGuidOculus; +#endif // defined(XR_USE_PLATFORM_WIN32) +#if defined(XR_USE_PLATFORM_WIN32) + PFN_xrGetAudioInputDeviceGuidOculus GetAudioInputDeviceGuidOculus; +#endif // defined(XR_USE_PLATFORM_WIN32) +}; + + +// Prototype for dispatch table helper function +void GeneratedXrPopulateDispatchTable(struct XrGeneratedDispatchTable *table, + XrInstance instance, + PFN_xrGetInstanceProcAddr get_inst_proc_addr); + +#ifdef __cplusplus +} // extern "C" +#endif + diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/UnitySubsystemsManifest.json b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/UnitySubsystemsManifest.json new file mode 100644 index 0000000..a11c931 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/UnitySubsystemsManifest.json @@ -0,0 +1,10 @@ +{ + "name": "OpenXR Extension Sample", + "version": "0.1.0-preview.1", + "libraryName": "MeshingFeaturePlugin", + "meshings": [ + { + "id": "Sample Meshing" + } + ] +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/UnitySubsystemsManifest.json.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/UnitySubsystemsManifest.json.meta new file mode 100644 index 0000000..6c75a03 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/UnitySubsystemsManifest.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0c9c9f060f5697d479a50005d89b4316 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android.meta new file mode 100644 index 0000000..561eb63 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f62af97ab6a74f2891cacc6bb4602f10 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android/arm64.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android/arm64.meta new file mode 100644 index 0000000..b065531 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android/arm64.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 27f4fdf38a48423cbd1c4227272bffee +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android/arm64/libMeshingFeaturePlugin.so b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android/arm64/libMeshingFeaturePlugin.so new file mode 100644 index 0000000..18690ec --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android/arm64/libMeshingFeaturePlugin.so @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd6b3a267584526517d8dcdc07078102b018b2b27efff637f7b1fb0730406252 +size 37384 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android/arm64/libMeshingFeaturePlugin.so.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android/arm64/libMeshingFeaturePlugin.so.meta new file mode 100644 index 0000000..03e3a53 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/android/arm64/libMeshingFeaturePlugin.so.meta @@ -0,0 +1,82 @@ +fileFormatVersion: 2 +guid: 7f5e312052a84f64b9123ee877d7ac2e +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + - first: + Android: Android + second: + enabled: 1 + settings: + CPU: ARM64 + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + - first: + Facebook: Win + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Facebook: Win64 + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: AnyCPU + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows.meta new file mode 100644 index 0000000..1809426 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4f3058bf568349a2bdd188a87dff9a60 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm32.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm32.meta new file mode 100644 index 0000000..e10ea48 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm32.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1ad06e24e624f68b0bbd6b71452894d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm32/MeshingFeaturePlugin.dll b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm32/MeshingFeaturePlugin.dll new file mode 100644 index 0000000..64b6e4a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm32/MeshingFeaturePlugin.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86855ad1c4b7c3007c2a526ddd4c4df8514d63272c2425142f3a1dba4c1627a9 +size 38912 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm32/MeshingFeaturePlugin.dll.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm32/MeshingFeaturePlugin.dll.meta new file mode 100644 index 0000000..c409bed --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm32/MeshingFeaturePlugin.dll.meta @@ -0,0 +1,81 @@ +fileFormatVersion: 2 +guid: b2394b75cd374ef7a96dc7ab33ea2b84 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 0 + - first: + Android: Android + second: + enabled: 0 + settings: + CPU: ARMv7 + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: None + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 1 + settings: + CPU: ARM + DontProcess: false + PlaceholderPath: + SDK: UWP + ScriptingBackend: AnyScriptingBackend + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm64.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm64.meta new file mode 100644 index 0000000..9fdaf79 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm64.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5788c2fc0b542389b29edd3d129f9e8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm64/MeshingFeaturePlugin.dll b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm64/MeshingFeaturePlugin.dll new file mode 100644 index 0000000..55c98bc --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm64/MeshingFeaturePlugin.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc62cc0759279e0eee751ce13008d40b5a8f246d946b0fa418f61e57b8aceae9 +size 40448 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm64/MeshingFeaturePlugin.dll.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm64/MeshingFeaturePlugin.dll.meta new file mode 100644 index 0000000..9fe9f85 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/arm64/MeshingFeaturePlugin.dll.meta @@ -0,0 +1,81 @@ +fileFormatVersion: 2 +guid: d46969e9a9ce417c80b1dd42d3ae09eb +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 0 + - first: + Android: Android + second: + enabled: 0 + settings: + CPU: ARMv7 + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: None + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 1 + settings: + CPU: ARM64 + DontProcess: false + PlaceholderPath: + SDK: UWP + ScriptingBackend: AnyScriptingBackend + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/x64.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/x64.meta new file mode 100644 index 0000000..f2787a9 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/x64.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 38effe9126c74a748c3327b56fd1cb1d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/x64/MeshingFeaturePlugin.dll b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/x64/MeshingFeaturePlugin.dll new file mode 100644 index 0000000..09301d0 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/x64/MeshingFeaturePlugin.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95c16fcc2b23429dedb1452bf37e2a97910c2d506a9b385093683ae2c918de42 +size 40448 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/x64/MeshingFeaturePlugin.dll.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/x64/MeshingFeaturePlugin.dll.meta new file mode 100644 index 0000000..ab08d91 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/universalwindows/x64/MeshingFeaturePlugin.dll.meta @@ -0,0 +1,81 @@ +fileFormatVersion: 2 +guid: 5e606c92c2ca423291eca28dbb9d4d43 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 0 + - first: + Android: Android + second: + enabled: 0 + settings: + CPU: ARMv7 + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: None + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 1 + settings: + CPU: X64 + DontProcess: false + PlaceholderPath: + SDK: UWP + ScriptingBackend: AnyScriptingBackend + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows.meta new file mode 100644 index 0000000..214b9fc --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 767508e5707d4539a2c17e6c7c5b01cd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows/x64.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows/x64.meta new file mode 100644 index 0000000..a8f3dfe --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows/x64.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c30a59a9fa1d4c92bc31a01f2eb3df7a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows/x64/MeshingFeaturePlugin.dll b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows/x64/MeshingFeaturePlugin.dll new file mode 100644 index 0000000..90dcef0 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows/x64/MeshingFeaturePlugin.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b097803a1559eb95b29630361f3d23576c86d09913860306ad4fa5afe337638 +size 239616 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows/x64/MeshingFeaturePlugin.dll.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows/x64/MeshingFeaturePlugin.dll.meta new file mode 100644 index 0000000..a0bbffd --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/MeshingFeaturePlugin/windows/x64/MeshingFeaturePlugin.dll.meta @@ -0,0 +1,81 @@ +fileFormatVersion: 2 +guid: 3b04e62518ff4318b89da5aa6bfc7966 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux64: 0 + Exclude OSXUniversal: 0 + Exclude Win: 1 + Exclude Win64: 0 + Exclude WindowsStoreApps: 1 + - first: + Android: Android + second: + enabled: 0 + settings: + CPU: ARMv7 + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + CPU: x86_64 + DefaultValueInitialized: true + OS: Windows + - first: + Standalone: Linux64 + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Standalone: OSXUniversal + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win64 + second: + enabled: 1 + settings: + CPU: AnyCPU + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + DontProcess: false + PlaceholderPath: + SDK: AnySDK + ScriptingBackend: AnyScriptingBackend + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models.meta new file mode 100644 index 0000000..b3cbee2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7f801721cda67f648b5ee709339c9a35 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers.meta new file mode 100644 index 0000000..7bdf207 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c81192927e329d146a328ac771df28d3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_left.FBX b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_left.FBX new file mode 100644 index 0000000..5afb305 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_left.FBX @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9592d13df0ce07883fc5f5f2a3f6f5c5ed04138dff7271f89d818bde78c6c653 +size 1388304 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_left.FBX.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_left.FBX.meta new file mode 100644 index 0000000..abcea66 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_left.FBX.meta @@ -0,0 +1,107 @@ +fileFormatVersion: 2 +guid: 8d8aaa0c6df64a7468b044c36207e085 +ModelImporter: + serializedVersion: 20200 + internalIDToNameTable: [] + externalObjects: + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: ViveCosmosPartsController + second: {fileID: 2100000, guid: 7e40d5b6de9c7b24cbd0293dd20805ea, type: 2} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_right.FBX b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_right.FBX new file mode 100644 index 0000000..a6cbd47 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_right.FBX @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cedce79e61c8c92909c3df6a6818a79dce0113d2d3677dcb073f59bd69ce2331 +size 1385952 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_right.FBX.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_right.FBX.meta new file mode 100644 index 0000000..a17aa71 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Models/CosmosControllers/vive_cosmos_controller_right.FBX.meta @@ -0,0 +1,107 @@ +fileFormatVersion: 2 +guid: 1184578736ca2da4a857bcf6a429b258 +ModelImporter: + serializedVersion: 20200 + internalIDToNameTable: [] + externalObjects: + - first: + type: UnityEngine:Material + assembly: UnityEngine.CoreModule + name: ViveCosmosPartsController + second: {fileID: 2100000, guid: 7e40d5b6de9c7b24cbd0293dd20805ea, type: 2} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin.meta new file mode 100644 index 0000000..439eecf --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7292cf6ca9f77f540a69975e02b52728 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough.cs new file mode 100644 index 0000000..abd86e3 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace HVR +{ + public class EnablePassThrough : MonoBehaviour + { + EHVRErrorCode hvrErr; + EHVRSettingsError settingErr; + //IHVRSettings_FnTable *vr_settings = (IHVRSettings_FnTable*) HVR_GetGenericInterface(IHVRSettings_Version, &hvrErr); + public bool enable = true; + public int blend_mode = 0; + private int origin_blend_mode = 4; + // Start is called before the first frame update + private CHVRSettings vr_settings; + + private void Awake() { + HVRClass.Init(ref hvrErr); + vr_settings = HVRClass.Settings; + } + void Start() + { + if(vr_settings != null) + { + origin_blend_mode = vr_settings.GetInt32("camera", "cameraRoomViewMode", ref settingErr); + Debug.Log("cameraRoomViewMode: " + origin_blend_mode); + // Change exposure mode + vr_settings.SetBool("camera", "cameraRoomViewAlwaysOn", enable, ref settingErr); + if (settingErr == EHVRSettingsError.EVRSettingsError_None) + { + Debug.Log("Enable pass through successfully."); // Enable pass through successfully + } else + { + Debug.Log("Enable pass through failed: " + settingErr); + } + + vr_settings.SetInt32("camera", "cameraRoomViewMode", blend_mode, ref settingErr); + if (settingErr == EHVRSettingsError.EVRSettingsError_None) + { + Debug.Log("Set camera mode successfully."); // Set camera mode successfully + } else + { + Debug.Log("Set camera mode failed: " + settingErr); + } + } else + { + Debug.Log("vr_settings is null."); + } + } + + private void OnApplicationQuit() + { + if(vr_settings != null) + { + // Disable pass through before closing the App. + vr_settings.SetBool("camera", "cameraRoomViewAlwaysOn", !enable, ref settingErr); + if (settingErr == EHVRSettingsError.EVRSettingsError_None) + { + Debug.Log("Disable pass through."); + } + + vr_settings.SetInt32("camera", "cameraRoomViewMode", origin_blend_mode, ref settingErr); + if (settingErr == EHVRSettingsError.EVRSettingsError_None) + { + Debug.Log("Reset cameraRoomViewMode: " + origin_blend_mode); + } + } + } + } +} \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough.cs.meta new file mode 100644 index 0000000..f62b9fd --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9a9f8c3b3ddb4a4b80d22ea03baff18 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough_cmd.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough_cmd.cs new file mode 100644 index 0000000..8ddbfc7 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough_cmd.cs @@ -0,0 +1,68 @@ +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using System.IO; +using UnityEngine; + +public class EnablePassThrough_cmd : MonoBehaviour +{ + private Thread enablePassThrough_t; + private Thread disablePassThrough_t; + string path; + // Start is called before the first frame update + private void Awake() { + #if UNITY_EDITOR + path = System.IO.Path.Combine(Directory.GetCurrentDirectory() + "\\Assets\\Samples\\VIVE OpenXR Plugin - Windows\\1.0.12\\SceneUnderstanding Example\\PassThrough Plugin\\OfflineTool.exe"); + #elif UNITY_STANDALONE + path = System.IO.Path.Combine(Directory.GetCurrentDirectory() + "/OfflineTool.exe"); + #endif + UnityEngine.Debug.Log(path); + + enablePassThrough_t = new Thread(new ThreadStart(EnablePassThrough)); + enablePassThrough_t.Start(); + } + void Start() + { + + } + + public void EnablePassThrough() + { + string cmd = "PassThrough 1 0"; + RunCMD(cmd); + UnityEngine.Debug.Log("enable pass through"); + } + + public void DisablePassThrough() + { + string cmd = "PassThrough 0 4"; + RunCMD(cmd); + } + + public void RunCMD(string command) + { + Process process = new Process(); + if(System.IO.File.Exists(path)) + { + process.StartInfo.FileName = path; + process.StartInfo.Arguments = command; + process.StartInfo.UseShellExecute = false; + process.StartInfo.RedirectStandardInput = true; + process.StartInfo.RedirectStandardOutput = true; + process.StartInfo.RedirectStandardError = true; + process.StartInfo.CreateNoWindow = true; + process.Start(); + UnityEngine.Debug.Log(process.StandardOutput.ReadToEnd()); + } else + { + UnityEngine.Debug.Log("OfflineTool.exe isn't exists."); + } + } + private void OnApplicationQuit() + { + disablePassThrough_t = new Thread(new ThreadStart(DisablePassThrough)); + disablePassThrough_t.Start(); + } + +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough_cmd.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough_cmd.cs.meta new file mode 100644 index 0000000..562e793 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/EnablePassThrough_cmd.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 86cba7bb45e47c34f83cac2fac8ae085 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/OfflineTool.exe b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/OfflineTool.exe new file mode 100644 index 0000000..2e6f925 Binary files /dev/null and b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/OfflineTool.exe differ diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/OfflineTool.exe.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/OfflineTool.exe.meta new file mode 100644 index 0000000..e0247b2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/OfflineTool.exe.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 438feafad63dc2d4491f43bd900133de +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/ViveVR_api.dll b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/ViveVR_api.dll new file mode 100644 index 0000000..ec0ac55 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/ViveVR_api.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3bc456cd5f24f092338632531d5c603a5d25afbbd24fbff373d9a0adf150b9f +size 307712 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/ViveVR_api.dll.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/ViveVR_api.dll.meta new file mode 100644 index 0000000..a98e9f8 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/ViveVR_api.dll.meta @@ -0,0 +1,27 @@ +fileFormatVersion: 2 +guid: 83bd3ae3514cb0745b367f588c8bc81c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/headers.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/headers.meta new file mode 100644 index 0000000..11bb42c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/headers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a12b3213ee4d2a440aa0fcfeafee6dec +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/headers/ViveVR_api.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/headers/ViveVR_api.cs new file mode 100644 index 0000000..b1fa5db --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/headers/ViveVR_api.cs @@ -0,0 +1,2735 @@ +//========= Copyright 2017-2018, HTC Corporation. All rights reserved. =========== +// +// Purpose: This file contains C#/managed code bindings for the OpenVR interfaces +// +//================================================================================ + +using System; +using System.Runtime.InteropServices; +using HVR; + +namespace HVR +{ + +[StructLayout(LayoutKind.Sequential)] +public struct IHVRSystem +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetRecommendedRenderTargetSize(ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRecommendedRenderTargetSize GetRecommendedRenderTargetSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HVRMatrix44_t _GetProjectionMatrix(EHVREye eEye, float fNearZ, float fFarZ, EHVRTextureType eProjType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetProjectionMatrix GetProjectionMatrix; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetProjectionRaw(EHVREye eEye, ref float pfLeft, ref float pfRight, ref float pfTop, ref float pfBottom); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetProjectionRaw GetProjectionRaw; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HVRMatrix34_t _GetEyeToHeadTransform(EHVREye eEye); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetEyeToHeadTransform GetEyeToHeadTransform; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetTimeSinceLastVsync(ref float pfSecondsSinceLastVsync, ref ulong pulFrameCounter); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTimeSinceLastVsync GetTimeSinceLastVsync; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetDeviceToAbsoluteTrackingPose(EHVRTrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, [In, Out] HVRTrackedDevicePose_t[] pTrackedDevicePoseArray, uint unTrackedDevicePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetDeviceToAbsoluteTrackingPose GetDeviceToAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HVRMatrix34_t _GetRawZeroPoseToStandingAbsoluteTrackingPose(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRawZeroPoseToStandingAbsoluteTrackingPose GetRawZeroPoseToStandingAbsoluteTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetTrackedDeviceIndexForControllerRole(EHVRTrackedControllerRole unDeviceType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceIndexForControllerRole GetTrackedDeviceIndexForControllerRole; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedControllerRole _GetControllerRoleForTrackedDeviceIndex(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerRoleForTrackedDeviceIndex GetControllerRoleForTrackedDeviceIndex; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedDeviceClass _GetTrackedDeviceClass(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackedDeviceClass GetTrackedDeviceClass; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsTrackedDeviceConnected(uint unDeviceIndex); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsTrackedDeviceConnected IsTrackedDeviceConnected; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetBoolTrackedDeviceProperty(uint unDeviceIndex, EHVRTrackedDeviceProperty prop, ref EHVRTrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBoolTrackedDeviceProperty GetBoolTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFloatTrackedDeviceProperty(uint unDeviceIndex, EHVRTrackedDeviceProperty prop, ref EHVRTrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFloatTrackedDeviceProperty GetFloatTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetInt32TrackedDeviceProperty(uint unDeviceIndex, EHVRTrackedDeviceProperty prop, ref EHVRTrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInt32TrackedDeviceProperty GetInt32TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetUint64TrackedDeviceProperty(uint unDeviceIndex, EHVRTrackedDeviceProperty prop, ref EHVRTrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetUint64TrackedDeviceProperty GetUint64TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetStringTrackedDeviceProperty(uint unDeviceIndex, EHVRTrackedDeviceProperty prop, System.Text.StringBuilder pchValue, uint unBufferSize, ref EHVRTrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetStringTrackedDeviceProperty GetStringTrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HVRMatrix34_t _GetMatrix34TrackedDeviceProperty(uint unDeviceIndex, EHVRTrackedDeviceProperty prop, ref EHVRTrackedPropertyError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetMatrix34TrackedDeviceProperty GetMatrix34TrackedDeviceProperty; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _PollNextEvent(ref HVREvent_t pEvent, uint uncbVREvent); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PollNextEvent PollNextEvent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HVRHiddenAreaMesh_t _GetHiddenAreaMesh(EHVREye eEye, EHVRHiddenAreaMeshType type); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetHiddenAreaMesh GetHiddenAreaMesh; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerState(uint unControllerDeviceIndex, ref HVRControllerState_t pControllerState); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerState GetControllerState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetControllerStateWithPose(EHVRTrackingUniverseOrigin eOrigin, uint unControllerDeviceIndex, ref HVRControllerState_t pControllerState, uint unControllerStateSize, ref HVRTrackedDevicePose_t pTrackedDevicePose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetControllerStateWithPose GetControllerStateWithPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _TriggerHapticPulse(uint unControllerDeviceIndex, uint unAxisId, char usDurationMicroSec); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _TriggerHapticPulse TriggerHapticPulse; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsInputFocusCapturedByAnotherProcess(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsInputFocusCapturedByAnotherProcess IsInputFocusCapturedByAnotherProcess; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate HVRChaperoneCalibrationState _GetCalibrationState(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCalibrationState GetCalibrationState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetPlayAreaSize(ref float pSizeX, ref float pSizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPlayAreaSize GetPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetPlayAreaRect(ref HVRQuad_t rect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetPlayAreaRect GetPlayAreaRect; +} + +[StructLayout(LayoutKind.Sequential)] +public struct IHVRCompositor +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetTrackingSpace(EHVRTrackingUniverseOrigin eTrackingOrigin); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetTrackingSpace SetTrackingSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackingUniverseOrigin _GetTrackingSpace(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetTrackingSpace GetTrackingSpace; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRCompositorError _WaitGetPoses([In, Out] HVRTrackedDevicePose_t[] pRenderPoseArray, uint unRenderPoseArrayCount, [In, Out] HVRTrackedDevicePose_t[] pGamePoseArray, uint unGamePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _WaitGetPoses WaitGetPoses; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRCompositorError _GetLastPoses([In, Out] HVRTrackedDevicePose_t[] pRenderPoseArray, uint unRenderPoseArrayCount, [In, Out] HVRTrackedDevicePose_t[] pGamePoseArray, uint unGamePoseArrayCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLastPoses GetLastPoses; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRCompositorError _Submit(EHVREye eEye, ref HVRTexture_t pTexture, ref HVRTextureBounds_t pBounds, EHVRSubmitFlags nSubmitFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Submit Submit; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _PostPresentHandoff(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _PostPresentHandoff PostPresentHandoff; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FadeToColor(float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FadeToColor FadeToColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CanRenderScene(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CanRenderScene CanRenderScene; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SuspendRendering(bool bSuspend); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SuspendRendering SuspendRendering; +} + +[StructLayout(LayoutKind.Sequential)] +public struct IHVROverlay +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _FindOverlay(string pchOverlayKey, ref ulong pOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FindOverlay FindOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _CreateOverlay(string pchOverlayKey, string pchOverlayFriendlyName, ref ulong pOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateOverlay CreateOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _DestroyOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DestroyOverlay DestroyOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetHighQualityOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetHighQualityOverlay SetHighQualityOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetHighQualityOverlay(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetHighQualityOverlay GetHighQualityOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayKey(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref EHVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayKey GetOverlayKey; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayName(ulong ulOverlayHandle, System.Text.StringBuilder pchValue, uint unBufferSize, ref EHVROverlayError pError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayName GetOverlayName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayImageData(ulong ulOverlayHandle, IntPtr pvBuffer, uint unBufferSize, ref uint punWidth, ref uint punHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayImageData GetOverlayImageData; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetOverlayErrorNameFromEnum(EHVROverlayError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayErrorNameFromEnum GetOverlayErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayRenderingPid(ulong ulOverlayHandle, uint unPID); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRenderingPid SetOverlayRenderingPid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetOverlayRenderingPid(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayRenderingPid GetOverlayRenderingPid; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayFlag(ulong ulOverlayHandle, HVROverlayFlags eOverlayFlag, bool bEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayFlag SetOverlayFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayFlag(ulong ulOverlayHandle, HVROverlayFlags eOverlayFlag, ref bool bEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayFlag GetOverlayFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayColor(ulong ulOverlayHandle, float fRed, float fGreen, float fBlue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayColor SetOverlayColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayColor(ulong ulOverlayHandle, ref float pfRed, ref float pfGreen, ref float pfBlue); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayColor GetOverlayColor; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayAlpha(ulong ulOverlayHandle, float fAlpha); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayAlpha SetOverlayAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayAlpha(ulong ulOverlayHandle, ref float pfAlpha); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayAlpha GetOverlayAlpha; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayTexelAspect(ulong ulOverlayHandle, float fTexelAspect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTexelAspect SetOverlayTexelAspect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayTexelAspect(ulong ulOverlayHandle, ref float pfTexelAspect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTexelAspect GetOverlayTexelAspect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlaySortOrder(ulong ulOverlayHandle, uint unSortOrder); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlaySortOrder SetOverlaySortOrder; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlaySortOrder(ulong ulOverlayHandle, ref uint punSortOrder); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlaySortOrder GetOverlaySortOrder; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayWidthInMeters(ulong ulOverlayHandle, float fWidthInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayWidthInMeters SetOverlayWidthInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayWidthInMeters(ulong ulOverlayHandle, ref float pfWidthInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayWidthInMeters GetOverlayWidthInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayAutoCurveDistanceRangeInMeters SetOverlayAutoCurveDistanceRangeInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, ref float fMinDistanceInMeters, ref float fMaxDistanceInMeters); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayAutoCurveDistanceRangeInMeters GetOverlayAutoCurveDistanceRangeInMeters; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayTextureBounds(ulong ulOverlayHandle, ref HVRTextureBounds_t pOverlayTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTextureBounds SetOverlayTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayTextureBounds(ulong ulOverlayHandle, ref HVRTextureBounds_t pOverlayTextureBounds); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureBounds GetOverlayTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayTransformType(ulong ulOverlayHandle, ref HVROverlayTransformType peTransformType); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformType GetOverlayTransformType; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayTransformAbsolute(ulong ulOverlayHandle, EHVRTrackingUniverseOrigin eTrackingOrigin, ref HVRMatrix34_t pmatTrackingOriginToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformAbsolute SetOverlayTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayTransformAbsolute(ulong ulOverlayHandle, ref EHVRTrackingUniverseOrigin peTrackingOrigin, ref HVRMatrix34_t pmatTrackingOriginToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformAbsolute GetOverlayTransformAbsolute; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle, uint unTrackedDevice, ref HVRMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformTrackedDeviceRelative SetOverlayTransformTrackedDeviceRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle, ref uint punTrackedDevice, ref HVRMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformTrackedDeviceRelative GetOverlayTransformTrackedDeviceRelative; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle, uint unDeviceIndex, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTransformTrackedDeviceComponent SetOverlayTransformTrackedDeviceComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle, ref uint punDeviceIndex, string pchComponentName, uint unComponentNameSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTransformTrackedDeviceComponent GetOverlayTransformTrackedDeviceComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _ShowOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ShowOverlay ShowOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _HideOverlay(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HideOverlay HideOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _IsOverlayVisible(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _IsOverlayVisible IsOverlayVisible; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayTexture(ulong ulOverlayHandle, ref HVRTexture_t pTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTexture SetOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _ClearOverlayTexture(ulong ulOverlayHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ClearOverlayTexture ClearOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayRaw(ulong ulOverlayHandle, IntPtr pvBuffer, uint unWidth, uint unHeight, uint unDepth); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayRaw SetOverlayRaw; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayFromFile(ulong ulOverlayHandle, string pchFilePath); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayFromFile SetOverlayFromFile; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayTexture(ulong ulOverlayHandle, ref IntPtr pNativeTextureHandle, IntPtr pNativeTextureRef, ref uint pWidth, ref uint pHeight, ref uint pNativeFormat, ref EHVRTextureType pAPI, ref EHVRColorSpace pColorSpace); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTexture GetOverlayTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _GetOverlayTextureSize(ulong ulOverlayHandle, ref uint pWidth, ref uint pHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetOverlayTextureSize GetOverlayTextureSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayStereoTexture(ulong ulOverlayHandle, ref HVRTexture_t pTexture, EHVREye eye); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayStereoTexture SetOverlayStereoTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayStereoMode(ulong ulOverlayHandle, bool bEnabled); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayStereoMode SetOverlayStereoMode; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayStereoTextureBounds(ulong ulOverlayHandle, ref HVRTextureBounds_t pOverlayTextureBounds, EHVREye eye); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayStereoTextureBounds SetOverlayStereoTextureBounds; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetOverlayTextureUpsideDownFlag(ulong ulOverlayHandle, bool flag); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetOverlayTextureUpsideDownFlag SetOverlayTextureUpsideDownFlag; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _CreateDesktopCaptureOverlay(uint targetHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CreateDesktopCaptureOverlay CreateDesktopCaptureOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _DestroyDesktopCaptureOverlay(uint targetHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _DestroyDesktopCaptureOverlay DestroyDesktopCaptureOverlay; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetDesktopCaptureOverlayWidth(uint targetHandle, float width); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDesktopCaptureOverlayWidth SetDesktopCaptureOverlayWidth; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetDesktopCaptureOverlayAbsolutePose(uint targetHandle, ref HVRMatrix34_t pmatTrackedDeviceToOverlayTransform); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDesktopCaptureOverlayAbsolutePose SetDesktopCaptureOverlayAbsolutePose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVROverlayError _SetDesktopCaptureOverlayCurveDistance(uint targetHandle, float minDist, float maxDist); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetDesktopCaptureOverlayCurveDistance SetDesktopCaptureOverlayCurveDistance; +} + +[StructLayout(LayoutKind.Sequential)] +public struct IHVRRenderModels +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRRenderModelError _LoadRenderModel_Async(string pchRenderModelName, ref IntPtr ppRenderModel); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadRenderModel_Async LoadRenderModel_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeRenderModel(IntPtr pRenderModel); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeRenderModel FreeRenderModel; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRRenderModelError _LoadTexture_Async(int textureId, ref IntPtr ppTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadTexture_Async LoadTexture_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeTexture(IntPtr pTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeTexture FreeTexture; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRRenderModelError _LoadTextureD3D11_Async(int textureId, IntPtr pD3D11Device, ref IntPtr ppD3D11Texture2D); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadTextureD3D11_Async LoadTextureD3D11_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRRenderModelError _LoadIntoTextureD3D11_Async(int textureId, IntPtr pDstTexture); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _LoadIntoTextureD3D11_Async LoadIntoTextureD3D11_Async; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _FreeTextureD3D11(IntPtr pD3D11Texture2D); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _FreeTextureD3D11 FreeTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelName(uint unRenderModelIndex, System.Text.StringBuilder pchRenderModelName, uint unRenderModelNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelName GetRenderModelName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelCount(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelCount GetRenderModelCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentCount(string pchRenderModelName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentCount GetComponentCount; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentName(string pchRenderModelName, uint unComponentIndex, System.Text.StringBuilder pchComponentName, uint unComponentNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentName GetComponentName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate ulong _GetComponentButtonMask(string pchRenderModelName, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentButtonMask GetComponentButtonMask; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetComponentRenderModelName(string pchRenderModelName, string pchComponentName, System.Text.StringBuilder pchComponentRenderModelName, uint unComponentRenderModelNameLen); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentRenderModelName GetComponentRenderModelName; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentStateForDevicePath(string pchRenderModelName, string pchComponentName, ulong devicePath, ref RenderModel_ControllerMode_State_t pState, ref RenderModel_ComponentState_t pComponentState); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentStateForDevicePath GetComponentStateForDevicePath; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentState(string pchRenderModelName, string pchComponentName, ref HVRControllerState_t pControllerState, ref RenderModel_ControllerMode_State_t pState, ref RenderModel_ComponentState_t pComponentState); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetComponentState GetComponentState; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _RenderModelHasComponent(string pchRenderModelName, string pchComponentName); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RenderModelHasComponent RenderModelHasComponent; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelThumbnailURL(string pchRenderModelName, System.Text.StringBuilder pchThumbnailURL, uint unThumbnailURLLen, ref EHVRRenderModelError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelThumbnailURL GetRenderModelThumbnailURL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate uint _GetRenderModelOriginalPath(string pchRenderModelName, System.Text.StringBuilder pchOriginalPath, uint unOriginalPathLen, ref EHVRRenderModelError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelOriginalPath GetRenderModelOriginalPath; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetRenderModelErrorNameFromEnum(EHVRRenderModelError error); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetRenderModelErrorNameFromEnum GetRenderModelErrorNameFromEnum; + +} + + [StructLayout(LayoutKind.Sequential)] +public struct IHVRTrackedCamera +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetCameraErrorNameFromEnum(EHVRTrackedCameraError eCameraError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraErrorNameFromEnum GetCameraErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _HasCamera(uint nDeviceIndex, ref bool pHasCamera); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _HasCamera HasCamera; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _GetCameraFrameSize(uint nDeviceIndex, EHVRTrackedCameraFrameType eFrameType, ref uint pnWidth, ref uint pnHeight, ref uint pnFrameBufferSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraFrameSize GetCameraFrameSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _GetCameraIntrinsics(uint nDeviceIndex, uint nCameraIndex, EHVRTrackedCameraFrameType eFrameType, ref HVRVector2_t pFocalLength, ref HVRVector2_t pCenter); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraIntrinsics GetCameraIntrinsics; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _GetCameraProjection(uint nDeviceIndex, uint nCameraIndex, EHVRTrackedCameraFrameType eFrameType, float flZNear, float flZFar, ref HVRMatrix44_t pProjection); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetCameraProjection GetCameraProjection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _AcquireVideoStreamingService(uint nDeviceIndex, ref ulong pHandle); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _AcquireVideoStreamingService AcquireVideoStreamingService; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _ReleaseVideoStreamingService(ulong hTrackedCamera); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseVideoStreamingService ReleaseVideoStreamingService; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _GetVideoStreamFrameBuffer(ulong hTrackedCamera, EHVRTrackedCameraFrameType eFrameType, IntPtr pFrameBuffer, uint nFrameBufferSize, ref HVRCameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamFrameBuffer GetVideoStreamFrameBuffer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _GetVideoStreamTextureSize(uint nDeviceIndex, EHVRTrackedCameraFrameType eFrameType, ref HVRTextureBounds_t pTextureBounds, ref uint pnWidth, ref uint pnHeight); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureSize GetVideoStreamTextureSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _GetVideoStreamTextureD3D11(ulong hTrackedCamera, EHVRTrackedCameraFrameType eFrameType, IntPtr pD3D11DeviceOrResource, ref IntPtr ppD3D11ShaderResourceView, ref HVRCameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureD3D11 GetVideoStreamTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _GetVideoStreamSeperateTextureD3D11(ulong hTrackedCamera, EHVRTrackedCameraFrameType eFrameType, IntPtr pD3D11DeviceOrResource, ref IntPtr ppD3D11ShaderResourceViewLeft, ref IntPtr ppD3D11ShaderResourceViewRight, ref HVRCameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamSeperateTextureD3D11 GetVideoStreamSeperateTextureD3D11; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _GetVideoStreamTextureGL(ulong hTrackedCamera, EHVRTrackedCameraFrameType eFrameType, ref uint pglTextureId, ref HVRCameraVideoStreamFrameHeader_t pFrameHeader, uint nFrameHeaderSize); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetVideoStreamTextureGL GetVideoStreamTextureGL; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate EHVRTrackedCameraError _ReleaseVideoStreamTextureGL(ulong hTrackedCamera, uint glTextureId); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReleaseVideoStreamTextureGL ReleaseVideoStreamTextureGL; +} + +[StructLayout(LayoutKind.Sequential)] +public struct IHVRSettings +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate IntPtr _GetSettingsErrorNameFromEnum(EHVRSettingsError eError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetSettingsErrorNameFromEnum GetSettingsErrorNameFromEnum; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _Sync(bool bForce, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _Sync Sync; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetBool(string pchSection, string pchSettingsKey, bool bValue, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetBool SetBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetInt32(string pchSection, string pchSettingsKey, int nValue, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetInt32 SetInt32; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetFloat(string pchSection, string pchSettingsKey, float flValue, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetFloat SetFloat; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetString(string pchSection, string pchSettingsKey, string pchValue, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetString SetString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetBool(string pchSection, string pchSettingsKey, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetBool GetBool; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate int _GetInt32(string pchSection, string pchSettingsKey, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetInt32 GetInt32; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate float _GetFloat(string pchSection, string pchSettingsKey, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetFloat GetFloat; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _GetString(string pchSection, string pchSettingsKey, System.Text.StringBuilder pchValue, uint unValueLen, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetString GetString; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RemoveSection(string pchSection, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveSection RemoveSection; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RemoveKeyInSection(string pchSection, string pchSettingsKey, ref EHVRSettingsError peError); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RemoveKeyInSection RemoveKeyInSection; + +} + +[StructLayout(LayoutKind.Sequential)] +public struct IHVRChaperoneSetup +{ + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _CommitWorkingCopy(EHVRChaperoneConfigFile configFile); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _CommitWorkingCopy CommitWorkingCopy; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _RevertWorkingCopy(); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _RevertWorkingCopy RevertWorkingCopy; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingPlayAreaSize(ref float pSizeX, ref float pSizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingPlayAreaSize GetWorkingPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingPlayAreaRect(ref HVRQuad_t rect); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingPlayAreaRect GetWorkingPlayAreaRect; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingCollisionBoundsInfo([In, Out] HVRQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingCollisionBoundsInfo GetWorkingCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveCollisionBoundsInfo([In, Out] HVRQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveCollisionBoundsInfo GetLiveCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingSeatedZeroPoseToRawTrackingPose(ref HVRMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingSeatedZeroPoseToRawTrackingPose GetWorkingSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetWorkingStandingZeroPoseToRawTrackingPose(ref HVRMatrix34_t pmatStandingZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetWorkingStandingZeroPoseToRawTrackingPose GetWorkingStandingZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingPlayAreaSize(float sizeX, float sizeZ); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingPlayAreaSize SetWorkingPlayAreaSize; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingCollisionBoundsInfo([In, Out] HVRQuad_t[] pQuadsBuffer, uint unQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingCollisionBoundsInfo SetWorkingCollisionBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingSeatedZeroPoseToRawTrackingPose(ref HVRMatrix34_t pMatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingSeatedZeroPoseToRawTrackingPose SetWorkingSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingStandingZeroPoseToRawTrackingPose(ref HVRMatrix34_t pMatStandingZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingStandingZeroPoseToRawTrackingPose SetWorkingStandingZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _ReloadFromDisk(EHVRChaperoneConfigFile configFile); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ReloadFromDisk ReloadFromDisk; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveSeatedZeroPoseToRawTrackingPose(ref HVRMatrix34_t pmatSeatedZeroPoseToRawTrackingPose); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveSeatedZeroPoseToRawTrackingPose GetLiveSeatedZeroPoseToRawTrackingPose; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate void _SetWorkingCollisionBoundsTagsInfo([In, Out] byte[] pTagsBuffer, uint unTagCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingCollisionBoundsTagsInfo SetWorkingCollisionBoundsTagsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLiveCollisionBoundsTagsInfo([In, Out] byte[] pTagsBuffer, ref uint punTagCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLiveCollisionBoundsTagsInfo GetLiveCollisionBoundsTagsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _SetWorkingPhysicalBoundsInfo([In, Out] HVRQuad_t[] pQuadsBuffer, uint unQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _SetWorkingPhysicalBoundsInfo SetWorkingPhysicalBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetLivePhysicalBoundsInfo([In, Out] HVRQuad_t[] pQuadsBuffer, ref uint punQuadsCount); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _GetLivePhysicalBoundsInfo GetLivePhysicalBoundsInfo; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ExportLiveToBuffer(System.Text.StringBuilder pBuffer, ref uint pnBufferLength); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ExportLiveToBuffer ExportLiveToBuffer; + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _ImportFromBufferToWorking(string pBuffer, uint nImportFlags); + [MarshalAs(UnmanagedType.FunctionPtr)] + internal _ImportFromBufferToWorking ImportFromBufferToWorking; +} + +public class CHVRSystem +{ + IHVRSystem FnTable; + internal CHVRSystem(IntPtr pInterface) + { + FnTable = (IHVRSystem)Marshal.PtrToStructure(pInterface, typeof(IHVRSystem)); + } + public void GetRecommendedRenderTargetSize(ref uint pnWidth,ref uint pnHeight) + { + pnWidth = 0; + pnHeight = 0; + FnTable.GetRecommendedRenderTargetSize(ref pnWidth,ref pnHeight); + } + public HVRMatrix44_t GetProjectionMatrix(EHVREye eEye,float fNearZ,float fFarZ, EHVRTextureType eProjType) + { + HVRMatrix44_t result = FnTable.GetProjectionMatrix(eEye,fNearZ,fFarZ,eProjType); + return result; + } + public void GetProjectionRaw(EHVREye eEye,ref float pfLeft,ref float pfRight,ref float pfTop,ref float pfBottom) + { + pfLeft = 0; + pfRight = 0; + pfTop = 0; + pfBottom = 0; + FnTable.GetProjectionRaw(eEye,ref pfLeft,ref pfRight,ref pfTop,ref pfBottom); + } + + public HVRMatrix34_t GetEyeToHeadTransform(EHVREye eEye) + { + HVRMatrix34_t result = FnTable.GetEyeToHeadTransform(eEye); + return result; + } + public bool GetTimeSinceLastVsync(ref float pfSecondsSinceLastVsync,ref ulong pulFrameCounter) + { + pfSecondsSinceLastVsync = 0; + pulFrameCounter = 0; + bool result = FnTable.GetTimeSinceLastVsync(ref pfSecondsSinceLastVsync,ref pulFrameCounter); + return result; + } + public void GetDeviceToAbsoluteTrackingPose(EHVRTrackingUniverseOrigin eOrigin,float fPredictedSecondsToPhotonsFromNow,HVRTrackedDevicePose_t [] pTrackedDevicePoseArray) + { + FnTable.GetDeviceToAbsoluteTrackingPose(eOrigin,fPredictedSecondsToPhotonsFromNow,pTrackedDevicePoseArray,(uint) pTrackedDevicePoseArray.Length); + } + public HVRMatrix34_t GetRawZeroPoseToStandingAbsoluteTrackingPose() + { + HVRMatrix34_t result = FnTable.GetRawZeroPoseToStandingAbsoluteTrackingPose(); + return result; + } + public uint GetTrackedDeviceIndexForControllerRole(EHVRTrackedControllerRole unDeviceType) + { + uint result = FnTable.GetTrackedDeviceIndexForControllerRole(unDeviceType); + return result; + } + public EHVRTrackedControllerRole GetControllerRoleForTrackedDeviceIndex(uint unDeviceIndex) + { + EHVRTrackedControllerRole result = FnTable.GetControllerRoleForTrackedDeviceIndex(unDeviceIndex); + return result; + } + public EHVRTrackedDeviceClass GetTrackedDeviceClass(uint unDeviceIndex) + { + EHVRTrackedDeviceClass result = FnTable.GetTrackedDeviceClass(unDeviceIndex); + return result; + } + public bool IsTrackedDeviceConnected(uint unDeviceIndex) + { + bool result = FnTable.IsTrackedDeviceConnected(unDeviceIndex); + return result; + } + public bool GetBoolTrackedDeviceProperty(uint unDeviceIndex,EHVRTrackedDeviceProperty prop,ref EHVRTrackedPropertyError pError) + { + bool result = FnTable.GetBoolTrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public float GetFloatTrackedDeviceProperty(uint unDeviceIndex,EHVRTrackedDeviceProperty prop,ref EHVRTrackedPropertyError pError) + { + float result = FnTable.GetFloatTrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public int GetInt32TrackedDeviceProperty(uint unDeviceIndex,EHVRTrackedDeviceProperty prop,ref EHVRTrackedPropertyError pError) + { + int result = FnTable.GetInt32TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public ulong GetUint64TrackedDeviceProperty(uint unDeviceIndex,EHVRTrackedDeviceProperty prop,ref EHVRTrackedPropertyError pError) + { + ulong result = FnTable.GetUint64TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public uint GetStringTrackedDeviceProperty(uint unDeviceIndex,EHVRTrackedDeviceProperty prop,System.Text.StringBuilder pchValue,uint unBufferSize,ref EHVRTrackedPropertyError pError) + { + uint result = FnTable.GetStringTrackedDeviceProperty(unDeviceIndex,prop,pchValue,unBufferSize,ref pError); + return result; + } + public HVRMatrix34_t GetMatrix34TrackedDeviceProperty(uint unDeviceIndex,EHVRTrackedDeviceProperty prop,ref EHVRTrackedPropertyError pError) + { + HVRMatrix34_t result = FnTable.GetMatrix34TrackedDeviceProperty(unDeviceIndex,prop,ref pError); + return result; + } + public bool PollNextEvent(ref HVREvent_t pEvent,uint uncbVREvent) + { + bool result = FnTable.PollNextEvent(ref pEvent,uncbVREvent); + return result; + } + public HVRHiddenAreaMesh_t GetHiddenAreaMesh(EHVREye eEye, EHVRHiddenAreaMeshType type) + { + HVRHiddenAreaMesh_t result = FnTable.GetHiddenAreaMesh(eEye, type); + return result; + } + public bool GetControllerState(uint unControllerDeviceIndex,ref HVRControllerState_t pControllerState, uint unControllerStateSize) + { + bool result = FnTable.GetControllerState(unControllerDeviceIndex,ref pControllerState); + return result; + } + public bool GetControllerStateWithPose(EHVRTrackingUniverseOrigin eOrigin,uint unControllerDeviceIndex,ref HVRControllerState_t pControllerState, uint unControllerStateSize, ref HVRTrackedDevicePose_t pTrackedDevicePose) + { + bool result = FnTable.GetControllerStateWithPose(eOrigin,unControllerDeviceIndex,ref pControllerState, (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(HVRControllerState_t)),ref pTrackedDevicePose); + return result; + } + public void TriggerHapticPulse(uint unControllerDeviceIndex,uint unAxisId,char usDurationMicroSec) + { + FnTable.TriggerHapticPulse(unControllerDeviceIndex,unAxisId,usDurationMicroSec); + } + public bool IsInputFocusCapturedByAnotherProcess() + { + return FnTable.IsInputFocusCapturedByAnotherProcess(); + } + public bool GetPlayAreaSize(ref float pSizeX,ref float pSizeZ) + { + pSizeX = 0; + pSizeZ = 0; + bool result = FnTable.GetPlayAreaSize(ref pSizeX,ref pSizeZ); + return result; + } + public bool GetPlayAreaRect(ref HVRQuad_t rect) + { + bool result = FnTable.GetPlayAreaRect(ref rect); + return result; + } + public HVRChaperoneCalibrationState GetCalibrationState() + { + HVRChaperoneCalibrationState result = FnTable.GetCalibrationState(); + return result; + } +} + +public class CHVRCompositor +{ + IHVRCompositor FnTable; + internal CHVRCompositor(IntPtr pInterface) + { + FnTable = (IHVRCompositor)Marshal.PtrToStructure(pInterface, typeof(IHVRCompositor)); + } + public void SetTrackingSpace(EHVRTrackingUniverseOrigin eTrackingOrigin) + { + FnTable.SetTrackingSpace(eTrackingOrigin); + } + public EHVRTrackingUniverseOrigin GetTrackingSpace() + { + return FnTable.GetTrackingSpace(); + } + public EHVRCompositorError WaitGetPoses(HVRTrackedDevicePose_t [] pRenderPoseArray,HVRTrackedDevicePose_t [] pGamePoseArray) + { + EHVRCompositorError result = FnTable.WaitGetPoses(pRenderPoseArray,(uint) pRenderPoseArray.Length,pGamePoseArray,(uint) pGamePoseArray.Length); + return result; + } + public EHVRCompositorError GetLastPoses(HVRTrackedDevicePose_t [] pRenderPoseArray,HVRTrackedDevicePose_t [] pGamePoseArray) + { + EHVRCompositorError result = FnTable.GetLastPoses(pRenderPoseArray,(uint) pRenderPoseArray.Length,pGamePoseArray,(uint) pGamePoseArray.Length); + return result; + } + public EHVRCompositorError Submit(EHVREye eEye,ref HVRTexture_t pTexture,ref HVRTextureBounds_t pBounds,EHVRSubmitFlags nSubmitFlags) + { + EHVRCompositorError result = FnTable.Submit(eEye,ref pTexture,ref pBounds,nSubmitFlags); + return result; + } + public void PostPresentHandoff() + { + FnTable.PostPresentHandoff(); + } + public void FadeToColor(float fSeconds,float fRed,float fGreen,float fBlue,float fAlpha,bool bBackground) + { + FnTable.FadeToColor(fSeconds,fRed,fGreen,fBlue,fAlpha,bBackground); + } + public void SuspendRendering(bool bSuspend) + { + FnTable.SuspendRendering(bSuspend); + } + + public bool CanRenderScene() + { + bool ret = FnTable.CanRenderScene(); + return ret; + } +} + +public class CHVROverlay +{ + IHVROverlay FnTable; + internal CHVROverlay(IntPtr pInterface) + { + FnTable = (IHVROverlay)Marshal.PtrToStructure(pInterface, typeof(IHVROverlay)); + } + public EHVROverlayError FindOverlay(string pchOverlayKey,ref ulong pOverlayHandle) + { + pOverlayHandle = 0; + EHVROverlayError result = FnTable.FindOverlay(pchOverlayKey,ref pOverlayHandle); + return result; + } + public EHVROverlayError CreateOverlay(string pchOverlayKey,string pchOverlayFriendlyName,ref ulong pOverlayHandle) + { + pOverlayHandle = 0; + EHVROverlayError result = FnTable.CreateOverlay(pchOverlayKey,pchOverlayFriendlyName,ref pOverlayHandle); + return result; + } + public EHVROverlayError DestroyOverlay(ulong ulOverlayHandle) + { + EHVROverlayError result = FnTable.DestroyOverlay(ulOverlayHandle); + return result; + } + public EHVROverlayError SetHighQualityOverlay(ulong ulOverlayHandle) + { + EHVROverlayError result = FnTable.SetHighQualityOverlay(ulOverlayHandle); + return result; + } + public ulong GetHighQualityOverlay() + { + ulong result = FnTable.GetHighQualityOverlay(); + return result; + } + public uint GetOverlayKey(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref EHVROverlayError pError) + { + uint result = FnTable.GetOverlayKey(ulOverlayHandle,pchValue,unBufferSize,ref pError); + return result; + } + public uint GetOverlayName(ulong ulOverlayHandle,System.Text.StringBuilder pchValue,uint unBufferSize,ref EHVROverlayError pError) + { + uint result = FnTable.GetOverlayName(ulOverlayHandle,pchValue,unBufferSize,ref pError); + return result; + } + public EHVROverlayError GetOverlayImageData(ulong ulOverlayHandle,IntPtr pvBuffer,uint unBufferSize,ref uint punWidth,ref uint punHeight) + { + punWidth = 0; + punHeight = 0; + EHVROverlayError result = FnTable.GetOverlayImageData(ulOverlayHandle,pvBuffer,unBufferSize,ref punWidth,ref punHeight); + return result; + } + public string GetOverlayErrorNameFromEnum(EHVROverlayError error) + { + IntPtr result = FnTable.GetOverlayErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } + public EHVROverlayError SetOverlayRenderingPid(ulong ulOverlayHandle,uint unPID) + { + EHVROverlayError result = FnTable.SetOverlayRenderingPid(ulOverlayHandle,unPID); + return result; + } + public uint GetOverlayRenderingPid(ulong ulOverlayHandle) + { + uint result = FnTable.GetOverlayRenderingPid(ulOverlayHandle); + return result; + } + public EHVROverlayError SetOverlayFlag(ulong ulOverlayHandle, HVROverlayFlags eOverlayFlag, bool bEnabled) + { + EHVROverlayError result = FnTable.SetOverlayFlag(ulOverlayHandle, eOverlayFlag, bEnabled); + return result; + } + public EHVROverlayError GetOverlayFlag(ulong ulOverlayHandle, HVROverlayFlags eOverlayFlag, ref bool bEnabled) + { + EHVROverlayError result = FnTable.GetOverlayFlag(ulOverlayHandle, eOverlayFlag, ref bEnabled); + return result; + } + public EHVROverlayError SetOverlayColor(ulong ulOverlayHandle,float fRed,float fGreen,float fBlue) + { + EHVROverlayError result = FnTable.SetOverlayColor(ulOverlayHandle,fRed,fGreen,fBlue); + return result; + } + public EHVROverlayError GetOverlayColor(ulong ulOverlayHandle,ref float pfRed,ref float pfGreen,ref float pfBlue) + { + pfRed = 0; + pfGreen = 0; + pfBlue = 0; + EHVROverlayError result = FnTable.GetOverlayColor(ulOverlayHandle,ref pfRed,ref pfGreen,ref pfBlue); + return result; + } + public EHVROverlayError SetOverlayAlpha(ulong ulOverlayHandle,float fAlpha) + { + EHVROverlayError result = FnTable.SetOverlayAlpha(ulOverlayHandle,fAlpha); + return result; + } + public EHVROverlayError GetOverlayAlpha(ulong ulOverlayHandle,ref float pfAlpha) + { + pfAlpha = 0; + EHVROverlayError result = FnTable.GetOverlayAlpha(ulOverlayHandle,ref pfAlpha); + return result; + } + public EHVROverlayError SetOverlayTexelAspect(ulong ulOverlayHandle,float fTexelAspect) + { + EHVROverlayError result = FnTable.SetOverlayTexelAspect(ulOverlayHandle,fTexelAspect); + return result; + } + public EHVROverlayError GetOverlayTexelAspect(ulong ulOverlayHandle,ref float pfTexelAspect) + { + pfTexelAspect = 0; + EHVROverlayError result = FnTable.GetOverlayTexelAspect(ulOverlayHandle,ref pfTexelAspect); + return result; + } + public EHVROverlayError SetOverlaySortOrder(ulong ulOverlayHandle,uint unSortOrder) + { + EHVROverlayError result = FnTable.SetOverlaySortOrder(ulOverlayHandle,unSortOrder); + return result; + } + public EHVROverlayError GetOverlaySortOrder(ulong ulOverlayHandle,ref uint punSortOrder) + { + punSortOrder = 0; + EHVROverlayError result = FnTable.GetOverlaySortOrder(ulOverlayHandle,ref punSortOrder); + return result; + } + public EHVROverlayError SetOverlayWidthInMeters(ulong ulOverlayHandle,float fWidthInMeters) + { + EHVROverlayError result = FnTable.SetOverlayWidthInMeters(ulOverlayHandle,fWidthInMeters); + return result; + } + public EHVROverlayError GetOverlayWidthInMeters(ulong ulOverlayHandle,ref float pfWidthInMeters) + { + pfWidthInMeters = 0; + EHVROverlayError result = FnTable.GetOverlayWidthInMeters(ulOverlayHandle,ref pfWidthInMeters); + return result; + } + public EHVROverlayError SetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, float fMinDistanceInMeters, float fMaxDistanceInMeters) + { + EHVROverlayError result = FnTable.SetOverlayAutoCurveDistanceRangeInMeters(ulOverlayHandle, fMinDistanceInMeters, fMaxDistanceInMeters); + return result; + } + public EHVROverlayError GetOverlayAutoCurveDistanceRangeInMeters(ulong ulOverlayHandle, ref float fMinDistanceInMeters, ref float fMaxDistanceInMeters) + { + EHVROverlayError result = FnTable.GetOverlayAutoCurveDistanceRangeInMeters(ulOverlayHandle, ref fMinDistanceInMeters, ref fMaxDistanceInMeters); + return result; + } + public EHVROverlayError SetOverlayTextureBounds(ulong ulOverlayHandle, ref HVRTextureBounds_t pOverlayTextureBounds) + { + EHVROverlayError result = FnTable.SetOverlayTextureBounds(ulOverlayHandle, ref pOverlayTextureBounds); + return result; + } + public EHVROverlayError GetOverlayTextureBounds(ulong ulOverlayHandle, ref HVRTextureBounds_t pOverlayTextureBounds) + { + EHVROverlayError result = FnTable.GetOverlayTextureBounds(ulOverlayHandle, ref pOverlayTextureBounds); + return result; + } + public EHVROverlayError GetOverlayTransformType(ulong ulOverlayHandle,ref HVROverlayTransformType peTransformType) + { + EHVROverlayError result = FnTable.GetOverlayTransformType(ulOverlayHandle,ref peTransformType); + return result; + } + public EHVROverlayError SetOverlayTransformAbsolute(ulong ulOverlayHandle,EHVRTrackingUniverseOrigin eTrackingOrigin,ref HVRMatrix34_t pmatTrackingOriginToOverlayTransform) + { + EHVROverlayError result = FnTable.SetOverlayTransformAbsolute(ulOverlayHandle,eTrackingOrigin,ref pmatTrackingOriginToOverlayTransform); + return result; + } + public EHVROverlayError GetOverlayTransformAbsolute(ulong ulOverlayHandle,ref EHVRTrackingUniverseOrigin peTrackingOrigin,ref HVRMatrix34_t pmatTrackingOriginToOverlayTransform) + { + EHVROverlayError result = FnTable.GetOverlayTransformAbsolute(ulOverlayHandle,ref peTrackingOrigin,ref pmatTrackingOriginToOverlayTransform); + return result; + } + public EHVROverlayError SetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle,uint unTrackedDevice,ref HVRMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + EHVROverlayError result = FnTable.SetOverlayTransformTrackedDeviceRelative(ulOverlayHandle,unTrackedDevice,ref pmatTrackedDeviceToOverlayTransform); + return result; + } + public EHVROverlayError GetOverlayTransformTrackedDeviceRelative(ulong ulOverlayHandle,ref uint punTrackedDevice,ref HVRMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + punTrackedDevice = 0; + EHVROverlayError result = FnTable.GetOverlayTransformTrackedDeviceRelative(ulOverlayHandle,ref punTrackedDevice,ref pmatTrackedDeviceToOverlayTransform); + return result; + } + public EHVROverlayError SetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle,uint unDeviceIndex,string pchComponentName) + { + EHVROverlayError result = FnTable.SetOverlayTransformTrackedDeviceComponent(ulOverlayHandle,unDeviceIndex,pchComponentName); + return result; + } + public EHVROverlayError GetOverlayTransformTrackedDeviceComponent(ulong ulOverlayHandle,ref uint punDeviceIndex,string pchComponentName,uint unComponentNameSize) + { + punDeviceIndex = 0; + EHVROverlayError result = FnTable.GetOverlayTransformTrackedDeviceComponent(ulOverlayHandle,ref punDeviceIndex,pchComponentName,unComponentNameSize); + return result; + } + public EHVROverlayError ShowOverlay(ulong ulOverlayHandle) + { + EHVROverlayError result = FnTable.ShowOverlay(ulOverlayHandle); + return result; + } + public EHVROverlayError HideOverlay(ulong ulOverlayHandle) + { + EHVROverlayError result = FnTable.HideOverlay(ulOverlayHandle); + return result; + } + public bool IsOverlayVisible(ulong ulOverlayHandle) + { + bool result = FnTable.IsOverlayVisible(ulOverlayHandle); + return result; + } + public EHVROverlayError SetOverlayTexture(ulong ulOverlayHandle,ref HVRTexture_t pTexture) + { + EHVROverlayError result = FnTable.SetOverlayTexture(ulOverlayHandle,ref pTexture); + return result; + } + public EHVROverlayError ClearOverlayTexture(ulong ulOverlayHandle) + { + EHVROverlayError result = FnTable.ClearOverlayTexture(ulOverlayHandle); + return result; + } + public EHVROverlayError SetOverlayRaw(ulong ulOverlayHandle,IntPtr pvBuffer,uint unWidth,uint unHeight,uint unDepth) + { + EHVROverlayError result = FnTable.SetOverlayRaw(ulOverlayHandle,pvBuffer,unWidth,unHeight,unDepth); + return result; + } + public EHVROverlayError SetOverlayFromFile(ulong ulOverlayHandle,string pchFilePath) + { + EHVROverlayError result = FnTable.SetOverlayFromFile(ulOverlayHandle,pchFilePath); + return result; + } + public EHVROverlayError GetOverlayTexture(ulong ulOverlayHandle,ref IntPtr pNativeTextureHandle,IntPtr pNativeTextureRef,ref uint pWidth,ref uint pHeight,ref uint pNativeFormat,ref EHVRTextureType pAPI,ref EHVRColorSpace pColorSpace) + { + pWidth = 0; + pHeight = 0; + pNativeFormat = 0; + EHVROverlayError result = FnTable.GetOverlayTexture(ulOverlayHandle,ref pNativeTextureHandle,pNativeTextureRef,ref pWidth,ref pHeight,ref pNativeFormat,ref pAPI,ref pColorSpace); + return result; + } + public EHVROverlayError GetOverlayTextureSize(ulong ulOverlayHandle,ref uint pWidth,ref uint pHeight) + { + pWidth = 0; + pHeight = 0; + EHVROverlayError result = FnTable.GetOverlayTextureSize(ulOverlayHandle,ref pWidth,ref pHeight); + return result; + } + public EHVROverlayError SetOverlayStereoTexture(ulong ulOverlayHandle, ref HVRTexture_t pTexture, EHVREye eye) + { + EHVROverlayError result = FnTable.SetOverlayStereoTexture(ulOverlayHandle, ref pTexture, eye); + return result; + } + public EHVROverlayError SetOverlayStereoMode(ulong ulOverlayHandle, bool bEnabled) + { + EHVROverlayError result = FnTable.SetOverlayStereoMode(ulOverlayHandle, bEnabled); + return result; + } + public EHVROverlayError SetOverlayStereoTextureBounds(ulong ulOverlayHandle, ref HVRTextureBounds_t pOverlayTextureBounds, EHVREye eye) + { + EHVROverlayError result = FnTable.SetOverlayStereoTextureBounds(ulOverlayHandle, ref pOverlayTextureBounds, eye); + return result; + } + public EHVROverlayError SetOverlayTextureUpsideDownFlag(ulong ulOverlayHandle, bool flag) + { + EHVROverlayError result = FnTable.SetOverlayTextureUpsideDownFlag(ulOverlayHandle, flag); + return result; + } + + public EHVROverlayError CreateDesktopCaptureOverlay(uint targetHandle) + { + EHVROverlayError result = FnTable.CreateDesktopCaptureOverlay(targetHandle); + return result; + } + + public EHVROverlayError DestroyDesktopCaptureOverlay(uint targetHandle) + { + EHVROverlayError result = FnTable.DestroyDesktopCaptureOverlay(targetHandle); + return result; + } + + public EHVROverlayError SetDesktopCaptureOverlayWidth(uint targetHandle, float width) + { + EHVROverlayError result = FnTable.SetDesktopCaptureOverlayWidth(targetHandle, width); + return result; + } + + public EHVROverlayError SetDesktopCaptureOverlayAbsolutePose( + uint targetHandle, ref HVRMatrix34_t pmatTrackedDeviceToOverlayTransform) + { + EHVROverlayError result = FnTable.SetDesktopCaptureOverlayAbsolutePose(targetHandle, ref pmatTrackedDeviceToOverlayTransform); + return result; + } + + public EHVROverlayError SetDesktopCaptureOverlayCurveDistance(uint targetHandle, float minDist, float maxDist) + { + EHVROverlayError result = FnTable.SetDesktopCaptureOverlayCurveDistance(targetHandle, minDist, maxDist); + return result; + } +} + +public class CHVRRenderModels +{ + IHVRRenderModels FnTable; + internal CHVRRenderModels(IntPtr pInterface) + { + FnTable = (IHVRRenderModels)Marshal.PtrToStructure(pInterface, typeof(IHVRRenderModels)); + } + public EHVRRenderModelError LoadRenderModel_Async(string pchRenderModelName, ref IntPtr ppRenderModel) + { + EHVRRenderModelError result = FnTable.LoadRenderModel_Async(pchRenderModelName, ref ppRenderModel); + return result; + } + public void FreeRenderModel(IntPtr pRenderModel) + { + FnTable.FreeRenderModel(pRenderModel); + } + public EHVRRenderModelError LoadTexture_Async(int textureId, ref IntPtr ppTexture) + { + EHVRRenderModelError result = FnTable.LoadTexture_Async(textureId, ref ppTexture); + return result; + } + public void FreeTexture(IntPtr pTexture) + { + FnTable.FreeTexture(pTexture); + } + public EHVRRenderModelError LoadTextureD3D11_Async(int textureId, IntPtr pD3D11Device, ref IntPtr ppD3D11Texture2D) + { + EHVRRenderModelError result = FnTable.LoadTextureD3D11_Async(textureId, pD3D11Device, ref ppD3D11Texture2D); + return result; + } + public EHVRRenderModelError LoadIntoTextureD3D11_Async(int textureId, IntPtr pDstTexture) + { + EHVRRenderModelError result = FnTable.LoadIntoTextureD3D11_Async(textureId, pDstTexture); + return result; + } + public void FreeTextureD3D11(IntPtr pD3D11Texture2D) + { + FnTable.FreeTextureD3D11(pD3D11Texture2D); + } + public uint GetRenderModelName(uint unRenderModelIndex, System.Text.StringBuilder pchRenderModelName, uint unRenderModelNameLen) + { + uint result = FnTable.GetRenderModelName(unRenderModelIndex, pchRenderModelName, unRenderModelNameLen); + return result; + } + public uint GetRenderModelCount() + { + uint result = FnTable.GetRenderModelCount(); + return result; + } + public uint GetComponentCount(string pchRenderModelName) + { + uint result = FnTable.GetComponentCount(pchRenderModelName); + return result; + } + public uint GetComponentName(string pchRenderModelName, uint unComponentIndex, System.Text.StringBuilder pchComponentName, uint unComponentNameLen) + { + uint result = FnTable.GetComponentName(pchRenderModelName, unComponentIndex, pchComponentName, unComponentNameLen); + return result; + } + public ulong GetComponentButtonMask(string pchRenderModelName, string pchComponentName) + { + ulong result = FnTable.GetComponentButtonMask(pchRenderModelName, pchComponentName); + return result; + } + public uint GetComponentRenderModelName(string pchRenderModelName, string pchComponentName, System.Text.StringBuilder pchComponentRenderModelName, uint unComponentRenderModelNameLen) + { + uint result = FnTable.GetComponentRenderModelName(pchRenderModelName, pchComponentName, pchComponentRenderModelName, unComponentRenderModelNameLen); + return result; + } + public bool GetComponentStateForDevicePath(string pchRenderModelName, string pchComponentName, ulong devicePath, ref RenderModel_ControllerMode_State_t pState, ref RenderModel_ComponentState_t pComponentState) + { + bool result = FnTable.GetComponentStateForDevicePath(pchRenderModelName, pchComponentName, devicePath, ref pState, ref pComponentState); + return result; + } + // This is a terrible hack to workaround the fact that VRControllerState_t and VREvent_t were + // originally mis-compiled with the wrong packing for Linux and OSX. + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + internal delegate bool _GetComponentStatePacked(string pchRenderModelName, string pchComponentName, ref VRControllerState_t_Packed pControllerState, ref RenderModel_ControllerMode_State_t pState, ref RenderModel_ComponentState_t pComponentState); + [StructLayout(LayoutKind.Explicit)] + struct GetComponentStateUnion + { + [FieldOffset(0)] + public IHVRRenderModels._GetComponentState pGetComponentState; + [FieldOffset(0)] + public _GetComponentStatePacked pGetComponentStatePacked; + } + public bool GetComponentState(string pchRenderModelName, string pchComponentName, ref HVRControllerState_t pControllerState, ref RenderModel_ControllerMode_State_t pState, ref RenderModel_ComponentState_t pComponentState) + { +#if !UNITY_METRO + if ((System.Environment.OSVersion.Platform == System.PlatformID.MacOSX) || + (System.Environment.OSVersion.Platform == System.PlatformID.Unix)) + { + GetComponentStateUnion u; + VRControllerState_t_Packed state_packed = new VRControllerState_t_Packed(pControllerState); + u.pGetComponentStatePacked = null; + u.pGetComponentState = FnTable.GetComponentState; + bool packed_result = u.pGetComponentStatePacked(pchRenderModelName, pchComponentName, ref state_packed, ref pState, ref pComponentState); + + state_packed.Unpack(ref pControllerState); + return packed_result; + } +#endif + bool result = FnTable.GetComponentState(pchRenderModelName, pchComponentName, ref pControllerState, ref pState, ref pComponentState); + return result; + } + public bool RenderModelHasComponent(string pchRenderModelName, string pchComponentName) + { + bool result = FnTable.RenderModelHasComponent(pchRenderModelName, pchComponentName); + return result; + } + public uint GetRenderModelThumbnailURL(string pchRenderModelName, System.Text.StringBuilder pchThumbnailURL, uint unThumbnailURLLen, ref EHVRRenderModelError peError) + { + uint result = FnTable.GetRenderModelThumbnailURL(pchRenderModelName, pchThumbnailURL, unThumbnailURLLen, ref peError); + return result; + } + public uint GetRenderModelOriginalPath(string pchRenderModelName, System.Text.StringBuilder pchOriginalPath, uint unOriginalPathLen, ref EHVRRenderModelError peError) + { + uint result = FnTable.GetRenderModelOriginalPath(pchRenderModelName, pchOriginalPath, unOriginalPathLen, ref peError); + return result; + } + public string GetRenderModelErrorNameFromEnum(EHVRRenderModelError error) + { + IntPtr result = FnTable.GetRenderModelErrorNameFromEnum(error); + return Marshal.PtrToStringAnsi(result); + } +} + + public class CHVRTrackedCamera +{ + IHVRTrackedCamera FnTable; + internal CHVRTrackedCamera(IntPtr pInterface) + { + FnTable = (IHVRTrackedCamera)Marshal.PtrToStructure(pInterface, typeof(IHVRTrackedCamera)); + } + public string GetCameraErrorNameFromEnum(EHVRTrackedCameraError eCameraError) + { + IntPtr result = FnTable.GetCameraErrorNameFromEnum(eCameraError); + return Marshal.PtrToStringAnsi(result); + } + public EHVRTrackedCameraError HasCamera(uint nDeviceIndex,ref bool pHasCamera) + { + pHasCamera = false; + EHVRTrackedCameraError result = FnTable.HasCamera(nDeviceIndex,ref pHasCamera); + return result; + } + public EHVRTrackedCameraError GetCameraFrameSize(uint nDeviceIndex,EHVRTrackedCameraFrameType eFrameType,ref uint pnWidth,ref uint pnHeight,ref uint pnFrameBufferSize) + { + pnWidth = 0; + pnHeight = 0; + pnFrameBufferSize = 0; + EHVRTrackedCameraError result = FnTable.GetCameraFrameSize(nDeviceIndex,eFrameType,ref pnWidth,ref pnHeight,ref pnFrameBufferSize); + return result; + } + public EHVRTrackedCameraError GetCameraIntrinsics(uint nDeviceIndex, uint nCameraIndex, EHVRTrackedCameraFrameType eFrameType,ref HVRVector2_t pFocalLength,ref HVRVector2_t pCenter) + { + EHVRTrackedCameraError result = FnTable.GetCameraIntrinsics(nDeviceIndex, nCameraIndex, eFrameType, ref pFocalLength,ref pCenter); + return result; + } + public EHVRTrackedCameraError GetCameraProjection(uint nDeviceIndex,uint nCameraIndex, EHVRTrackedCameraFrameType eFrameType,float flZNear,float flZFar,ref HVRMatrix44_t pProjection) + { + EHVRTrackedCameraError result = FnTable.GetCameraProjection(nDeviceIndex,nCameraIndex, eFrameType,flZNear,flZFar,ref pProjection); + return result; + } + public EHVRTrackedCameraError AcquireVideoStreamingService(uint nDeviceIndex,ref ulong pHandle) + { + pHandle = 0; + EHVRTrackedCameraError result = FnTable.AcquireVideoStreamingService(nDeviceIndex,ref pHandle); + return result; + } + public EHVRTrackedCameraError ReleaseVideoStreamingService(ulong hTrackedCamera) + { + EHVRTrackedCameraError result = FnTable.ReleaseVideoStreamingService(hTrackedCamera); + return result; + } + public EHVRTrackedCameraError GetVideoStreamFrameBuffer(ulong hTrackedCamera,EHVRTrackedCameraFrameType eFrameType,IntPtr pFrameBuffer,uint nFrameBufferSize,ref HVRCameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + EHVRTrackedCameraError result = FnTable.GetVideoStreamFrameBuffer(hTrackedCamera,eFrameType,pFrameBuffer,nFrameBufferSize,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EHVRTrackedCameraError GetVideoStreamTextureSize(uint nDeviceIndex,EHVRTrackedCameraFrameType eFrameType,ref HVRTextureBounds_t pTextureBounds,ref uint pnWidth,ref uint pnHeight) + { + pnWidth = 0; + pnHeight = 0; + EHVRTrackedCameraError result = FnTable.GetVideoStreamTextureSize(nDeviceIndex,eFrameType,ref pTextureBounds,ref pnWidth,ref pnHeight); + return result; + } + public EHVRTrackedCameraError GetVideoStreamTextureD3D11(ulong hTrackedCamera,EHVRTrackedCameraFrameType eFrameType,IntPtr pD3D11DeviceOrResource,ref IntPtr ppD3D11ShaderResourceView,ref HVRCameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + EHVRTrackedCameraError result = FnTable.GetVideoStreamTextureD3D11(hTrackedCamera,eFrameType,pD3D11DeviceOrResource,ref ppD3D11ShaderResourceView,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EHVRTrackedCameraError GetVideoStreamTextureGL(ulong hTrackedCamera,EHVRTrackedCameraFrameType eFrameType,ref uint pglTextureId,ref HVRCameraVideoStreamFrameHeader_t pFrameHeader,uint nFrameHeaderSize) + { + pglTextureId = 0; + EHVRTrackedCameraError result = FnTable.GetVideoStreamTextureGL(hTrackedCamera,eFrameType,ref pglTextureId,ref pFrameHeader,nFrameHeaderSize); + return result; + } + public EHVRTrackedCameraError ReleaseVideoStreamTextureGL(ulong hTrackedCamera,uint glTextureId) + { + EHVRTrackedCameraError result = FnTable.ReleaseVideoStreamTextureGL(hTrackedCamera,glTextureId); + return result; + } +} + +public class CHVRSettings +{ + IHVRSettings FnTable; + internal CHVRSettings(IntPtr pInterface) + { + FnTable = (IHVRSettings)Marshal.PtrToStructure(pInterface, typeof(IHVRSettings)); + } + public string GetSettingsErrorNameFromEnum(EHVRSettingsError eError) + { + IntPtr result = FnTable.GetSettingsErrorNameFromEnum(eError); + return Marshal.PtrToStringAnsi(result); + } + public bool Sync(bool bForce,ref EHVRSettingsError peError) + { + bool result = FnTable.Sync(bForce,ref peError); + return result; + } + public void SetBool(string pchSection,string pchSettingsKey,bool bValue,ref EHVRSettingsError peError) + { + FnTable.SetBool(pchSection,pchSettingsKey,bValue,ref peError); + } + public void SetInt32(string pchSection,string pchSettingsKey,int nValue,ref EHVRSettingsError peError) + { + FnTable.SetInt32(pchSection,pchSettingsKey,nValue,ref peError); + } + public void SetFloat(string pchSection,string pchSettingsKey,float flValue,ref EHVRSettingsError peError) + { + FnTable.SetFloat(pchSection,pchSettingsKey,flValue,ref peError); + } + public void SetString(string pchSection,string pchSettingsKey,string pchValue,ref EHVRSettingsError peError) + { + FnTable.SetString(pchSection,pchSettingsKey,pchValue,ref peError); + } + public bool GetBool(string pchSection,string pchSettingsKey,ref EHVRSettingsError peError) + { + bool result = FnTable.GetBool(pchSection,pchSettingsKey,ref peError); + return result; + } + public int GetInt32(string pchSection,string pchSettingsKey,ref EHVRSettingsError peError) + { + int result = FnTable.GetInt32(pchSection,pchSettingsKey,ref peError); + return result; + } + public float GetFloat(string pchSection,string pchSettingsKey,ref EHVRSettingsError peError) + { + float result = FnTable.GetFloat(pchSection,pchSettingsKey,ref peError); + return result; + } + public void GetString(string pchSection,string pchSettingsKey,System.Text.StringBuilder pchValue,uint unValueLen,ref EHVRSettingsError peError) + { + FnTable.GetString(pchSection,pchSettingsKey,pchValue,unValueLen,ref peError); + } + public void RemoveSection(string pchSection,ref EHVRSettingsError peError) + { + FnTable.RemoveSection(pchSection,ref peError); + } + public void RemoveKeyInSection(string pchSection,string pchSettingsKey,ref EHVRSettingsError peError) + { + FnTable.RemoveKeyInSection(pchSection,pchSettingsKey,ref peError); + } +} + +public class CHVRChaperoneSetup +{ + IHVRChaperoneSetup FnTable; + internal CHVRChaperoneSetup(IntPtr pInterface) + { + FnTable = (IHVRChaperoneSetup)Marshal.PtrToStructure(pInterface, typeof(IHVRChaperoneSetup)); + } + public bool CommitWorkingCopy(EHVRChaperoneConfigFile configFile) + { + bool result = FnTable.CommitWorkingCopy(configFile); + return result; + } + public void RevertWorkingCopy() + { + FnTable.RevertWorkingCopy(); + } + public bool GetWorkingPlayAreaSize(ref float pSizeX,ref float pSizeZ) + { + pSizeX = 0; + pSizeZ = 0; + bool result = FnTable.GetWorkingPlayAreaSize(ref pSizeX,ref pSizeZ); + return result; + } + public bool GetWorkingPlayAreaRect(ref HVRQuad_t rect) + { + bool result = FnTable.GetWorkingPlayAreaRect(ref rect); + return result; + } + public bool GetWorkingCollisionBoundsInfo(out HVRQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetWorkingCollisionBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HVRQuad_t[punQuadsCount]; + result = FnTable.GetWorkingCollisionBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool GetLiveCollisionBoundsInfo(out HVRQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetLiveCollisionBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HVRQuad_t[punQuadsCount]; + result = FnTable.GetLiveCollisionBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool GetWorkingSeatedZeroPoseToRawTrackingPose(ref HVRMatrix34_t pmatSeatedZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetWorkingSeatedZeroPoseToRawTrackingPose(ref pmatSeatedZeroPoseToRawTrackingPose); + return result; + } + public bool GetWorkingStandingZeroPoseToRawTrackingPose(ref HVRMatrix34_t pmatStandingZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetWorkingStandingZeroPoseToRawTrackingPose(ref pmatStandingZeroPoseToRawTrackingPose); + return result; + } + public void SetWorkingPlayAreaSize(float sizeX,float sizeZ) + { + FnTable.SetWorkingPlayAreaSize(sizeX,sizeZ); + } + public void SetWorkingCollisionBoundsInfo(HVRQuad_t [] pQuadsBuffer) + { + FnTable.SetWorkingCollisionBoundsInfo(pQuadsBuffer,(uint) pQuadsBuffer.Length); + } + public void SetWorkingSeatedZeroPoseToRawTrackingPose(ref HVRMatrix34_t pMatSeatedZeroPoseToRawTrackingPose) + { + FnTable.SetWorkingSeatedZeroPoseToRawTrackingPose(ref pMatSeatedZeroPoseToRawTrackingPose); + } + public void SetWorkingStandingZeroPoseToRawTrackingPose(ref HVRMatrix34_t pMatStandingZeroPoseToRawTrackingPose) + { + FnTable.SetWorkingStandingZeroPoseToRawTrackingPose(ref pMatStandingZeroPoseToRawTrackingPose); + } + public void ReloadFromDisk(EHVRChaperoneConfigFile configFile) + { + FnTable.ReloadFromDisk(configFile); + } + public bool GetLiveSeatedZeroPoseToRawTrackingPose(ref HVRMatrix34_t pmatSeatedZeroPoseToRawTrackingPose) + { + bool result = FnTable.GetLiveSeatedZeroPoseToRawTrackingPose(ref pmatSeatedZeroPoseToRawTrackingPose); + return result; + } + public void SetWorkingCollisionBoundsTagsInfo(byte [] pTagsBuffer) + { + FnTable.SetWorkingCollisionBoundsTagsInfo(pTagsBuffer,(uint) pTagsBuffer.Length); + } + public bool GetLiveCollisionBoundsTagsInfo(out byte [] pTagsBuffer) + { + uint punTagCount = 0; + bool result = FnTable.GetLiveCollisionBoundsTagsInfo(null,ref punTagCount); + pTagsBuffer= new byte[punTagCount]; + result = FnTable.GetLiveCollisionBoundsTagsInfo(pTagsBuffer,ref punTagCount); + return result; + } + public bool SetWorkingPhysicalBoundsInfo(HVRQuad_t [] pQuadsBuffer) + { + bool result = FnTable.SetWorkingPhysicalBoundsInfo(pQuadsBuffer,(uint) pQuadsBuffer.Length); + return result; + } + public bool GetLivePhysicalBoundsInfo(out HVRQuad_t [] pQuadsBuffer) + { + uint punQuadsCount = 0; + bool result = FnTable.GetLivePhysicalBoundsInfo(null,ref punQuadsCount); + pQuadsBuffer= new HVRQuad_t[punQuadsCount]; + result = FnTable.GetLivePhysicalBoundsInfo(pQuadsBuffer,ref punQuadsCount); + return result; + } + public bool ExportLiveToBuffer(System.Text.StringBuilder pBuffer,ref uint pnBufferLength) + { + pnBufferLength = 0; + bool result = FnTable.ExportLiveToBuffer(pBuffer,ref pnBufferLength); + return result; + } + public bool ImportFromBufferToWorking(string pBuffer,uint nImportFlags) + { + bool result = FnTable.ImportFromBufferToWorking(pBuffer,nImportFlags); + return result; + } +} + +public class HVRInterop +{ + [DllImportAttribute("ViveVR_api", EntryPoint = "HVR_Init")] + internal static extern EHVRErrorCode HVR_InitInternal(EHVRApplicationType eApplicationType); + [DllImportAttribute("ViveVR_api", EntryPoint = "HVR_ShutDown")] + internal static extern EHVRErrorCode HVR_ShutdownInternal(); + [DllImportAttribute("ViveVR_api", EntryPoint = "HVR_GetGenericInterface")] + internal static extern IntPtr HVR_GetGenericInterface([In, MarshalAs(UnmanagedType.LPStr)] string pchInterfaceVersion, ref EHVRErrorCode peError); +} + +public enum EHVREye +{ + EHVREye_Left = 0, + EHVREye_Right = 1, +} + +public enum EHVRTextureType +{ + EHVRTextureType_DirectX = 0, + EHVRTextureType_OpenGL = 1, + EHVRTextureType_Vulkan = 2, + EHVRTextureType_IOSurface = 3, + EHVRTextureType_DirectX12 = 4, +} + +public enum EHVRColorSpace +{ + EHVRColorSpace_Auto = 0, + EHVRColorSpace_Gamma = 1, + EHVRColorSpace_Linear = 2, +} + +public enum EHVRSubmitFlags +{ + EHVRSubmitFlags_Default = 0, + EHVRSubmitFlags_LensDistortionAlreadyApplied = 1, + EHVRSubmitFlags_GlRenderBuffer = 2, + EHVRSubmitFlags_Reserved = 4, + EHVRSubmitFlags_TextureWithPose = 8, +} + +public enum EHVRTrackingUniverseOrigin +{ + EHVRTrackingUniverseOrigin_Seated = 0, + EHVRTrackingUniverseOrigin_Standing = 1, + EHVRTrackingUniverseOrigin_RawAndUncalibrated = 2, +} + +public enum EHVRTrackingResult +{ + EHVRTrackingResult_Uninitialized = 1, + EHVRTrackingResult_Calibrating_InProgress = 100, + EHVRTrackingResult_Calibrating_OutOfRange = 101, + EHVRTrackingResult_Running_OK = 200, + EHVRTrackingResult_Running_OutOfRange = 201, +} + +public enum EHVRTrackedControllerRole +{ + EHVRTrackedControllerRole_Invalid = 0, + EHVRTrackedControllerRole_LeftHand = 1, + EHVRTrackedControllerRole_RightHand = 2, +} + +public enum EHVRTrackedDeviceClass +{ + EHVRTrackedDeviceClass_Invalid = 0, + EHVRTrackedDeviceClass_HMD = 1, + EHVRTrackedDeviceClass_Controller = 2, + EHVRTrackedDeviceClass_GenericTracker = 3, + EHVRTrackedDeviceClass_TrackingReference = 4, +} + +public enum EHVRApplicationType +{ + EHVRApplication_Other = 0, + EHVRApplication_Scene = 1, + EHVRApplication_Overlay = 2, + EHVRApplication_Background = 3, + EHVRApplication_Utility = 4, + EHVRApplication_VRMonitor = 5, + EHVRApplication_Max = 6, +} + +public enum EHVRTrackedDeviceProperty +{ + EHVRTrackedDeviceProperty_Invalid = 0, + EHVRTrackedDeviceProperty_TrackingSystemName_String = 1000, + EHVRTrackedDeviceProperty_ModelNumber_String = 1001, + EHVRTrackedDeviceProperty_SerialNumber_String = 1002, + EHVRTrackedDeviceProperty_RenderModelName_String = 1003, + EHVRTrackedDeviceProperty_WillDriftInYaw_Bool = 1004, + EHVRTrackedDeviceProperty_ManufacturerName_String = 1005, + EHVRTrackedDeviceProperty_TrackingFirmwareVersion_String = 1006, + EHVRTrackedDeviceProperty_HardwareRevision_String = 1007, + EHVRTrackedDeviceProperty_AllWirelessDongleDescriptions_String = 1008, + EHVRTrackedDeviceProperty_ConnectedWirelessDongle_String = 1009, + EHVRTrackedDeviceProperty_DeviceIsWireless_Bool = 1010, + EHVRTrackedDeviceProperty_DeviceIsCharging_Bool = 1011, + EHVRTrackedDeviceProperty_DeviceBatteryPercentage_Float = 1012, + EHVRTrackedDeviceProperty_StatusDisplayTransform_Matrix34 = 1013, + EHVRTrackedDeviceProperty_Firmware_UpdateAvailable_Bool = 1014, + EHVRTrackedDeviceProperty_Firmware_ManualUpdate_Bool = 1015, + EHVRTrackedDeviceProperty_Firmware_ManualUpdateURL_String = 1016, + EHVRTrackedDeviceProperty_HardwareRevision_Uint64 = 1017, + EHVRTrackedDeviceProperty_FirmwareVersion_Uint64 = 1018, + EHVRTrackedDeviceProperty_FPGAVersion_Uint64 = 1019, + EHVRTrackedDeviceProperty_VRCVersion_Uint64 = 1020, + EHVRTrackedDeviceProperty_RadioVersion_Uint64 = 1021, + EHVRTrackedDeviceProperty_DongleVersion_Uint64 = 1022, + EHVRTrackedDeviceProperty_BlockServerShutdown_Bool = 1023, + EHVRTrackedDeviceProperty_CanUnifyCoordinateSystemWithHmd_Bool = 1024, + EHVRTrackedDeviceProperty_ContainsProximitySensor_Bool = 1025, + EHVRTrackedDeviceProperty_DeviceProvidesBatteryStatus_Bool = 1026, + EHVRTrackedDeviceProperty_DeviceCanPowerOff_Bool = 1027, + EHVRTrackedDeviceProperty_Firmware_ProgrammingTarget_String = 1028, + EHVRTrackedDeviceProperty_DeviceClass_Int32 = 1029, + EHVRTrackedDeviceProperty_HasCamera_Bool = 1030, + EHVRTrackedDeviceProperty_DriverVersion_String = 1031, + EHVRTrackedDeviceProperty_Firmware_ForceUpdateRequired_Bool = 1032, + EHVRTrackedDeviceProperty_ViveSystemButtonFixRequired_Bool = 1033, + EHVRTrackedDeviceProperty_ParentDriver_Uint64 = 1034, + EHVRTrackedDeviceProperty_ResourceRoot_String = 1035, + EHVRTrackedDeviceProperty_ReportsTimeSinceVSync_Bool = 2000, + EHVRTrackedDeviceProperty_SecondsFromVsyncToPhotons_Float = 2001, + EHVRTrackedDeviceProperty_DisplayFrequency_Float = 2002, + EHVRTrackedDeviceProperty_UserIpdMeters_Float = 2003, + EHVRTrackedDeviceProperty_CurrentUniverseId_Uint64 = 2004, + EHVRTrackedDeviceProperty_PreviousUniverseId_Uint64 = 2005, + EHVRTrackedDeviceProperty_DisplayFirmwareVersion_Uint64 = 2006, + EHVRTrackedDeviceProperty_IsOnDesktop_Bool = 2007, + EHVRTrackedDeviceProperty_DisplayMCType_Int32 = 2008, + EHVRTrackedDeviceProperty_DisplayMCOffset_Float = 2009, + EHVRTrackedDeviceProperty_DisplayMCScale_Float = 2010, + EHVRTrackedDeviceProperty_EdidVendorID_Int32 = 2011, + EHVRTrackedDeviceProperty_DisplayMCImageLeft_String = 2012, + EHVRTrackedDeviceProperty_DisplayMCImageRight_String = 2013, + EHVRTrackedDeviceProperty_DisplayGCBlackClamp_Float = 2014, + EHVRTrackedDeviceProperty_EdidProductID_Int32 = 2015, + EHVRTrackedDeviceProperty_CameraToHeadTransform_Matrix34 = 2016, + EHVRTrackedDeviceProperty_DisplayGCType_Int32 = 2017, + EHVRTrackedDeviceProperty_DisplayGCOffset_Float = 2018, + EHVRTrackedDeviceProperty_DisplayGCScale_Float = 2019, + EHVRTrackedDeviceProperty_DisplayGCPrescale_Float = 2020, + EHVRTrackedDeviceProperty_DisplayGCImage_String = 2021, + EHVRTrackedDeviceProperty_LensCenterLeftU_Float = 2022, + EHVRTrackedDeviceProperty_LensCenterLeftV_Float = 2023, + EHVRTrackedDeviceProperty_LensCenterRightU_Float = 2024, + EHVRTrackedDeviceProperty_LensCenterRightV_Float = 2025, + EHVRTrackedDeviceProperty_UserHeadToEyeDepthMeters_Float = 2026, + EHVRTrackedDeviceProperty_CameraFirmwareVersion_Uint64 = 2027, + EHVRTrackedDeviceProperty_CameraFirmwareDescription_String = 2028, + EHVRTrackedDeviceProperty_DisplayFPGAVersion_Uint64 = 2029, + EHVRTrackedDeviceProperty_DisplayBootloaderVersion_Uint64 = 2030, + EHVRTrackedDeviceProperty_DisplayHardwareVersion_Uint64 = 2031, + EHVRTrackedDeviceProperty_AudioFirmwareVersion_Uint64 = 2032, + EHVRTrackedDeviceProperty_CameraCompatibilityMode_Int32 = 2033, + EHVRTrackedDeviceProperty_ScreenshotHorizontalFieldOfViewDegrees_Float = 2034, + EHVRTrackedDeviceProperty_ScreenshotVerticalFieldOfViewDegrees_Float = 2035, + EHVRTrackedDeviceProperty_DisplaySuppressed_Bool = 2036, + EHVRTrackedDeviceProperty_DisplayAllowNightMode_Bool = 2037, + EHVRTrackedDeviceProperty_DisplayMCImageWidth_Int32 = 2038, + EHVRTrackedDeviceProperty_DisplayMCImageHeight_Int32 = 2039, + EHVRTrackedDeviceProperty_DisplayMCImageNumChannels_Int32 = 2040, + EHVRTrackedDeviceProperty_DisplayMCImageData_Binary = 2041, + EHVRTrackedDeviceProperty_SecondsFromPhotonsToVblank_Float = 2042, + EHVRTrackedDeviceProperty_DriverDirectModeSendsVsyncEvents_Bool = 2043, + EHVRTrackedDeviceProperty_DisplayDebugMode_Bool = 2044, + EHVRTrackedDeviceProperty_GraphicsAdapterLuid_Uint64 = 2045, + EHVRTrackedDeviceProperty_AttachedDeviceId_String = 3000, + EHVRTrackedDeviceProperty_SupportedButtons_Uint64 = 3001, + EHVRTrackedDeviceProperty_Axis0Type_Int32 = 3002, + EHVRTrackedDeviceProperty_Axis1Type_Int32 = 3003, + EHVRTrackedDeviceProperty_Axis2Type_Int32 = 3004, + EHVRTrackedDeviceProperty_Axis3Type_Int32 = 3005, + EHVRTrackedDeviceProperty_Axis4Type_Int32 = 3006, + EHVRTrackedDeviceProperty_ControllerRoleHint_Int32 = 3007, + EHVRTrackedDeviceProperty_FieldOfViewLeftDegrees_Float = 4000, + EHVRTrackedDeviceProperty_FieldOfViewRightDegrees_Float = 4001, + EHVRTrackedDeviceProperty_FieldOfViewTopDegrees_Float = 4002, + EHVRTrackedDeviceProperty_FieldOfViewBottomDegrees_Float = 4003, + EHVRTrackedDeviceProperty_TrackingRangeMinimumMeters_Float = 4004, + EHVRTrackedDeviceProperty_TrackingRangeMaximumMeters_Float = 4005, + EHVRTrackedDeviceProperty_ModeLabel_String = 4006, + EHVRTrackedDeviceProperty_IconPathName_String = 5000, + EHVRTrackedDeviceProperty_NamedIconPathDeviceOff_String = 5001, + EHVRTrackedDeviceProperty_NamedIconPathDeviceSearching_String = 5002, + EHVRTrackedDeviceProperty_NamedIconPathDeviceSearchingAlert_String = 5003, + EHVRTrackedDeviceProperty_NamedIconPathDeviceReady_String = 5004, + EHVRTrackedDeviceProperty_NamedIconPathDeviceReadyAlert_String = 5005, + EHVRTrackedDeviceProperty_NamedIconPathDeviceNotReady_String = 5006, + EHVRTrackedDeviceProperty_NamedIconPathDeviceStandby_String = 5007, + EHVRTrackedDeviceProperty_NamedIconPathDeviceAlertLow_String = 5008, + EHVRTrackedDeviceProperty_DisplayHiddenArea_Binary_Start = 5100, + EHVRTrackedDeviceProperty_DisplayHiddenArea_Binary_End = 5150, + EHVRTrackedDeviceProperty_UserConfigPath_String = 6000, + EHVRTrackedDeviceProperty_InstallPath_String = 6001, + EHVRTrackedDeviceProperty_HasDisplayComponent_Bool = 6002, + EHVRTrackedDeviceProperty_HasControllerComponent_Bool = 6003, + EHVRTrackedDeviceProperty_HasCameraComponent_Bool = 6004, + EHVRTrackedDeviceProperty_HasDriverDirectModeComponent_Bool = 6005, + EHVRTrackedDeviceProperty_HasVirtualDisplayComponent_Bool = 6006, + EHVRTrackedDeviceProperty_VendorSpecific_Reserved_Start = 10000, + EHVRTrackedDeviceProperty_VendorSpecific_Reserved_End = 10999, +} + +public enum EHVRTrackedPropertyError +{ + EHVRTrackedPropertyError_Success = 0, + EHVRTrackedPropertyError_WrongDataType = 1, + EHVRTrackedPropertyError_WrongDeviceClass = 2, + EHVRTrackedPropertyError_BufferTooSmall = 3, + EHVRTrackedPropertyError_UnknownProperty = 4, + EHVRTrackedPropertyError_InvalidDevice = 5, + EHVRTrackedPropertyError_CouldNotContactServer = 6, + EHVRTrackedPropertyError_ValueNotProvidedByDevice = 7, + EHVRTrackedPropertyError_StringExceedsMaximumLength = 8, + EHVRTrackedPropertyError_NotYetAvailable = 9, + EHVRTrackedPropertyError_PermissionDenied = 10, + EHVRTrackedPropertyError_InvalidOperation = 11, +} + +public enum EHVRHiddenAreaMeshType +{ + EHVRHiddenAreaMeshType_Standard = 0, + EHVRHiddenAreaMeshType_Inverse = 1, + EHVRHiddenAreaMeshType_LineLoop = 2, + EHVRHiddenAreaMeshType_Max = 3, +} + +public enum EHVRButtonId +{ + EHVRButtonId_System = 0, + EHVRButtonId_ApplicationMenu = 1, + EHVRButtonId_Grip = 2, + EHVRButtonId_DPad_Left = 3, + EHVRButtonId_DPad_Up = 4, + EHVRButtonId_DPad_Right = 5, + EHVRButtonId_DPad_Down = 6, + EHVRButtonId_A = 7, + EHVRButtonId_ProximitySensor = 31, + EHVRButtonId_Axis0 = 32, + EHVRButtonId_Axis1 = 33, + EHVRButtonId_Axis2 = 34, + EHVRButtonId_Axis3 = 35, + EHVRButtonId_Axis4 = 36, + EVRButton_Touchpad = 32, + EVRButton_Trigger = 33, + EVRButton_Dashboard_Back = 2, + EHVRButtonId_Max = 64, +} + +public enum EHVRControllerAxisType +{ + EHVRControllerAxisType_None = 0, + EHVRControllerAxisType_TrackPad = 1, + EHVRControllerAxisType_Joystick = 2, + EHVRControllerAxisType_Trigger = 3, +} + + + public enum HVROverlayTransformType +{ + HVROverlayTransformType_Absolute = 0, + HVROverlayTransformType_TrackedDeviceRelative = 1, + HVROverlayTransformType_SystemOverlay = 2, + HVROverlayTransformType_TrackedComponent = 3, +} + +public enum EHVREventType +{ + EHVREventType_None = 0, + EHVREventType_TrackedDeviceActivated = 100, + EHVREventType_TrackedDeviceDeactivated = 101, + EHVREventType_TrackedDeviceUpdated = 102, + EHVREventType_TrackedDeviceUserInteractionStarted = 103, + EHVREventType_TrackedDeviceUserInteractionEnded = 104, + EHVREventType_IpdChanged = 105, + EHVREventType_EnterStandbyMode = 106, + EHVREventType_LeaveStandbyMode = 107, + EHVREventType_TrackedDeviceRoleChanged = 108, + EHVREventType_WatchdogWakeUpRequested = 109, + EHVREventType_LensDistortionChanged = 110, + EHVREventType_PropertyChanged = 111, + EHVREventType_ButtonPress = 200, + EHVREventType_ButtonUnpress = 201, + EHVREventType_ButtonTouch = 202, + EHVREventType_ButtonUntouch = 203, + EHVREventType_MouseMove = 300, + EHVREventType_MouseButtonDown = 301, + EHVREventType_MouseButtonUp = 302, + EHVREventType_FocusEnter = 303, + EHVREventType_FocusLeave = 304, + EHVREventType_Scroll = 305, + EHVREventType_TouchPadMove = 306, + EHVREventType_OverlayFocusChanged = 307, + EHVREventType_InputFocusCaptured = 400, + EHVREventType_InputFocusReleased = 401, + EHVREventType_SceneFocusLost = 402, + EHVREventType_SceneFocusGained = 403, + EHVREventType_SceneApplicationChanged = 404, + EHVREventType_SceneFocusChanged = 405, + EHVREventType_InputFocusChanged = 406, + EHVREventType_SceneApplicationSecondaryRenderingStarted = 407, + EHVREventType_HideRenderModels = 410, + EHVREventType_ShowRenderModels = 411, + EHVREventType_OverlayShown = 500, + EHVREventType_OverlayHidden = 501, + EHVREventType_DashboardActivated = 502, + EHVREventType_DashboardDeactivated = 503, + EHVREventType_DashboardThumbSelected = 504, + EHVREventType_DashboardRequested = 505, + EHVREventType_ResetDashboard = 506, + EHVREventType_RenderToast = 507, + EHVREventType_ImageLoaded = 508, + EHVREventType_ShowKeyboard = 509, + EHVREventType_HideKeyboard = 510, + EHVREventType_OverlayGamepadFocusGained = 511, + EHVREventType_OverlayGamepadFocusLost = 512, + EHVREventType_OverlaySharedTextureChanged = 513, + EHVREventType_DashboardGuideButtonDown = 514, + EHVREventType_DashboardGuideButtonUp = 515, + EHVREventType_ScreenshotTriggered = 516, + EHVREventType_ImageFailed = 517, + EHVREventType_DashboardOverlayCreated = 518, + EHVREventType_RequestScreenshot = 520, + EHVREventType_ScreenshotTaken = 521, + EHVREventType_ScreenshotFailed = 522, + EHVREventType_SubmitScreenshotToDashboard = 523, + EHVREventType_ScreenshotProgressToDashboard = 524, + EHVREventType_PrimaryDashboardDeviceChanged = 525, + EHVREventType_Notification_Shown = 600, + EHVREventType_Notification_Hidden = 601, + EHVREventType_Notification_BeginInteraction = 602, + EHVREventType_Notification_Destroyed = 603, + EHVREventType_Quit = 700, + EHVREventType_ProcessQuit = 701, + EHVREventType_QuitAborted_UserPrompt = 702, + EHVREventType_QuitAcknowledged = 703, + EHVREventType_DriverRequestedQuit = 704, + EHVREventType_ChaperoneDataHasChanged = 800, + EHVREventType_ChaperoneUniverseHasChanged = 801, + EHVREventType_ChaperoneTempDataHasChanged = 802, + EHVREventType_ChaperoneSettingsHaveChanged = 803, + EHVREventType_SeatedZeroPoseReset = 804, + EHVREventType_AudioSettingsHaveChanged = 820, + EHVREventType_BackgroundSettingHasChanged = 850, + EHVREventType_CameraSettingsHaveChanged = 851, + EHVREventType_ReprojectionSettingHasChanged = 852, + EHVREventType_ModelSkinSettingsHaveChanged = 853, + EHVREventType_EnvironmentSettingsHaveChanged = 854, + EHVREventType_PowerSettingsHaveChanged = 855, + EHVREventType_EnableHomeAppSettingsHaveChanged = 856, + EHVREventType_StatusUpdate = 900, + EHVREventType_MCImageUpdated = 1000, + EHVREventType_FirmwareUpdateStarted = 1100, + EHVREventType_FirmwareUpdateFinished = 1101, + EHVREventType_KeyboardClosed = 1200, + EHVREventType_KeyboardCharInput = 1201, + EHVREventType_KeyboardDone = 1202, + EHVREventType_ApplicationTransitionStarted = 1300, + EHVREventType_ApplicationTransitionAborted = 1301, + EHVREventType_ApplicationTransitionNewAppStarted = 1302, + EHVREventType_ApplicationListUpdated = 1303, + EHVREventType_ApplicationMimeTypeLoad = 1304, + EHVREventType_ApplicationTransitionNewAppLaunchComplete = 1305, + EHVREventType_ProcessConnected = 1306, + EHVREventType_ProcessDisconnected = 1307, + EHVREventType_Compositor_MirrorWindowShown = 1400, + EHVREventType_Compositor_MirrorWindowHidden = 1401, + EHVREventType_Compositor_ChaperoneBoundsShown = 1410, + EHVREventType_Compositor_ChaperoneBoundsHidden = 1411, + EHVREventType_TrackedCamera_StartVideoStream = 1500, + EHVREventType_TrackedCamera_StopVideoStream = 1501, + EHVREventType_TrackedCamera_PauseVideoStream = 1502, + EHVREventType_TrackedCamera_ResumeVideoStream = 1503, + EHVREventType_TrackedCamera_EditingSurface = 1550, + EHVREventType_PerformanceTest_EnableCapture = 1600, + EHVREventType_PerformanceTest_DisableCapture = 1601, + EHVREventType_PerformanceTest_FidelityLevel = 1602, + EHVREventType_MessageOverlay_Closed = 1650, + EHVREventType_VendorSpecific_Reserved_Start = 10000, + EHVREventType_VendorSpecific_Reserved_End = 19999, +} + +public enum EHVRCompositorError +{ + EHVRCompositorError_None = 0, + EHVRCompositorError_RequestFailed = 1, + EHVRCompositorError_IncompatibleVersion = 100, + EHVRCompositorError_DoNotHaveFocus = 101, + EHVRCompositorError_InvalidTexture = 102, + EHVRCompositorError_IsNotSceneApplication = 103, + EHVRCompositorError_TextureIsOnWrongDevice = 104, + EHVRCompositorError_TextureUsesUnsupportedFormat = 105, + EHVRCompositorError_SharedTexturesNotSupported = 106, + EHVRCompositorError_IndexOutOfRange = 107, + EHVRCompositorError_AlreadySubmitted = 108, + EHVRCompositorError_InvalidBounds = 109, +} + +public enum EHVROverlayError +{ + EHVROverlayError_None = 0, + EHVROverlayError_UnknownOverlay = 10, + EHVROverlayError_InvalidHandle = 11, + EHVROverlayError_PermissionDenied = 12, + EHVROverlayError_OverlayLimitExceeded = 13, + EHVROverlayError_WrongVisibilityType = 14, + EHVROverlayError_KeyTooLong = 15, + EHVROverlayError_NameTooLong = 16, + EHVROverlayError_KeyInUse = 17, + EHVROverlayError_WrongTransformType = 18, + EHVROverlayError_InvalidTrackedDevice = 19, + EHVROverlayError_InvalidParameter = 20, + EHVROverlayError_ThumbnailCantBeDestroyed = 21, + EHVROverlayError_ArrayTooSmall = 22, + EHVROverlayError_RequestFailed = 23, + EHVROverlayError_InvalidTexture = 24, + EHVROverlayError_UnableToLoadFile = 25, + EHVROverlayError_KeyboardAlreadyInUse = 26, + EHVROverlayError_NoNeighbor = 27, + EHVROverlayError_TooManyMaskPrimitives = 29, + EHVROverlayError_BadMaskPrimitive = 30, +} + +public enum EHVRTrackedCameraError +{ + EHVRTrackedCameraError_None = 0, + EHVRTrackedCameraError_OperationFailed = 100, + EHVRTrackedCameraError_InvalidHandle = 101, + EHVRTrackedCameraError_InvalidFrameHeaderVersion = 102, + EHVRTrackedCameraError_OutOfHandles = 103, + EHVRTrackedCameraError_IPCFailure = 104, + EHVRTrackedCameraError_NotSupportedForThisDevice = 105, + EHVRTrackedCameraError_SharedMemoryFailure = 106, + EHVRTrackedCameraError_FrameBufferingFailure = 107, + EHVRTrackedCameraError_StreamSetupFailure = 108, + EHVRTrackedCameraError_InvalidGLTextureId = 109, + EHVRTrackedCameraError_InvalidSharedTextureHandle = 110, + EHVRTrackedCameraError_FailedToGetGLTextureId = 111, + EHVRTrackedCameraError_SharedTextureFailure = 112, + EHVRTrackedCameraError_NoFrameAvailable = 113, + EHVRTrackedCameraError_InvalidArgument = 114, + EHVRTrackedCameraError_InvalidFrameBufferSize = 115, +} + +public enum EHVRTrackedCameraFrameType +{ + EHVRTrackedCameraFrameType_Distorted = 0, + EHVRTrackedCameraFrameType_Undistorted = 1, + EHVRTrackedCameraFrameType_MaximumUndistorted = 2, + EHVRTrackedCameraFrameType_MAX_CAMERA_FRAME_TYPES = 3, +} + +public enum EHVRRenderModelError +{ + None = 0, + Loading = 100, + NotSupported = 200, + InvalidArg = 300, + InvalidModel = 301, + NoShapes = 302, + MultipleShapes = 303, + TooManyVertices = 304, + MultipleTextures = 305, + BufferTooSmall = 306, + NotEnoughNormals = 307, + NotEnoughTexCoords = 308, + InvalidTexture = 400, +} + +public enum EHVRComponentProperty +{ + HVRComponentProperty_IsStatic = (1 << 0), + HVRComponentProperty_IsVisible = (1 << 1), + HVRComponentProperty_IsTouched = (1 << 2), + HVRComponentProperty_IsPressed = (1 << 3), + HVRComponentProperty_IsScrolled = (1 << 4), +} + +public enum EHVRSettingsError +{ + EVRSettingsError_None = 0, + EVRSettingsError_IPCFailed = 1, + EVRSettingsError_WriteFailed = 2, + EVRSettingsError_ReadFailed = 3, + EVRSettingsError_JsonParseFailed = 4, + EVRSettingsError_UnsetSettingHasNoDefault = 5, +} + +public enum EHVRChaperoneConfigFile +{ + EHVRChaperoneConfigFile_Live = 1, + EHVRChaperoneConfigFile_Temp = 2, +} + +public enum EHVRErrorCode +{ + HVR_ERR_None = 0, + HVR_ERR_Unknown = 1, + HVR_ERR_Init_ServerInstallationNotFound = 100, + HVR_ERR_Init_CompositorInstallationNotFound = 101, + HVR_ERR_Init_MonitorInstallationNotFound = 102, + HVR_ERR_Init_ServerProcessCannotBeLaunched = 103, + HVR_ERR_Init_CompositorProcessCannotBeLaunched = 104, + HVR_ERR_Init_MonitorProcessCannotBeLaunched = 105, + HVR_ERR_Init_DriverDLLNotFound = 106, + HVR_ERR_Init_FactoryNotFound = 107, + HVR_ERR_Init_InterfaceNotFound = 108, + HVR_ERR_Init_UserConfigDirectoryInvalid = 109, + HVR_ERR_Init_HmdNotFound = 110, + HVR_ERR_Init_NotInitialized = 111, + HVR_ERR_Init_NoConfigPath = 112, + HVR_ERR_Init_NoLogPath = 113, + HVR_ERR_Init_ServerRegistryNotFound = 114, + HVR_ERR_Init_CompositorRegistryNotFound = 115, + HVR_ERR_Init_MonitorRegistryNotFound = 116, + HVR_ERR_Init_SettingsInitFailed = 117, + HVR_ERR_Init_ShuttingDown = 118, + HVR_ERR_Init_VRMonitorNotFound = 119, + HVR_ERR_Init_VRMonitorInitFailed = 120, + HVR_ERR_Init_InvalidApplicationType = 121, + HVR_ERR_Init_ServerInstanceInitFailed = 122, + HVR_ERR_Init_CompositorInstanceInitFailed = 123, + HVR_ERR_Init_MonitorInstanceInitFailed = 124, + HVR_ERR_Init_RenderModelInstanceInitFailed = 125, + HVR_ERR_Driver_Failed = 200, + HVR_ERR_Driver_LoadFailed = 201, + HVR_ERR_Driver_InitFailed = 202, + HVR_ERR_Driver_InterfaceNotFound = 203, + HVR_ERR_Driver_HmdUnknown = 204, + HVR_ERR_Driver_RuntimeOutOfDate = 205, + HVR_ERR_IPC_ServerDisconnect = 300, + HVR_ERR_IPC_ServerInitFailed = 301, + HVR_ERR_IPC_ServerConnectFailed = 302, + HVR_ERR_IPC_CompositorInitFailed = 303, + HVR_ERR_IPC_CompositorConnectFailed = 304, + HVR_ERR_IPC_ConnectFailedAFterManyAttemps = 305, + HVR_ERR_Compositor_Failed = 400, + HVR_ERR_Compositor_GLFWInitFailed = 401, + HVR_ERR_Compositor_GLEWInitFailed = 402, + HVR_ERR_Compositor_DXInitFailed = 403, + HVR_ERR_Compositor_InitFailed = 404, + HVR_ERR_Compositor_D3D11HardwareRequired = 405, + HVR_ERR_Compositor_DirectModeFailed = 406, + HVR_ERR_Compositor_NVAPIFailed = 407, + HVR_ERR_Compositor_AMDAPIFailed = 408, + HVR_ERR_Interface_LoadCoreFailed = 501, + HVR_ERR_SDK_RegistryNotFound = 901, + HVR_ERR_SDK_LibsNotFound = 902, + HVR_ERR_SDK_LibsError = 903 +} + +public enum HVRChaperoneCalibrationState +{ + HVRChaperoneCalibrationState_OK = 1, + HVRChaperoneCalibrationState_Warning = 100, + HVRChaperoneCalibrationState_Warning_BaseStationMayHaveMoved = 101, + HVRChaperoneCalibrationState_Warning_BaseStationRemoved = 102, + HVRChaperoneCalibrationState_Warning_SeatedBoundsInvalid = 103, + HVRChaperoneCalibrationState_Error = 200, + HVRChaperoneCalibrationState_Error_BaseStationUninitialized = 201, + HVRChaperoneCalibrationState_Error_BaseStationConflict = 202, + HVRChaperoneCalibrationState_Error_PlayAreaInvalid = 203, + HVRChaperoneCalibrationState_Error_CollisionBoundsInvalid = 204, +} + +public enum HVROverlayFlags +{ + HVROverlayFlags_None = 0, + HVROverlayFlags_Curved = 1, + HVROverlayFlags_RGSS4X = 2, + HVROverlayFlags_NoDashboardTab = 3, + HVROverlayFlags_AcceptsGamepadEvents = 4, + HVROverlayFlags_ShowGamepadFocus = 5, + HVROverlayFlags_SendVRScrollEvents = 6, + HVROverlayFlags_SendVRTouchpadEvents = 7, + HVROverlayFlags_ShowTouchPadScrollWheel = 8, + HVROverlayFlags_TransferOwnershipToInternalProcess = 9, + HVROverlayFlags_SideBySide_Parallel = 10, + HVROverlayFlags_SideBySide_Crossed = 11, + HVROverlayFlags_Panorama = 12, + HVROverlayFlags_StereoPanorama = 13, + HVROverlayFlags_SortWithNonSceneOverlays = 14, + HVROverlayFlags_VisibleInDashboard = 15, +} + +[StructLayout(LayoutKind.Explicit)] public struct HVREvent_Data_t +{ + [FieldOffset(0)] public HVREvent_Reserved_t reserved; + [FieldOffset(0)] public HVREvent_Controller_t controller; + [FieldOffset(0)] public HVREvent_Process_t process; + [FieldOffset(0)] public HVREvent_Overlay_t overlay; + [FieldOffset(0)] public HVREvent_Status_t status; + [FieldOffset(0)] public HVREvent_Ipd_t ipd; + [FieldOffset(0)] public HVREvent_Chaperone_t chaperone; + [FieldOffset(0)] public HVREvent_TouchPadMove_t touchPadMove; +} + +[StructLayout(LayoutKind.Sequential)] public struct HVRMatrix34_t +{ + public float m0; //float[3][4] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; + public float m9; + public float m10; + public float m11; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRMatrix44_t +{ + public float m0; //float[4][4] + public float m1; + public float m2; + public float m3; + public float m4; + public float m5; + public float m6; + public float m7; + public float m8; + public float m9; + public float m10; + public float m11; + public float m12; + public float m13; + public float m14; + public float m15; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRVector3_t +{ + public float v0; //float[3] + public float v1; + public float v2; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRVector4_t +{ + public float v0; //float[4] + public float v1; + public float v2; + public float v3; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRVector3d_t +{ + public double v0; //double[3] + public double v1; + public double v2; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRVector2_t +{ + public float v0; //float[2] + public float v1; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRQuaternion_t +{ + public double w; + public double x; + public double y; + public double z; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRColor_t +{ + public float r; + public float g; + public float b; + public float a; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRQuad_t +{ + public HVRVector3_t vCorners0; + public HVRVector3_t vCorners1; + public HVRVector3_t vCorners2; + public HVRVector3_t vCorners3; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRRect2_t +{ + public HVRVector2_t vTopLeft; + public HVRVector2_t vBottomRight; +} + +[StructLayout(LayoutKind.Sequential)] public struct HVRTexture_t +{ + public ulong handle; // uint64 + public EHVRTextureType eType; + public EHVRColorSpace eColorSpace; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRTrackedDevicePose_t +{ + public HVRMatrix34_t mDeviceToAbsoluteTracking; + public HVRVector3_t vVelocity; + public HVRVector3_t vAngularVelocity; + public EHVRTrackingResult eTrackingResult; + [MarshalAs(UnmanagedType.I1)] + public bool bPoseIsValid; + [MarshalAs(UnmanagedType.I1)] + public bool bDeviceIsConnected; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRTextureBounds_t +{ + public float uMin; + public float vMin; + public float uMax; + public float vMax; +} +[StructLayout(LayoutKind.Sequential)] public struct HVREvent_Controller_t +{ + public uint button; +} + +[StructLayout(LayoutKind.Sequential)] public struct HVREvent_TouchPadMove_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bFingerDown; + public float flSecondsFingerDown; + public float fValueXFirst; + public float fValueYFirst; + public float fValueXRaw; + public float fValueYRaw; +} + +[StructLayout(LayoutKind.Sequential)] public struct HVREvent_Process_t +{ + public uint pid; + public uint oldPid; + [MarshalAs(UnmanagedType.I1)] + public bool bForced; +} +[StructLayout(LayoutKind.Sequential)] public struct HVREvent_Overlay_t +{ + public ulong overlayHandle; +} +[StructLayout(LayoutKind.Sequential)] public struct HVREvent_Status_t +{ + public uint statusState; +} + +[StructLayout(LayoutKind.Sequential)] public struct HVREvent_Ipd_t +{ + public float ipdMeters; +} +[StructLayout(LayoutKind.Sequential)] public struct HVREvent_Chaperone_t +{ + public ulong m_nPreviousUniverse; + public ulong m_nCurrentUniverse; +} +[StructLayout(LayoutKind.Sequential)] public struct HVREvent_Reserved_t +{ + public ulong reserved0; + public ulong reserved1; +} + +[StructLayout(LayoutKind.Sequential)] public struct HVREvent_t +{ + public uint eventType; + public uint trackedDeviceIndex; + public float eventAgeSeconds; + public HVREvent_Data_t data; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRHiddenAreaMesh_t +{ + public IntPtr pVertexData; + public uint unTriangleCount; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRControllerAxis_t +{ + public float x; + public float y; +} +[StructLayout(LayoutKind.Sequential)] public struct HVRControllerState_t +{ + public uint unPacketNum; + public ulong ulButtonPressed; + public ulong ulButtonTouched; + public HVRControllerAxis_t rAxis0; + public HVRControllerAxis_t rAxis1; + public HVRControllerAxis_t rAxis2; + public HVRControllerAxis_t rAxis3; + public HVRControllerAxis_t rAxis4; +} +[StructLayout(LayoutKind.Sequential)] +public struct HVROverlayIntersectionParams_t +{ + public HVRVector3_t vSource; + public HVRVector3_t vDirection; + public EHVRTrackingUniverseOrigin eOrigin; +} +[StructLayout(LayoutKind.Sequential)] +public struct VROverlayIntersectionResults_t +{ + public HVRVector3_t vPoint; + public HVRVector3_t vNormal; + public HVRVector2_t vUVs; + public float fDistance; +} + +[StructLayout(LayoutKind.Sequential)] +public struct HVRCameraVideoStreamFrameHeader_t +{ + public EHVRTrackedCameraFrameType eFrameType; + public uint nWidth; + public uint nHeight; + public uint nBytesPerPixel; + public uint nFrameSequence; + public HVRTrackedDevicePose_t standingTrackedDevicePose; +} + +[StructLayout(LayoutKind.Sequential)] +public struct RenderModel_ControllerMode_State_t +{ + [MarshalAs(UnmanagedType.I1)] + public bool bScrollWheelVisible; +} +[StructLayout(LayoutKind.Sequential)] +public struct RenderModel_ComponentState_t +{ + public HVRMatrix34_t mTrackingToComponentRenderModel; + public HVRMatrix34_t mTrackingToComponentLocal; + public uint uProperties; +} + + [StructLayout(LayoutKind.Sequential)] + public struct RenderModel_TextureMap_t + { + public ushort unWidth; + public ushort unHeight; + public IntPtr rubTextureMapData; // const uint8_t* + } + + [StructLayout(LayoutKind.Sequential)] + public struct RenderModel_Vertex_t + { + public HVRVector3_t vPosition; + public HVRVector3_t vNormal; + public float rfTextureCoord0; + public float rfTextureCoord1; + } + + [StructLayout(LayoutKind.Sequential)] + public struct RenderModel_t + { + public IntPtr rVertexData; // const HVRRenderModel_Vertex_t* + public uint unVertexCount; + public IntPtr rIndexData; // const uint16_t* + public uint unTriangleCount; + public uint diffuseTextureId; + } + +// This structure is for backwards binary compatibility on Linux and OSX only +[StructLayout(LayoutKind.Sequential, Pack = 4)] +public struct VRControllerState_t_Packed +{ + public uint unPacketNum; + public ulong ulButtonPressed; + public ulong ulButtonTouched; + public HVRControllerAxis_t rAxis0; //VRControllerAxis_t[5] + public HVRControllerAxis_t rAxis1; + public HVRControllerAxis_t rAxis2; + public HVRControllerAxis_t rAxis3; + public HVRControllerAxis_t rAxis4; + public VRControllerState_t_Packed(HVRControllerState_t unpacked) + { + this.unPacketNum = unpacked.unPacketNum; + this.ulButtonPressed = unpacked.ulButtonPressed; + this.ulButtonTouched = unpacked.ulButtonTouched; + this.rAxis0 = unpacked.rAxis0; + this.rAxis1 = unpacked.rAxis1; + this.rAxis2 = unpacked.rAxis2; + this.rAxis3 = unpacked.rAxis3; + this.rAxis4 = unpacked.rAxis4; + } + public void Unpack(ref HVRControllerState_t unpacked) + { + unpacked.unPacketNum = this.unPacketNum; + unpacked.ulButtonPressed = this.ulButtonPressed; + unpacked.ulButtonTouched = this.ulButtonTouched; + unpacked.rAxis0 = this.rAxis0; + unpacked.rAxis1 = this.rAxis1; + unpacked.rAxis2 = this.rAxis2; + unpacked.rAxis3 = this.rAxis3; + unpacked.rAxis4 = this.rAxis4; + } +} +public class HVRClass +{ + public static EHVRErrorCode InitInternal(EHVRApplicationType eApplicationType) + { + return HVRInterop.HVR_InitInternal(eApplicationType); + } + + public static void ShutdownInternal() + { + HVRInterop.HVR_ShutdownInternal(); + } + + public static IntPtr GetGenericInterface(string pchInterfaceVersion, ref EHVRErrorCode peError) + { + return HVRInterop.HVR_GetGenericInterface(pchInterfaceVersion, ref peError); + } + + public const string IHVRSystem_Version = "IHVRSYSTEM_001"; + public const string IHVRCompositor_Version = "IHVRCOMPOSITOR_001"; + public const string IHVROverlay_Version = "IHVROVERLAY_001"; + public const string IHVRTrackedCamera_Version = "IHVRTRACKEDCAMERA_001"; + public const string IHVRSettings_Version = "IHVRSETTINGS_001"; + public const string IHVRChaperoneSetup_Version = "IHVRCHAPERONESETUP_001"; + public const string IHVRRenderModel_Version = "IHVRENDERMODEL_001"; + + public const uint k_unHVRTrackedDeviceIndex_Hmd = 0; + public const uint k_unHVRMaxTrackedDeviceCount = 16; + public const uint k_unHVRTrackedDeviceIndexInvalid = 4294967295; + public const ulong k_ulHVROverlayHandleInvalid = 0; + + class CHVRContext + { + public CHVRContext() { Clear(); } + + public void Clear() + { + m_pHVRSystem = null; + m_pHVRCompositor = null; + m_pHVROverlay = null; + m_pHVRTrackedCamera = null; + m_pHVRSettings = null; + m_pHVRChaperoneSetup = null; + m_pHVRRendeModel = null; + } + + public CHVRSystem HVRSystem() + { + if (m_pHVRSystem == null) + { + var eError = EHVRErrorCode.HVR_ERR_None; + var pInterface = HVRInterop.HVR_GetGenericInterface(IHVRSystem_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EHVRErrorCode.HVR_ERR_None) + m_pHVRSystem = new CHVRSystem(pInterface); + } + return m_pHVRSystem; + } + + public CHVRCompositor HVRCompositor() + { + if (m_pHVRCompositor == null) + { + var eError = EHVRErrorCode.HVR_ERR_None; + var pInterface = HVRInterop.HVR_GetGenericInterface(IHVRCompositor_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EHVRErrorCode.HVR_ERR_None) + m_pHVRCompositor = new CHVRCompositor(pInterface); + } + return m_pHVRCompositor; + } + + public CHVROverlay HVROverlay() + { + if (m_pHVROverlay == null) + { + var eError = EHVRErrorCode.HVR_ERR_None; + var pInterface = HVRInterop.HVR_GetGenericInterface(IHVROverlay_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EHVRErrorCode.HVR_ERR_None) + m_pHVROverlay = new CHVROverlay(pInterface); + } + return m_pHVROverlay; + } + + public CHVRTrackedCamera HVRTrackedCamera() + { + if (m_pHVRTrackedCamera == null) + { + var eError = EHVRErrorCode.HVR_ERR_None; + var pInterface = HVRInterop.HVR_GetGenericInterface(IHVRTrackedCamera_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EHVRErrorCode.HVR_ERR_None) + m_pHVRTrackedCamera = new CHVRTrackedCamera(pInterface); + } + return m_pHVRTrackedCamera; + } + + public CHVRSettings HVRSettings() + { + if (m_pHVRSettings == null) + { + var eError = EHVRErrorCode.HVR_ERR_None; + var pInterface = HVRInterop.HVR_GetGenericInterface(IHVRSettings_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EHVRErrorCode.HVR_ERR_None) + m_pHVRSettings = new CHVRSettings(pInterface); + } + return m_pHVRSettings; + } + + public CHVRChaperoneSetup HVRChaperoneSetup() + { + if (m_pHVRChaperoneSetup == null) + { + var eError = EHVRErrorCode.HVR_ERR_None; + var pInterface = HVRInterop.HVR_GetGenericInterface(IHVRChaperoneSetup_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EHVRErrorCode.HVR_ERR_None) + m_pHVRChaperoneSetup = new CHVRChaperoneSetup(pInterface); + } + return m_pHVRChaperoneSetup; + } + + public CHVRRenderModels HVRRenderModelSetup() + { + if (m_pHVRRendeModel == null) + { + var eError = EHVRErrorCode.HVR_ERR_None; + var pInterface = HVRInterop.HVR_GetGenericInterface(IHVRRenderModel_Version, ref eError); + if (pInterface != IntPtr.Zero && eError == EHVRErrorCode.HVR_ERR_None) + m_pHVRRendeModel = new CHVRRenderModels(pInterface); + } + return m_pHVRRendeModel; + } + + private CHVRSystem m_pHVRSystem; + private CHVRCompositor m_pHVRCompositor; + private CHVROverlay m_pHVROverlay; + private CHVRTrackedCamera m_pHVRTrackedCamera; + private CHVRSettings m_pHVRSettings; + private CHVRChaperoneSetup m_pHVRChaperoneSetup; + private CHVRRenderModels m_pHVRRendeModel; + }; + + private static CHVRContext _HVRInternal_ModuleContext = null; + static CHVRContext HVRInternal_ModuleContext + { + get + { + if (_HVRInternal_ModuleContext == null) + _HVRInternal_ModuleContext = new CHVRContext(); + return _HVRInternal_ModuleContext; + } + } + + public static CHVRSystem System { get { return HVRInternal_ModuleContext.HVRSystem(); } } + public static CHVRCompositor Compositor { get { return HVRInternal_ModuleContext.HVRCompositor(); } } + public static CHVROverlay Overlay { get { return HVRInternal_ModuleContext.HVROverlay(); } } + public static CHVRTrackedCamera TrackedCamera { get { return HVRInternal_ModuleContext.HVRTrackedCamera(); } } + public static CHVRSettings Settings { get { return HVRInternal_ModuleContext.HVRSettings(); } } + public static CHVRChaperoneSetup ChaperoneSetup { get { return HVRInternal_ModuleContext.HVRChaperoneSetup(); } } + public static CHVRRenderModels RenderModels { get { return HVRInternal_ModuleContext.HVRRenderModelSetup(); } } + + /** Finds the active installation of vrclient.dll and initializes it */ + public static CHVRSystem Init(ref EHVRErrorCode peError, EHVRApplicationType eApplicationType = EHVRApplicationType.EHVRApplication_Scene) + { + peError = InitInternal(eApplicationType); + HVRInternal_ModuleContext.Clear(); + + if (peError != EHVRErrorCode.HVR_ERR_None) + return null; + + return HVRClass.System; + } + + /** unloads vrclient.dll. Any interface pointers from the interface are + * invalid after this point */ + public static void Shutdown() + { + ShutdownInternal(); + } + +} + +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/headers/ViveVR_api.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/headers/ViveVR_api.cs.meta new file mode 100644 index 0000000..1c025a3 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/PassThrough Plugin/headers/ViveVR_api.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4c6b633080837d44d8cfd23f6d081fb5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab.meta new file mode 100644 index 0000000..f05185c --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2407db3025a68514aa4ae0c241cef822 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Controller.prefab b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Controller.prefab new file mode 100644 index 0000000..5c97e18 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Controller.prefab @@ -0,0 +1,451 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &468532194643222661 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5090188072936077342} + - component: {fileID: 3958005527902105749} + m_Layer: 0 + m_Name: Left + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5090188072936077342 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 468532194643222661} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4609399308229356524} + - {fileID: 4070507781330974152} + m_Father: {fileID: 4070507781819382180} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &3958005527902105749 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 468532194643222661} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2fadf230d1919748a9aa21d40f74619, type: 3} + m_Name: + m_EditorClassIdentifier: + m_TrackingType: 0 + m_UpdateType: 0 + m_PositionAction: + m_Name: Position + m_Type: 0 + m_ExpectedControlType: + m_Id: d4b6781c-62a9-4e0b-9445-14b36945f46c + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 9755ceaa-22c9-429f-8bda-8b41fdfdbb64 + m_Path: {LeftHand}/devicePosition + m_Interactions: + m_Processors: + m_Groups: + m_Action: Position + m_Flags: 0 + m_RotationAction: + m_Name: Rotation + m_Type: 0 + m_ExpectedControlType: + m_Id: 528ac5d8-a1a4-4a13-b51e-3fca70b2960d + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: f20f0caa-d60d-462f-bdde-ccb932a6fd6c + m_Path: {LeftHand}/deviceRotation + m_Interactions: + m_Processors: + m_Groups: + m_Action: Rotation + m_Flags: 0 +--- !u!114 &4070507782448128972 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3799965594858647894} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 15b06a835f580bf4995da3b45ecf229d, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ActionReferenceTrigger: {fileID: 6986180202050166755, guid: e0ca4504471ca124088e1e2cfe6804ae, type: 3} + m_ActionReferenceGrip: {fileID: -2169729131751125950, guid: e0ca4504471ca124088e1e2cfe6804ae, type: 3} + MeshSubSystem: {fileID: 0} + spawnPoint: {fileID: 4070507781330974152} + sphere: {fileID: 2574577713986150231, guid: 9d3c72459127d8d4eb44e7f6e3d10829, type: 3} + shootVelocity: 5 +--- !u!1 &4070507780537846703 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4070507780537846702} + m_Layer: 0 + m_Name: SpawnPoint_Right + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4070507780537846702 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4070507780537846703} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.0331, z: 0.044} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4070507781538674084} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4070507781047365270 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4070507781047365269} + - component: {fileID: 4070507781047365258} + - component: {fileID: 4070507781047365259} + - component: {fileID: 4070507781047365268} + m_Layer: 0 + m_Name: vive_cosmos_controller_right + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4070507781047365269 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4070507781047365270} + m_LocalRotation: {x: -0, y: 1, z: -0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4070507781538674084} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!33 &4070507781047365258 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4070507781047365270} + m_Mesh: {fileID: -3583036085161621185, guid: 1184578736ca2da4a857bcf6a429b258, type: 3} +--- !u!23 &4070507781047365259 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4070507781047365270} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 7e40d5b6de9c7b24cbd0293dd20805ea, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &4070507781047365268 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4070507781047365270} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 15b06a835f580bf4995da3b45ecf229d, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ActionReferenceTrigger: {fileID: 6454596279149084813, guid: e0ca4504471ca124088e1e2cfe6804ae, type: 3} + m_ActionReferenceGrip: {fileID: -8514278639596572500, guid: e0ca4504471ca124088e1e2cfe6804ae, type: 3} + MeshSubSystem: {fileID: 0} + spawnPoint: {fileID: 4070507780537846702} + sphere: {fileID: 2574577713986150231, guid: 9d3c72459127d8d4eb44e7f6e3d10829, type: 3} + shootVelocity: 5 +--- !u!1 &4070507781330974153 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4070507781330974152} + m_Layer: 0 + m_Name: SpawnPoint_Left + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4070507781330974152 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4070507781330974153} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.0331, z: 0.044} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 5090188072936077342} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4070507781538674085 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4070507781538674084} + - component: {fileID: 8508220863363395374} + m_Layer: 0 + m_Name: Right + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4070507781538674084 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4070507781538674085} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4070507781047365269} + - {fileID: 4070507780537846702} + m_Father: {fileID: 4070507781819382180} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8508220863363395374 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4070507781538674085} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2fadf230d1919748a9aa21d40f74619, type: 3} + m_Name: + m_EditorClassIdentifier: + m_TrackingType: 0 + m_UpdateType: 0 + m_PositionAction: + m_Name: Position + m_Type: 0 + m_ExpectedControlType: + m_Id: d4b6781c-62a9-4e0b-9445-14b36945f46c + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 9755ceaa-22c9-429f-8bda-8b41fdfdbb64 + m_Path: {RightHand}/devicePosition + m_Interactions: + m_Processors: + m_Groups: + m_Action: Position + m_Flags: 0 + m_RotationAction: + m_Name: Rotation + m_Type: 0 + m_ExpectedControlType: + m_Id: 528ac5d8-a1a4-4a13-b51e-3fca70b2960d + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: f20f0caa-d60d-462f-bdde-ccb932a6fd6c + m_Path: {RightHand}/deviceRotation + m_Interactions: + m_Processors: + m_Groups: + m_Action: Rotation + m_Flags: 0 +--- !u!1 &4070507781819382183 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4070507781819382180} + - component: {fileID: 4070507781819382182} + m_Layer: 0 + m_Name: Controller + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4070507781819382180 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4070507781819382183} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4070507781538674084} + - {fileID: 5090188072936077342} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &4070507781819382182 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4070507781819382183} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 882e1090e76def749ad1a34789211e37, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ActionAsset: {fileID: -944628639613478452, guid: e0ca4504471ca124088e1e2cfe6804ae, type: 3} +--- !u!1001 &4070507781240409095 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 5090188072936077342} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + propertyPath: m_Name + value: vive_cosmos_controller_left + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} +--- !u!1 &3799965594858647894 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + m_PrefabInstance: {fileID: 4070507781240409095} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4609399308229356524 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 8d8aaa0c6df64a7468b044c36207e085, type: 3} + m_PrefabInstance: {fileID: 4070507781240409095} + m_PrefabAsset: {fileID: 0} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Controller.prefab.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Controller.prefab.meta new file mode 100644 index 0000000..3a331a3 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Controller.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2812476435bed9541adc96fd390419fb +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Sphere.prefab b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Sphere.prefab new file mode 100644 index 0000000..07941cd --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Sphere.prefab @@ -0,0 +1,128 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2574577713986150231 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3899871004778204620} + - component: {fileID: 4867330573463889631} + - component: {fileID: 353163877957997840} + - component: {fileID: 2835869327534969418} + - component: {fileID: -6802674557761154431} + - component: {fileID: -4005664569713843061} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3899871004778204620 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2574577713986150231} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &4867330573463889631 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2574577713986150231} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &353163877957997840 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2574577713986150231} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: e6b8e71e9989283458383b5c1a439a9b, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!135 &2835869327534969418 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2574577713986150231} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Radius: 0.5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &-6802674557761154431 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2574577713986150231} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 89d0d284e76483043b0ffc8bfafe077f, type: 3} + m_Name: + m_EditorClassIdentifier: + LifeTime: 5 +--- !u!54 &-4005664569713843061 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2574577713986150231} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Sphere.prefab.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Sphere.prefab.meta new file mode 100644 index 0000000..a4179c1 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Prefab/Sphere.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9d3c72459127d8d4eb44e7f6e3d10829 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Readme.md b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Readme.md new file mode 100644 index 0000000..712bed2 --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Samples~/Readme.md @@ -0,0 +1,17 @@ +# VIVE OpenXR SceneUnderstanding Unity Feature + +Demonstrate configuring, calculating and generating mesh of surrounding environments by the OpenXR SceneUnderstanding extension [XR_MSFT_scene_understanding](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_MSFT_scene_understanding). + +## Load sample code +**Window** > **Package Manager** > **VIVE OpenXR Plugin - Windows** > **Samples** > Click to import **SceneUnderstanding Example**. +## Play the sample scene +1. **Edit** > **Project Settings** > **XR Plug-in Management** > Select **OpenXR** , click Exclamation mark next to it > choose **Fix All**. +2. **Edit** > **Project Settings** > **XR Plug-in Management** > **OpenXR** > Add Interaction profiles for your device. +3. **Edit** > **Project Settings** > **XR Plug-in Management** > **OpenXR** > Select **Scene UnderStanding** and **Meshing Subsystem** under **VIVE OpenXR** Feature Groups. +4. In the Unity Project window, select the sample scene file in **Assets** > **Samples** > **VIVE OpenXR Plugin - Windows** > **1.0.12** > **SceneUnderstanding Example** > **Meshing Subsystem Feature** > **MeshingFeature.unity** then click Play. + +## How to use VIVE OpenXR SceneUnderstanding Unity Feature +For the available OpenXR SceneUnderstanding functions, please refer to **SceneUnderstanding.cs**. +1. Refer to **MeshingTeapotFeature.cs** which is modified from **Meshing Subsystem Feature** sample code provided by **OpenXR Plugin** for supplying a mesh from native code with OpenXR SceneUnderstanding functions. +2. Refer to **meshing_provider.cpp** under Assets\MeshingFeaturePlugin\Native~\ for generating mesh part. +3. Refer to **MeshingBehaviour.cs** for drawing mesh part. \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Scripts.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Scripts.meta new file mode 100644 index 0000000..04daf4e --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2c0c8b45282d844cba7b2fb2eb8dd68 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Scripts/SceneUnderstanding_OpenXR_API.cs b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Scripts/SceneUnderstanding_OpenXR_API.cs new file mode 100644 index 0000000..7a5f6dc --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Scripts/SceneUnderstanding_OpenXR_API.cs @@ -0,0 +1,351 @@ +using System; +using System.Runtime.InteropServices; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine.XR.OpenXR.Features; +using UnityEngine; +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif + +namespace VIVE.SceneUnderstanding +{ +#if UNITY_EDITOR + [OpenXRFeature(UiName = "Scene Understanding", + BuildTargetGroups = new[] { BuildTargetGroup.Standalone, BuildTargetGroup.WSA}, + Company = "HTC", + Desc = "Get function pointers related to openxr scene understanding", + DocumentationLink = "https://developer.vive.com/resources/openxr/openxr-pcvr/tutorials/unity/interact-real-world-openxr-scene-understanding/", + OpenxrExtensionStrings = "XR_MSFT_scene_understanding", + Version = "0.0.1", + FeatureId = featureId)] +#endif + public class SceneUnderstanding_OpenXR_API : OpenXRFeature + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.htc.openxr.sceneunderstanding.feature"; + + #region OpenXR callbacks + protected override bool OnInstanceCreate(ulong xrInstance) + { + UnityEngine.Debug.Log($"OnInstanceCreate({xrInstance})"); + m_XrInstance = xrInstance; + + return GetXrFunctionDelegates(xrInstance); + } + protected override void OnInstanceDestroy(ulong xrInstance) + { + UnityEngine.Debug.Log($"OnInstanceDestroy({xrInstance})"); + } + protected override void OnSessionCreate(ulong xrSession) + { + UnityEngine.Debug.Log($"OnSessionCreate({xrSession})"); + m_XrSession = xrSession; + systemProperties.type = XrStructureType.XR_TYPE_SYSTEM_PROPERTIES; + XrSystemPassThroughPropertiesHTC SystemPassThroughPropertiesHTC; + SystemPassThroughPropertiesHTC.type = XrStructureType.XR_TYPE_SYSTEM_PASS_THROUGH_PROPERTIES_HTC; + unsafe + { + systemProperties.next = (IntPtr)(&SystemPassThroughPropertiesHTC); + } + int res = xrGetSystemProperties(ref systemProperties); + if (res != (int)XrResult.XR_SUCCESS) + { + UnityEngine.Debug.Log("Failed to get systemproperties with error code : " + res); + + } + } + protected override void OnSystemChange(ulong xrSystem) + { + UnityEngine.Debug.Log($"OnSystemChange({xrSystem})"); + m_systemid = xrSystem; + } + protected override void OnSessionDestroy(ulong xrSession) + { + UnityEngine.Debug.Log($"OnSessionDestroy({xrSession})"); + } + + bool CheckResult(XrResult result) => result == XrResult.XR_SUCCESS; + public bool GetXrFunctionDelegates(ulong xrInstance) + { + Debug.Log("GetXrFunctionDelegates() begin"); + if (xrGetInstanceProcAddr == null || xrGetInstanceProcAddr == IntPtr.Zero) + UnityEngine.Debug.LogError("xrGetInstanceProcAddr is null"); + // Get delegate of xrGetInstanceProcAddr. + m_XrGetInstanceProcAddr = Marshal.GetDelegateForFunctionPointer(xrGetInstanceProcAddr); + // Get delegate of other OpenXR functions using xrGetInstanceProcAddr. + bool successful = true; + IntPtr funcPtr = IntPtr.Zero; + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrGetSystemProperties", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrGetSystemProperties function failed"); return false; } + m_xrGetSystemProperties = Marshal.GetDelegateForFunctionPointer(funcPtr, typeof(xrGetSystemPropertiesDelegate)) as xrGetSystemPropertiesDelegate; + if (m_xrGetSystemProperties == null) { Debug.Log("m_xrGetSystemProperties == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrEnumerateReferenceSpaces", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrEnumerateReferenceSpaces function failed"); return false; } + m_XrEnumerateReferenceSpaces = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrEnumerateReferenceSpaces == null) { Debug.Log("m_XrEnumerateReferenceSpaces == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrCreateReferenceSpace", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrCreateReferenceSpace function failed"); return false; } + m_XrCreateReferenceSpace = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrCreateReferenceSpace == null) { Debug.Log("m_XrCreateReferenceSpace == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrDestroySpace", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrDestroySpace function failed"); return false; } + m_XrDestroySpace = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrDestroySpace == null) { Debug.Log("m_XrDestroySpace == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrEnumerateSceneComputeFeaturesMSFT", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrEnumerateSceneComputeFeaturesMSFT function failed"); return false; } + m_XrEnumerateSceneComputeFeaturesMSFT = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrEnumerateSceneComputeFeaturesMSFT == null) { Debug.Log("m_XrEnumerateSceneComputeFeaturesMSFT == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrCreateSceneObserverMSFT", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrCreateSceneObserverMSFT function failed"); return false; } + m_XrCreateSceneObserverMSFT = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrCreateSceneObserverMSFT == null) { Debug.Log("m_XrCreateSceneObserverMSFT == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrDestroySceneObserverMSFT", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrDestroySceneObserverMSFT function failed"); return false; } + m_XrDestroySceneObserverMSFT = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrDestroySceneObserverMSFT == null) { Debug.Log("m_XrDestroySceneObserverMSFT == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrCreateSceneMSFT", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrCreateSceneMSFT function failed"); return false; } + m_XrCreateSceneMSFT = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrCreateSceneMSFT == null) { Debug.Log("m_XrCreateSceneMSFT == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrDestroySceneMSFT", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrDestroySceneMSFT function failed"); return false; } + m_XrDestroySceneMSFT = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrDestroySceneMSFT == null) { Debug.Log("m_XrDestroySceneMSFT == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrComputeNewSceneMSFT", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrComputeNewSceneMSFT function failed"); return false; } + m_XrComputeNewSceneMSFT = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrComputeNewSceneMSFT == null) { Debug.Log("m_XrComputeNewSceneMSFT == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrGetSceneComputeStateMSFT", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrGetSceneComputeStateMSFT function failed"); return false; } + m_XrGetSceneComputeStateMSFT = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrGetSceneComputeStateMSFT == null) { Debug.Log("m_XrGetSceneComputeStateMSFT == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrGetSceneComponentsMSFT", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrGetSceneComponentsMSFT function failed"); return false; } + m_XrGetSceneComponentsMSFT = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrGetSceneComponentsMSFT == null) { Debug.Log("m_XrGetSceneComponentsMSFT == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrLocateSceneComponentsMSFT", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrLocateSceneComponentsMSFT function failed"); return false; } + m_XrLocateSceneComponentsMSFT = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrLocateSceneComponentsMSFT == null) { Debug.Log("m_XrLocateSceneComponentsMSFT == null"); } + + successful &= CheckResult((XrResult)m_XrGetInstanceProcAddr(xrInstance, "xrGetSceneMeshBuffersMSFT", out funcPtr)); + if (funcPtr == IntPtr.Zero) { UnityEngine.Debug.Log("Get xrGetSceneMeshBuffersMSFT function failed"); return false; } + m_XrGetSceneMeshBuffersMSFT = Marshal.GetDelegateForFunctionPointer(funcPtr); + if (m_XrGetSceneMeshBuffersMSFT == null) { Debug.Log("m_XrGetSceneMeshBuffersMSFT == null"); } + + Debug.Log("GetXrFunctionDelegates() end"); + return successful; + } + #endregion + public ulong m_XrInstance; + public ulong m_XrSession; + public ulong m_systemid; + public XrSystemProperties systemProperties; + xrGetInstanceProcDelegate m_XrGetInstanceProcAddr; + + public delegate int xrGetSystemPropertiesDelegate(ulong instance, ulong systemId, ref XrSystemProperties properties); + public xrGetSystemPropertiesDelegate m_xrGetSystemProperties; + public int xrGetSystemProperties(ref XrSystemProperties properties) => + m_xrGetSystemProperties(m_XrInstance, m_systemid, ref properties); + + public delegate XrResult XrEnumerateReferenceSpacesDelegate( + ulong session, + uint spaceCapacityInput, + out int spaceCountOutput, + IntPtr spaces); + public XrEnumerateReferenceSpacesDelegate m_XrEnumerateReferenceSpaces; + public XrResult XrEnumerateReferenceSpaces( + uint spaceCapacityInput, + out int spaceCountOutput, + IntPtr spaces + ) => m_XrEnumerateReferenceSpaces( + m_XrSession, + spaceCapacityInput, + out spaceCountOutput, + spaces + ); + public delegate XrResult XrCreateReferenceSpaceDelegate( + ulong session, + ref XrReferenceSpaceCreateInfo createInfo, + out ulong space); + public XrCreateReferenceSpaceDelegate m_XrCreateReferenceSpace; + public XrResult XrCreateReferenceSpace( + ref XrReferenceSpaceCreateInfo createInfo, + out ulong space + ) => m_XrCreateReferenceSpace( + m_XrSession, + ref createInfo, + out space + ); + public delegate XrResult XrDestroySpaceDelegate( + ulong space); + public XrDestroySpaceDelegate m_XrDestroySpace; + public XrResult XrDestroySpace( + ulong space + ) => m_XrDestroySpace( + space + ); + + public delegate XrResult XrEnumerateSceneComputeFeaturesMSFTDelegate( + ulong instance, + ulong systemId, + uint featureCapacityInput, + out uint featureCountOutput, + IntPtr features + ); + public XrEnumerateSceneComputeFeaturesMSFTDelegate m_XrEnumerateSceneComputeFeaturesMSFT; + public XrResult XrEnumerateSceneComputeFeaturesMSFT( + ulong systemId, + uint featureCapacityInput, + out uint featureCountOutput, + IntPtr features + ) => m_XrEnumerateSceneComputeFeaturesMSFT( + m_XrInstance, + systemId, + featureCapacityInput, + out featureCountOutput, + features + ); + public delegate XrResult XrCreateSceneObserverMSFTDelegate( + ulong session, + ref XrSceneObserverCreateInfoMSFT createInfo, + out ulong sceneObserver + ); + public XrCreateSceneObserverMSFTDelegate m_XrCreateSceneObserverMSFT; + public XrResult XrCreateSceneObserverMSFT( + ref XrSceneObserverCreateInfoMSFT createInfo, + out ulong sceneObserver + ) => m_XrCreateSceneObserverMSFT( + m_XrSession, + ref createInfo, + out sceneObserver + ); + + public delegate XrResult XrDestroySceneObserverMSFTDelegate( + ulong sceneObserver + ); + public XrDestroySceneObserverMSFTDelegate m_XrDestroySceneObserverMSFT; + public XrResult XrDestroySceneObserverMSFT( + ulong sceneObserver + ) => m_XrDestroySceneObserverMSFT( + sceneObserver + ); + + public delegate XrResult XrCreateSceneMSFTDelegate( + ulong sceneObserver, + ref XrSceneCreateInfoMSFT createInfo, + out ulong scene + ); + public XrCreateSceneMSFTDelegate m_XrCreateSceneMSFT; + public XrResult XrCreateSceneMSFT( + ulong sceneObserver, + ref XrSceneCreateInfoMSFT createInfo, + out ulong scene + ) => m_XrCreateSceneMSFT( + sceneObserver, + ref createInfo, + out scene + ); + + public delegate XrResult XrDestroySceneMSFTDelegate( + ulong scene + ); + public XrDestroySceneMSFTDelegate m_XrDestroySceneMSFT; + public XrResult XrDestroySceneMSFT( + ulong scene + ) => m_XrDestroySceneMSFT( + scene + ); + + public delegate XrResult XrComputeNewSceneMSFTDelegate( + ulong sceneObserver, + ref XrNewSceneComputeInfoMSFT computeInfo + ); + public XrComputeNewSceneMSFTDelegate m_XrComputeNewSceneMSFT; + public XrResult XrComputeNewSceneMSFT( + ulong sceneObserver, + ref XrNewSceneComputeInfoMSFT computeInfo + ) => m_XrComputeNewSceneMSFT( + sceneObserver, + ref computeInfo + ); + + public delegate XrResult XrGetSceneComputeStateMSFTDelegate( + ulong sceneObserver, + out XrSceneComputeStateMSFT state + ); + public XrGetSceneComputeStateMSFTDelegate m_XrGetSceneComputeStateMSFT; + public XrResult XrGetSceneComputeStateMSFT( + ulong sceneObserver, + out XrSceneComputeStateMSFT state + ) => m_XrGetSceneComputeStateMSFT( + sceneObserver, + out state + ); + + public delegate XrResult XrGetSceneComponentsMSFTDelegate( + ulong scene, + ref XrSceneComponentsGetInfoMSFT getInfo, + ref XrSceneComponentsMSFT components + ); + public XrGetSceneComponentsMSFTDelegate m_XrGetSceneComponentsMSFT; + public XrResult XrGetSceneComponentsMSFT( + ulong scene, + ref XrSceneComponentsGetInfoMSFT getInfo, + ref XrSceneComponentsMSFT components + ) => m_XrGetSceneComponentsMSFT( + scene, + ref getInfo, + ref components + ); + + public delegate XrResult XrLocateSceneComponentsMSFTDelegate( + ulong scene, + ref XrSceneComponentsLocateInfoMSFT locateInfo, + ref XrSceneComponentLocationsMSFT locations + ); + public XrLocateSceneComponentsMSFTDelegate m_XrLocateSceneComponentsMSFT; + public XrResult XrLocateSceneComponentsMSFT( + ulong scene, + ref XrSceneComponentsLocateInfoMSFT locateInfo, + ref XrSceneComponentLocationsMSFT locations + ) => m_XrLocateSceneComponentsMSFT( + scene, + ref locateInfo, + ref locations + ); + + public delegate XrResult XrGetSceneMeshBuffersMSFTDelegate( + ulong scene, + ref XrSceneMeshBuffersGetInfoMSFT getInfo, + ref XrSceneMeshBuffersMSFT buffers + ); + public XrGetSceneMeshBuffersMSFTDelegate m_XrGetSceneMeshBuffersMSFT; + public XrResult XrGetSceneMeshBuffersMSFT( + ulong scene, + ref XrSceneMeshBuffersGetInfoMSFT getInfo, + ref XrSceneMeshBuffersMSFT buffers + ) => m_XrGetSceneMeshBuffersMSFT( + scene, + ref getInfo, + ref buffers + ); + + } +} diff --git a/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Scripts/SceneUnderstanding_OpenXR_API.cs.meta b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Scripts/SceneUnderstanding_OpenXR_API.cs.meta new file mode 100644 index 0000000..6271f4a --- /dev/null +++ b/com.htc.upm.vive.openxr/OpenXRSceneUnderstanding/Scripts/SceneUnderstanding_OpenXR_API.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f11d54adfd486544afef5e8b85f159d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/README.md b/com.htc.upm.vive.openxr/README.md new file mode 100644 index 0000000..71a6faf --- /dev/null +++ b/com.htc.upm.vive.openxr/README.md @@ -0,0 +1,17 @@ +# VIVE OpenXR Plugin - Windows +The "VIVE OpenXR Plugin - Windows" plugin package contains some OpenXR Unity features for developers to use. +## Unity Features +### 1. VIVE OpenXR Facial Tracking +To help software developers create an application with actual facial expressions on 3D avatars with the OpenXR facial tracing extension [XR_HTC_facial_tracking](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_HTC_facial_tracking). +### 2. VIVE OpenXR SceneUnderstanding +Demonstrate configuring, calculating and generating mesh of surrouding environments by the OpenXR scene understanding extension [XR_MSFT_scene_understanding](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_MSFT_scene_understanding). +### 3. VIVE OpenXR Cosmos Controller +The Openxr extension [XR_HTC_vive_cosmos_controller_interaction](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_HTC_vive_cosmos_controller_interaction) enables the use of HTC Vive Cosmos Controllers interaction profiles in OpenXR. +### 4. VIVE OpenXR Hand Tracking +To help software developers create an application for locating hand joints with the OpenXR hand tracking extension [XR_EXT_hand_tracking](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_EXT_hand_tracking). +### 5. VIVE OpenXR Focus3 Controller +The Openxr extension [XR_HTC_vive_focus3_controller_interaction](https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html#XR_HTC_vive_focus3_controller_interaction) enables the use of HTC Vive Focus3 Controllers interaction profiles in OpenXR. +### 6. VIVE OpenXR Hand Interaction +The Openxr extension [XR_HTC_hand_interaction](https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html#XR_HTC_hand_interaction) enables the use of Hand Interaction profiles in OpenXR. +### 7. VIVE OpenXR Palm pose +The Openxr extension [XR_EXT_palm_pose](https://registry.khronos.org/OpenXR/specs/1.0/html/xrspec.html#XR_EXT_palm_pose) defines a new "standard pose identifier" for interaction profiles, named "palm_ext". \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/README.md.meta b/com.htc.upm.vive.openxr/README.md.meta new file mode 100644 index 0000000..49ea6cd --- /dev/null +++ b/com.htc.upm.vive.openxr/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9d69d405a2851204c911364de56f8bd7 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/license.md b/com.htc.upm.vive.openxr/license.md new file mode 100644 index 0000000..cc5da33 --- /dev/null +++ b/com.htc.upm.vive.openxr/license.md @@ -0,0 +1,15 @@ +# **VIVE OpenXR Plugin - Windows** For Unity +Copyright HTC Corporation. All Rights Reserved. + +This document describes a contract between you and HTC Corporation and its affiliates (collectively “HTC”) for the Works which refer to this software and corresponding documentation provided by HTC under the terms of this license. Please read it carefully before downloading or using this Work. If you do not agree to the terms of this license, please do not download or use this Work. + +Unless otherwise provided herein, the information contained in the Work is the exclusive property of HTC. + +HTC grants you a non-exclusive, non-assignable, and royalty-free right and license to use, modify (if provided in a source code form) or distribute the Work within the scope of the legitimate development of your software product. The usage and redistribution of the Work, with or without modification, is permitted provided that the following conditions are met: +1. Redistributions of the Work in a source code form must retain the above copyright notice, this list of conditions and the following disclaimer. +2. Redistribution of the Work in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +3. Neither HTC nor the names of its licensors or contributors may be used to endorse or promote products derived from this Work without specific prior written permission. + +> THE WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. HTC may make changes to the Work, at any time without notice, but is not obligated to support, update or upgrade for the Work. + +> IN NO EVENT SHALL HTC, ITS LICENSORS OR CONTRIBUTORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTIOON, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS), WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE WORK, THE USE OR INABILITY TO USE THE WORK, EVEN IF HTC, ITS LICENSORS OR CONTRIBUTORS HAVE BEEN ADVISED OF THE POSSIBLITY OF SUCH DAMAGES. diff --git a/com.htc.upm.vive.openxr/license.md.meta b/com.htc.upm.vive.openxr/license.md.meta new file mode 100644 index 0000000..17bbb6e --- /dev/null +++ b/com.htc.upm.vive.openxr/license.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7bc045bb56673204f989154f4ae78c81 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.htc.upm.vive.openxr/package.json b/com.htc.upm.vive.openxr/package.json new file mode 100644 index 0000000..f61e924 --- /dev/null +++ b/com.htc.upm.vive.openxr/package.json @@ -0,0 +1,49 @@ +{ + "name": "com.htc.upm.vive.openxr", + "displayName": "VIVE OpenXR Plugin - Windows", + "version": "1.0.12", + "unity": "2020.3", + "description": "VIVE OpenXR Plugin - Windows provides (1) Vive Facial Tracking (2) Vive Cosmos Controller (3) Scene Understanding (4) Hand Tracking (5) Vive Focus3 Controller support for Unity OpenXR (6) Hand Interaction (7) Palm pose.", + "keywords": [ + "htc", + "facial", + "openxr", + "xr", + "reality", + "input", + "SceneUnderstanding", + "pass through", + "hand", + "tracking" + ], + "dependencies": { + "com.unity.xr.management": "3.2.16", + "com.unity.xr.legacyinputhelpers": "2.1.2", + "com.unity.inputsystem": "1.1.0-preview.1", + "com.unity.xr.openxr": "1.4.2" + }, + "samples": [ + { + "displayName": "SceneUnderstanding Example", + "description": "Shows OpenXR scene understanding snapshot mesh.", + "path": "OpenXRSceneUnderstanding/Samples~/" + }, + { + "displayName" : "FacialTracking Example", + "description" : "Basic Sample showing how to create application with actual facial expressions on 3D avatars based on OpenXR facial tracking extension.", + "path": "OpenXRFacialTracking/Samples~/" + }, + { + "displayName" : "HandTracking Example", + "description" : "Basic Sample showing how to create application for locating hand joints based on OpenXR hand tracking extension and retrieve hand interaction input from unity OpenXR Plugin.", + "path": "OpenXRHandTracking/Samples~/" + } + ], + "author": { + "name": "HTC Corporation", + "email": "vivesoftware@htc.com", + "url": "https://www.htc.com" + }, + "homepage": "https://developer.vive.com/resources/openxr/", + "documentationUrl": "https://developer.vive.com/resources/openxr/openxr-pcvr/documentation/" + } \ No newline at end of file diff --git a/com.htc.upm.vive.openxr/package.json.meta b/com.htc.upm.vive.openxr/package.json.meta new file mode 100644 index 0000000..803ff41 --- /dev/null +++ b/com.htc.upm.vive.openxr/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0c281447c72566e4bbfca594b15e44cb +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: