From a2c2504d4892df73e86d6b7939e926c5356c6e30 Mon Sep 17 00:00:00 2001 From: Dizel Date: Sat, 21 Dec 2024 10:28:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B0=20PICO=20Unity=20OpenXR=20Integration=20SDK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../XR/Settings/OpenXR Editor Settings.asset | 5 +- .../XR/Settings/OpenXR Package Settings.asset | 299 + .../Assets.meta | 8 + .../Assets/Resources.meta | 8 + .../Assets/Resources/Controller.meta | 8 + .../Controller/ControllerWithHand.meta | 8 + .../Controller/ControllerWithHand/Mask_l.meta | 8 + .../ControllerWithHand/Mask_l/mask_a_b_l.mask | 89 + .../Mask_l/mask_a_b_l.mask.meta | 8 + .../ControllerWithHand/Mask_l/mask_a_l.mask | 89 + .../Mask_l/mask_a_l.mask.meta | 8 + .../Mask_l/mask_axis_l.mask | 89 + .../Mask_l/mask_axis_l.mask.meta | 8 + .../ControllerWithHand/Mask_l/mask_b_l.mask | 89 + .../Mask_l/mask_b_l.mask.meta | 8 + .../Mask_l/mask_grip_l.mask | 89 + .../Mask_l/mask_grip_l.mask.meta | 8 + .../Mask_l/mask_index_l.mask | 89 + .../Mask_l/mask_index_l.mask.meta | 8 + .../Mask_l/mask_thumb_l.mask | 89 + .../Mask_l/mask_thumb_l.mask.meta | 8 + .../Mask_l/mask_trigger_l.mask | 89 + .../Mask_l/mask_trigger_l.mask.meta | 8 + .../Controller/ControllerWithHand/Mask_r.meta | 8 + .../Mask_r/mask_axis_r.mask | 89 + .../Mask_r/mask_axis_r.mask.meta | 8 + .../Mask_r/mask_grip_r.mask | 89 + .../Mask_r/mask_grip_r.mask.meta | 8 + .../Mask_r/mask_index_r.mask | 89 + .../Mask_r/mask_index_r.mask.meta | 8 + .../Mask_r/mask_thumb_r.mask | 89 + .../Mask_r/mask_thumb_r.mask.meta | 8 + .../Mask_r/mask_trigger_r.mask | 89 + .../Mask_r/mask_trigger_r.mask.meta | 8 + .../ControllerWithHand/Mask_r/mask_x_r.mask | 89 + .../Mask_r/mask_x_r.mask.meta | 8 + .../ControllerWithHand/Mask_r/mask_x_y_r.mask | 89 + .../Mask_r/mask_x_y_r.mask.meta | 8 + .../ControllerWithHand/Mask_r/mask_y_r.mask | 89 + .../Mask_r/mask_y_r.mask.meta | 8 + .../ControllerWithHand/Material.meta | 8 + .../ControllerWithHand/Material/Hand_L.mat | 156 + .../Material/Hand_L.mat.meta | 8 + .../ControllerWithHand/Material/Hand_R.mat | 156 + .../Material/Hand_R.mat.meta | 8 + .../Controller/ControllerWithHand/Mesh.meta | 8 + .../ControllerWithHand/Mesh/LeftHand.meta | 8 + .../Mesh/LeftHand/leftHand.fbx | 3 + .../Mesh/LeftHand/leftHand.fbx.meta | 1526 +++ .../Mesh/LeftHand/leftHand_X_A_Y_B.fbx | 3 + .../Mesh/LeftHand/leftHand_X_A_Y_B.fbx.meta | 323 + .../ControllerWithHand/Mesh/RightHand.meta | 8 + .../Mesh/RightHand/rightHand.fbx | 3 + .../Mesh/RightHand/rightHand.fbx.meta | 1526 +++ .../Mesh/RightHand/rightHand_X_A_Y_B.fbx | 3 + .../Mesh/RightHand/rightHand_X_A_Y_B.fbx.meta | 323 + .../controller_l.overrideController | 43 + .../controller_l.overrideController.meta | 8 + .../controller_r.controller | 799 ++ .../controller_r.controller.meta | 8 + .../ControllerWithHand/leftHand.prefab | 130 + .../ControllerWithHand/leftHand.prefab.meta | 7 + .../ControllerWithHand/rightHand.prefab | 129 + .../ControllerWithHand/rightHand.prefab.meta | 7 + .../Assets/Resources/Controller/G3.meta | 8 + .../Assets/Resources/Controller/G3.prefab | 274 + .../Resources/Controller/G3.prefab.meta | 7 + .../Resources/Controller/G3/Materials.meta | 8 + .../Resources/Controller/G3/Materials/G3.mat | 79 + .../Controller/G3/Materials/G3.mat.meta | 8 + .../Controller/G3/Materials/G3_Power.mat | 80 + .../Controller/G3/Materials/G3_Power.mat.meta | 8 + .../Controller/G3/Materials/TouchSphere.mat | 80 + .../G3/Materials/TouchSphere.mat.meta | 8 + .../Resources/Controller/G3/Meshes.meta | 8 + .../Resources/Controller/G3/Meshes/G3.FBX | 3 + .../Controller/G3/Meshes/G3.FBX.meta | 105 + .../Controller/G3/Meshes/dianliang.fbx | 3 + .../Controller/G3/Meshes/dianliang.fbx.meta | 102 + .../Resources/Controller/G3/Shaders.meta | 8 + .../Controller/G3/Shaders/PXR_G3.shader | 111 + .../Controller/G3/Shaders/PXR_G3.shader.meta | 10 + .../Resources/Controller/G3/Textures.meta | 8 + .../Resources/Controller/G3/Textures/G3.png | 3 + .../Controller/G3/Textures/G3.png.meta | 96 + .../Controller/G3/Textures/Power.meta | 8 + .../G3/Textures/Power/dianliang_01.png | 3 + .../G3/Textures/Power/dianliang_01.png.meta | 121 + .../G3/Textures/Power/dianliang_02.png | 3 + .../G3/Textures/Power/dianliang_02.png.meta | 121 + .../G3/Textures/Power/dianliang_03.png | 3 + .../G3/Textures/Power/dianliang_03.png.meta | 121 + .../G3/Textures/Power/dianliang_04.png | 3 + .../G3/Textures/Power/dianliang_04.png.meta | 121 + .../G3/Textures/Power/dianliang_05.png | 3 + .../G3/Textures/Power/dianliang_05.png.meta | 121 + .../Resources/Controller/Neo 3 L.prefab | 220 + .../Resources/Controller/Neo 3 L.prefab.meta | 7 + .../Resources/Controller/Neo 3 R.prefab | 201 + .../Resources/Controller/Neo 3 R.prefab.meta | 7 + .../Assets/Resources/Controller/Neo3.meta | 8 + .../Resources/Controller/Neo3/Animators.meta | 8 + .../Animators/Neo3_Controller_Left.controller | 808 ++ .../Neo3_Controller_Left.controller.meta | 8 + .../Neo3_Controller_Right.controller | 808 ++ .../Neo3_Controller_Right.controller.meta | 8 + .../Resources/Controller/Neo3/Materials.meta | 8 + .../Neo3/Materials/Neo3_Controller_Left.mat | 128 + .../Materials/Neo3_Controller_Left.mat.meta | 8 + .../Neo3/Materials/Neo3_Controller_Right.mat | 125 + .../Materials/Neo3_Controller_Right.mat.meta | 8 + .../Neo3/Materials/Neo3_Power_Left.mat | 144 + .../Neo3/Materials/Neo3_Power_Left.mat.meta | 8 + .../Neo3/Materials/Neo3_Power_Right.mat | 144 + .../Neo3/Materials/Neo3_Power_Right.mat.meta | 8 + .../Resources/Controller/Neo3/Meshes.meta | 8 + .../Neo3/Meshes/Neo3_Controller_Left.fbx | 3 + .../Neo3/Meshes/Neo3_Controller_Left.fbx.meta | 422 + .../Neo3/Meshes/Neo3_Controller_Right.fbx | 3 + .../Meshes/Neo3_Controller_Right.fbx.meta | 422 + .../Resources/Controller/Neo3/PXR_Neo3.shader | 88 + .../Controller/Neo3/PXR_Neo3.shader.meta | 10 + .../Resources/Controller/Neo3/Textures.meta | 8 + .../Neo3/Textures/controller5_idle.jpg | 3 + .../Neo3/Textures/controller5_idle.jpg.meta | 96 + .../Resources/Controller/PICO 4 L.prefab | 225 + .../Resources/Controller/PICO 4 L.prefab.meta | 7 + .../Resources/Controller/PICO 4 R.prefab | 206 + .../Resources/Controller/PICO 4 R.prefab.meta | 7 + .../Assets/Resources/Controller/PICO 4.meta | 8 + .../Controller/PICO 4/Animators.meta | 8 + .../PICO4_Controller_Left.controller | 820 ++ .../PICO4_Controller_Left.controller.meta | 8 + .../PICO4_Controller_Right.controller | 808 ++ .../PICO4_Controller_Right.controller.meta | 8 + .../Controller/PICO 4/Materials.meta | 8 + .../PICO 4/Materials/PICO4_Controller.mat | 133 + .../Materials/PICO4_Controller.mat.meta | 8 + .../PICO 4/Materials/PICO4__Power.mat | 126 + .../PICO 4/Materials/PICO4__Power.mat.meta | 8 + .../Resources/Controller/PICO 4/Meshes.meta | 8 + .../PICO 4/Meshes/PICO4_Controller_Left.fbx | 3 + .../Meshes/PICO4_Controller_Left.fbx.meta | 425 + .../PICO 4/Meshes/PICO4_Controller_Right.fbx | 3 + .../Meshes/PICO4_Controller_Right.fbx.meta | 425 + .../Resources/Controller/PICO 4/Shaders.meta | 8 + .../PICO 4/Shaders/PXR_PICO4.shader | 141 + .../PICO 4/Shaders/PXR_PICO4.shader.meta | 10 + .../PICO 4/Shaders/PXR_PICO4_Power.shader | 88 + .../Shaders/PXR_PICO4_Power.shader.meta | 10 + .../Resources/Controller/PICO 4/Textures.meta | 8 + .../Textures/PICO4_Controller_Albedo.png | 3 + .../Textures/PICO4_Controller_Albedo.png.meta | 96 + .../Controller/PICO 4/Textures/Power.meta | 8 + .../Power/PICO4_ControllerPower_01.png | 3 + .../Power/PICO4_ControllerPower_01.png.meta | 120 + .../Power/PICO4_ControllerPower_02.png | 3 + .../Power/PICO4_ControllerPower_02.png.meta | 120 + .../Power/PICO4_ControllerPower_03.png | 3 + .../Power/PICO4_ControllerPower_03.png.meta | 120 + .../Power/PICO4_ControllerPower_04.png | 3 + .../Power/PICO4_ControllerPower_04.png.meta | 120 + .../Power/PICO4_ControllerPower_05.png | 3 + .../Power/PICO4_ControllerPower_05.png.meta | 120 + .../Controller/PICO 4U L WithHand.prefab | 147 + .../Controller/PICO 4U L WithHand.prefab.meta | 7 + .../Resources/Controller/PICO 4U L.prefab | 295 + .../Controller/PICO 4U L.prefab.meta | 7 + .../Controller/PICO 4U R WithHand.prefab | 115 + .../Controller/PICO 4U R WithHand.prefab.meta | 7 + .../Resources/Controller/PICO 4U R.prefab | 295 + .../Controller/PICO 4U R.prefab.meta | 7 + .../Assets/Resources/Controller/PICO 4U.meta | 8 + .../Controller/PICO 4U/Animation.meta | 8 + .../PICO4U_Controller_Left.overrideController | 29 + ...4U_Controller_Left.overrideController.meta | 8 + ...PICO4U_Controller_Right.overrideController | 29 + ...U_Controller_Right.overrideController.meta | 8 + .../Controller/PICO 4U/Animation/mesh.meta | 8 + .../Animation/mesh/o_com_PICO4U_left_01.fbx | 3 + .../mesh/o_com_PICO4U_left_01.fbx.meta | 396 + .../Animation/mesh/o_com_PICO4U_right_01.fbx | 3 + .../mesh/o_com_PICO4U_right_01.fbx.meta | 396 + .../Resources/Controller/PICO 4U/Shader.meta | 8 + .../PICO 4U/Shader/o_com_power.shader | 96 + .../PICO 4U/Shader/o_com_power.shader.meta | 10 + .../PICO 4U/Shader/o_com_shader_code.shader | 146 + .../Shader/o_com_shader_code.shader.meta | 10 + .../Resources/Controller/PICO 4U/Texture.meta | 8 + .../PICO 4U/Texture/o_com_PICO4U_01_b.png | 3 + .../Texture/o_com_PICO4U_01_b.png.meta | 135 + .../PICO 4U/Texture/o_com_PICO4U_02_a.png | 3 + .../Texture/o_com_PICO4U_02_a.png.meta | 135 + .../PICO 4U/Texture/o_com_PICO4U_02_b.png | 3 + .../Texture/o_com_PICO4U_02_b.png.meta | 135 + .../PICO 4U/Texture/o_com_PICO4U_power_01.png | 3 + .../Texture/o_com_PICO4U_power_01.png.meta | 135 + .../PICO 4U/Texture/o_com_PICO4U_power_02.png | 3 + .../Texture/o_com_PICO4U_power_02.png.meta | 135 + .../PICO 4U/Texture/o_com_PICO4U_power_03.png | 3 + .../Texture/o_com_PICO4U_power_03.png.meta | 135 + .../PICO 4U/Texture/o_com_PICO4U_power_04.png | 3 + .../Texture/o_com_PICO4U_power_04.png.meta | 135 + .../PICO 4U/Texture/o_com_PICO4U_power_05.png | 3 + .../Texture/o_com_PICO4U_power_05.png.meta | 135 + .../PICO 4U/Texture/o_com_matcap_01_b.png | 3 + .../Texture/o_com_matcap_01_b.png.meta | 135 + .../PICO 4U/Texture/o_com_matcap_02_b.png | 3 + .../Texture/o_com_matcap_02_b.png.meta | 135 + .../PICO 4U/Texture/o_com_matcap_03_b.png | 3 + .../Texture/o_com_matcap_03_b.png.meta | 135 + .../Controller/PICO 4U/Textures.meta | 8 + .../Controller/PICO 4U/Textures/Power.meta | 8 + .../Textures/Power/o_com_PICO4U_power_01.png | 3 + .../Power/o_com_PICO4U_power_01.png.meta | 98 + .../Textures/Power/o_com_PICO4U_power_02.png | 3 + .../Power/o_com_PICO4U_power_02.png.meta | 98 + .../Textures/Power/o_com_PICO4U_power_03.png | 3 + .../Power/o_com_PICO4U_power_03.png.meta | 98 + .../Textures/Power/o_com_PICO4U_power_04.png | 3 + .../Power/o_com_PICO4U_power_04.png.meta | 98 + .../Textures/Power/o_com_PICO4U_power_05.png | 3 + .../Power/o_com_PICO4U_power_05.png.meta | 98 + .../PICO 4U/Textures/o_com_matcap_01_b.png | 3 + .../Textures/o_com_matcap_01_b.png.meta | 98 + .../PICO 4U/Textures/o_com_matcap_02_b.png | 3 + .../Textures/o_com_matcap_02_b.png.meta | 98 + .../PICO 4U/Textures/o_com_sparrow_01_b.png | 3 + .../Textures/o_com_sparrow_01_b.png.meta | 98 + .../PICO 4U/Textures/o_com_sparrow_02_a.png | 3 + .../Textures/o_com_sparrow_02_a.png.meta | 98 + .../Controller/PICO 4U/material.meta | 8 + .../PICO 4U/material/o_com_PICO4U_01_m.mat | 173 + .../material/o_com_PICO4U_01_m.mat.meta | 8 + .../PICO 4U/material/o_com_PICO4U_power_m.mat | 251 + .../material/o_com_PICO4U_power_m.mat.meta | 8 + .../Assets/Resources/Hand.meta | 8 + .../Assets/Resources/Hand/Models.meta | 8 + .../Assets/Resources/Hand/Models/Hand_L.fbx | 3 + .../Resources/Hand/Models/Hand_L.fbx.meta | 109 + .../Assets/Resources/Hand/Models/Hand_R.fbx | 3 + .../Resources/Hand/Models/Hand_R.fbx.meta | 109 + .../Assets/Resources/Materials.meta | 8 + .../Resources/Materials/PXR_Hand.shader | 203 + .../Resources/Materials/PXR_Hand.shader.meta | 9 + .../Resources/Materials/UnderlayHole.mat | 123 + .../Resources/Materials/UnderlayHole.mat.meta | 8 + .../Assets/Resources/Prefabs.meta | 8 + .../Prefabs/LeftControllerModel.prefab | 56 + .../Prefabs/LeftControllerModel.prefab.meta | 7 + .../Prefabs/RightControllerModel .prefab | 56 + .../Prefabs/RightControllerModel .prefab.meta | 7 + .../Assets/Resources/Shader.meta | 8 + .../Resources/Shader/PXR_CubemapBlit.shader | 53 + .../Shader/PXR_CubemapBlit.shader.meta | 10 + .../Assets/Resources/Shader/PXR_Fade.shader | 16 + .../Resources/Shader/PXR_Fade.shader.meta | 9 + .../Resources/Shader/PXR_UnderlayHole.shader | 58 + .../Shader/PXR_UnderlayHole.shader.meta | 10 + .../Editor.meta | 8 + .../Editor/PICOCompositeLayerEditor.cs | 201 + .../Editor/PICOCompositeLayerEditor.cs.meta | 11 + .../Editor/PICOFeatureEditor.cs | 95 + .../Editor/PICOFeatureEditor.cs.meta | 11 + .../Editor/PICOFeatureSet.cs | 37 + .../Editor/PICOFeatureSet.cs.meta | 11 + .../Editor/PICOModifyAndroidManifest.cs | 260 + .../Editor/PICOModifyAndroidManifest.cs.meta | 11 + ....OpenXR.Features.PICOSupport.Editor.asmdef | 26 + ...XR.Features.PICOSupport.Editor.asmdef.meta | 7 + .../Enterprise.meta | 8 + .../Enterprise/PICOXR.TobSupport.asmdef | 25 + .../Enterprise/PICOXR.TobSupport.asmdef.meta | 7 + .../Enterprise/Scripts.meta | 8 + .../Enterprise/Scripts/Enums.meta | 8 + .../Scripts/Enums/ControllerKeyEnum.cs | 18 + .../Scripts/Enums/ControllerKeyEnum.cs.meta | 3 + .../Scripts/Enums/ControllerPairTimeEnum.cs | 12 + .../Enums/ControllerPairTimeEnum.cs.meta | 3 + .../Scripts/Enums/CustomizeSettingsTabEnum.cs | 13 + .../Enums/CustomizeSettingsTabEnum.cs.meta | 3 + .../Scripts/Enums/DeviceControlEnum.cs | 8 + .../Scripts/Enums/DeviceControlEnum.cs.meta | 3 + .../Enterprise/Scripts/Enums/HomeEventEnum.cs | 18 + .../Scripts/Enums/HomeEventEnum.cs.meta | 3 + .../Scripts/Enums/HomeFunctionEnum.cs | 17 + .../Scripts/Enums/HomeFunctionEnum.cs.meta | 3 + .../Enums/PICOCastOptionOrStatusEnum.cs | 10 + .../Enums/PICOCastOptionOrStatusEnum.cs.meta | 3 + .../Scripts/Enums/PICOCastOptionValueEnum.cs | 22 + .../Enums/PICOCastOptionValueEnum.cs.meta | 3 + .../Scripts/Enums/PICOCastUrlTypeEnum.cs | 9 + .../Scripts/Enums/PICOCastUrlTypeEnum.cs.meta | 3 + .../Scripts/Enums/PackageControlEnum.cs | 8 + .../Scripts/Enums/PackageControlEnum.cs.meta | 3 + .../Scripts/Enums/PicoCastMediaFormat.cs | 7 + .../Scripts/Enums/PicoCastMediaFormat.cs.meta | 3 + .../Scripts/Enums/PoseErrorTypeEnum.cs | 20 + .../Scripts/Enums/PoseErrorTypeEnum.cs.meta | 11 + .../Scripts/Enums/PowerOnOffLogoEnum.cs | 9 + .../Scripts/Enums/PowerOnOffLogoEnum.cs.meta | 3 + .../Scripts/Enums/ScreenOffDelayTimeEnum.cs | 13 + .../Enums/ScreenOffDelayTimeEnum.cs.meta | 3 + .../Enums/ScreencastAudioOutputEnum.cs | 10 + .../Enums/ScreencastAudioOutputEnum.cs.meta | 3 + .../Scripts/Enums/SleepDelayTimeEnum.cs | 13 + .../Scripts/Enums/SleepDelayTimeEnum.cs.meta | 3 + .../Scripts/Enums/StartVRSettingsEnum.cs | 13 + .../Scripts/Enums/StartVRSettingsEnum.cs.meta | 3 + .../Enterprise/Scripts/Enums/SwitchEnum.cs | 8 + .../Scripts/Enums/SwitchEnum.cs.meta | 3 + .../Scripts/Enums/SystemFunctionSwitchEnum.cs | 66 + .../Enums/SystemFunctionSwitchEnum.cs.meta | 3 + .../Scripts/Enums/SystemInfoEnum.cs | 20 + .../Scripts/Enums/SystemInfoEnum.cs.meta | 3 + .../Scripts/Enums/USBConfigModeEnum.cs | 8 + .../Scripts/Enums/USBConfigModeEnum.cs.meta | 3 + .../Enterprise/Scripts/Interfaces.meta | 3 + .../Scripts/Interfaces/BindCallback.cs | 28 + .../Scripts/Interfaces/BindCallback.cs.meta | 11 + .../Scripts/Interfaces/BoolCallback.cs | 26 + .../Scripts/Interfaces/BoolCallback.cs.meta | 11 + .../Scripts/Interfaces/FileCopyCallback.cs | 50 + .../Interfaces/FileCopyCallback.cs.meta | 11 + .../Scripts/Interfaces/IntCallback.cs | 26 + .../Scripts/Interfaces/IntCallback.cs.meta | 3 + .../Scripts/Interfaces/LongCallback.cs | 26 + .../Scripts/Interfaces/LongCallback.cs.meta | 3 + .../Scripts/Interfaces/MarkerInfoCallback.cs | 119 + .../Interfaces/MarkerInfoCallback.cs.meta | 3 + .../Scripts/Interfaces/StringCallback.cs | 26 + .../Scripts/Interfaces/StringCallback.cs.meta | 3 + .../Interfaces/WifiDisplayModelCallback.cs | 59 + .../WifiDisplayModelCallback.cs.meta | 3 + .../Enterprise/Scripts/Model.meta | 3 + .../Enterprise/Scripts/Model/MarkerInfo.cs | 38 + .../Scripts/Model/MarkerInfo.cs.meta | 3 + .../Scripts/Model/WifiDisplayModel.cs | 23 + .../Scripts/Model/WifiDisplayModel.cs.meta | 3 + .../Enterprise/Scripts/PXR_Enterprise.cs | 2012 ++++ .../Enterprise/Scripts/PXR_Enterprise.cs.meta | 11 + .../Enterprise/Scripts/Plugin.meta | 3 + .../Scripts/Plugin/PXR_EnterprisePlugin.cs | 1715 +++ .../Plugin/PXR_EnterprisePlugin.cs.meta | 11 + .../Scripts/Plugin/PXR_EnterpriseTools.cs | 69 + .../Plugin/PXR_EnterpriseTools.cs.meta | 3 + .../Enterprise/Scripts/Struct.meta | 8 + .../Scripts/Struct/RGBCameraStruct.cs | 105 + .../Scripts/Struct/RGBCameraStruct.cs.meta | 11 + .../Enterprise/android.meta | 8 + .../Enterprise/android/BAuthLib-1.0.0.aar | Bin 0 -> 45903 bytes .../android/BAuthLib-1.0.0.aar.meta | 32 + .../Enterprise/android/gson-2.10.1.jar | Bin 0 -> 283367 bytes .../Enterprise/android/gson-2.10.1.jar.meta | 32 + .../Enterprise/android/tob_api-release.aar | Bin 0 -> 38646 bytes .../android/tob_api-release.aar.meta | 32 + .../android/tobservicelib-release.aar | Bin 0 -> 192415 bytes .../android/tobservicelib-release.aar.meta | 32 + .../Platform.meta | 8 + .../Platform/Editor.meta | 3 + .../Platform/Editor/EditorConf.cs | 21 + .../Platform/Editor/EditorConf.cs.meta | 3 + .../Platform/Editor/Gs.cs | 158 + .../Platform/Editor/Gs.cs.meta | 3 + .../Platform/Editor/Menu.cs | 37 + .../Platform/Editor/Menu.cs.meta | 3 + .../Editor/PICO.Platform.Editor.asmdef | 29 + .../Editor/PICO.Platform.Editor.asmdef.meta | 3 + .../Editor/PXR_PlatformSettingEditor.cs | 97 + .../Editor/PXR_PlatformSettingEditor.cs.meta | 11 + .../Platform/Editor/PcConfig.cs | 122 + .../Platform/Editor/PcConfig.cs.meta | 3 + .../Platform/Editor/PicoGs.cs | 118 + .../Platform/Editor/PicoGs.cs.meta | 3 + .../Platform/Editor/PlatformConfig.cs | 381 + .../Platform/Editor/PlatformConfig.cs.meta | 3 + .../Editor/PlatformManifestRewrite.cs | 53 + .../Editor/PlatformManifestRewrite.cs.meta | 3 + .../Platform/Editor/PlatformPreprocessor.cs | 36 + .../Editor/PlatformPreprocessor.cs.meta | 3 + .../Platform/PICO.Platform.asmdef | 24 + .../Platform/PICO.Platform.asmdef.meta | 7 + .../Platform/Plugins.meta | 8 + .../Platform/Plugins/Android64.meta | 3 + .../Plugins/Android64/libpxrplatformloader.so | Bin 0 -> 251760 bytes .../Android64/libpxrplatformloader.so.meta | 70 + .../Platform/Plugins/Windows.meta | 8 + .../Platform/Plugins/Windows/RTCFFmpeg.dll | 3 + .../Plugins/Windows/RTCFFmpeg.dll.meta | 70 + .../Plugins/Windows/VolcEngineRTC.dll | 3 + .../Plugins/Windows/VolcEngineRTC.dll.meta | 70 + .../Platform/Plugins/Windows/libEGL.dll | 3 + .../Platform/Plugins/Windows/libEGL.dll.meta | 70 + .../Platform/Plugins/Windows/libGLESv2.dll | 3 + .../Plugins/Windows/libGLESv2.dll.meta | 70 + .../Plugins/Windows/libpxrplatformloader.dll | 3 + .../Windows/libpxrplatformloader.dll.meta | 70 + .../Platform/Plugins/Windows/openh264-4.dll | 3 + .../Plugins/Windows/openh264-4.dll.meta | 70 + .../Platform/Samples.meta | 3 + .../Platform/Samples/Materials.meta | 8 + .../Platform/Samples/Materials/Sky.mat | 55 + .../Platform/Samples/Materials/Sky.mat.meta | 8 + .../Platform/Samples/Materials/skybox.tif | 3 + .../Samples/Materials/skybox.tif.meta | 92 + .../Platform/Samples/SimpleDemo.cs | 118 + .../Platform/Samples/SimpleDemo.cs.meta | 11 + .../Platform/Samples/SimpleDemo.unity | 1902 ++++ .../Platform/Samples/SimpleDemo.unity.meta | 7 + .../Platform/Scripts.meta | 8 + .../Platform/Scripts/CLIB.meta | 3 + .../Platform/Scripts/CLIB/CLIB.cs | 9402 +++++++++++++++++ .../Platform/Scripts/CLIB/CLIB.cs.meta | 11 + .../Platform/Scripts/CLIB/CLIB2.cs | 118 + .../Platform/Scripts/CLIB/CLIB2.cs.meta | 3 + .../Platform/Scripts/CLIB/MarshalUtil.cs | 171 + .../Platform/Scripts/CLIB/MarshalUtil.cs.meta | 3 + .../Platform/Scripts/Framework.meta | 8 + .../Platform/Scripts/Framework/Looper.cs | 170 + .../Platform/Scripts/Framework/Looper.cs.meta | 11 + .../Platform/Scripts/Framework/Message.cs | 117 + .../Scripts/Framework/Message.cs.meta | 11 + .../Scripts/Framework/MessageQueue.cs | 923 ++ .../Scripts/Framework/MessageQueue.cs.meta | 3 + .../Scripts/Framework/PXR_PlatformSetting.cs | 77 + .../Framework/PXR_PlatformSetting.cs.meta | 11 + .../Platform/Scripts/Framework/Runner.cs | 53 + .../Platform/Scripts/Framework/Runner.cs.meta | 11 + .../Platform/Scripts/Framework/Task.cs | 97 + .../Platform/Scripts/Framework/Task.cs.meta | 11 + .../Platform/Scripts/Framework/TimeUtil.cs | 51 + .../Scripts/Framework/TimeUtil.cs.meta | 3 + .../Platform/Scripts/Models.meta | 8 + .../Platform/Scripts/Models/Achievement.cs | 182 + .../Scripts/Models/Achievement.cs.meta | 11 + .../Platform/Scripts/Models/Application.cs | 133 + .../Scripts/Models/Application.cs.meta | 3 + .../Platform/Scripts/Models/AssetFile.cs | 258 + .../Platform/Scripts/Models/AssetFile.cs.meta | 3 + .../Platform/Scripts/Models/Challenge.cs | 268 + .../Platform/Scripts/Models/Challenge.cs.meta | 3 + .../Platform/Scripts/Models/Common.cs | 115 + .../Platform/Scripts/Models/Common.cs.meta | 12 + .../Platform/Scripts/Models/Compliance.cs | 31 + .../Scripts/Models/Compliance.cs.meta | 3 + .../Platform/Scripts/Models/Highlight.cs | 110 + .../Platform/Scripts/Models/Highlight.cs.meta | 3 + .../Platform/Scripts/Models/IAP.cs | 225 + .../Platform/Scripts/Models/IAP.cs.meta | 3 + .../Platform/Scripts/Models/Leaderboard.cs | 146 + .../Scripts/Models/Leaderboard.cs.meta | 3 + .../Platform/Scripts/Models/Matchmaking.cs | 202 + .../Scripts/Models/Matchmaking.cs.meta | 11 + .../Platform/Scripts/Models/Notification.cs | 69 + .../Scripts/Models/Notification.cs.meta | 11 + .../Platform/Scripts/Models/Packet.cs | 91 + .../Platform/Scripts/Models/Packet.cs.meta | 11 + .../Platform/Scripts/Models/Presence.cs | 156 + .../Platform/Scripts/Models/Presence.cs.meta | 11 + .../Platform/Scripts/Models/RTC.cs | 557 + .../Platform/Scripts/Models/RTC.cs.meta | 11 + .../Platform/Scripts/Models/Room.cs | 111 + .../Platform/Scripts/Models/Room.cs.meta | 11 + .../Platform/Scripts/Models/Speech.cs | 65 + .../Platform/Scripts/Models/Speech.cs.meta | 3 + .../Platform/Scripts/Models/Sport.cs | 134 + .../Platform/Scripts/Models/Sport.cs.meta | 3 + .../Platform/Scripts/Models/User.cs | 286 + .../Platform/Scripts/Models/User.cs.meta | 11 + .../Platform/Scripts/Service.meta | 8 + .../Platform/Scripts/Service/Achievements.cs | 339 + .../Scripts/Service/Achievements.cs.meta | 11 + .../Platform/Scripts/Service/Application.cs | 209 + .../Scripts/Service/Application.cs.meta | 11 + .../Platform/Scripts/Service/AssetFile.cs | 251 + .../Scripts/Service/AssetFile.cs.meta | 3 + .../Platform/Scripts/Service/Challenges.cs | 232 + .../Scripts/Service/Challenges.cs.meta | 3 + .../Platform/Scripts/Service/CloudStorage.cs | 26 + .../Scripts/Service/CloudStorage.cs.meta | 3 + .../Platform/Scripts/Service/Compliance.cs | 47 + .../Scripts/Service/Compliance.cs.meta | 3 + .../Platform/Scripts/Service/Core.cs | 256 + .../Platform/Scripts/Service/Core.cs.meta | 11 + .../Platform/Scripts/Service/Highlight.cs | 139 + .../Scripts/Service/Highlight.cs.meta | 3 + .../Platform/Scripts/Service/IAP.cs | 208 + .../Platform/Scripts/Service/IAP.cs.meta | 3 + .../Platform/Scripts/Service/Leaderboard.cs | 275 + .../Scripts/Service/Leaderboard.cs.meta | 3 + .../Platform/Scripts/Service/Matchmaking.cs | 482 + .../Scripts/Service/Matchmaking.cs.meta | 11 + .../Platform/Scripts/Service/Network.cs | 194 + .../Platform/Scripts/Service/Network.cs.meta | 11 + .../Platform/Scripts/Service/Notification.cs | 64 + .../Scripts/Service/Notification.cs.meta | 11 + .../Platform/Scripts/Service/Presence.cs | 502 + .../Platform/Scripts/Service/Presence.cs.meta | 11 + .../Platform/Scripts/Service/RTC.cs | 978 ++ .../Platform/Scripts/Service/RTC.cs.meta | 11 + .../Platform/Scripts/Service/Room.cs | 736 ++ .../Platform/Scripts/Service/Room.cs.meta | 11 + .../Platform/Scripts/Service/Speech.cs | 120 + .../Platform/Scripts/Service/Speech.cs.meta | 3 + .../Platform/Scripts/Service/Sport.cs | 108 + .../Platform/Scripts/Service/Sport.cs.meta | 3 + .../Platform/Scripts/Service/User.cs | 290 + .../Platform/Scripts/Service/User.cs.meta | 11 + .../Runtime.meta | 8 + .../Runtime/Android.meta | 8 + .../Runtime/Android/arm64.meta | 8 + .../Runtime/Android/arm64/libopenxr_loader.so | Bin 0 -> 1141360 bytes .../Android/arm64/libopenxr_loader.so.meta | 70 + .../Runtime/Android/arm64/libopenxr_pico.so | Bin 0 -> 573992 bytes .../Android/arm64/libopenxr_pico.so.meta | 71 + .../Runtime/Controller.meta | 8 + .../Controller/PXR_ControllerAnimator.cs | 105 + .../Controller/PXR_ControllerAnimator.cs.meta | 11 + .../Controller/PXR_ControllerG3Animator.cs | 70 + .../PXR_ControllerG3Animator.cs.meta | 11 + .../Controller/PXR_ControllerLoader.cs | 182 + .../Controller/PXR_ControllerLoader.cs.meta | 11 + .../Runtime/Controller/PXR_ControllerPower.cs | 128 + .../Controller/PXR_ControllerPower.cs.meta | 11 + .../PXR_ControllerWithHandAnimator.cs | 304 + .../PXR_ControllerWithHandAnimator.cs.meta | 11 + .../Runtime/Features.meta | 3 + .../Runtime/Features/CompositeLayerFeature.cs | 681 ++ .../Features/CompositeLayerFeature.cs.meta | 11 + .../Runtime/Features/CompositeLayerManager.cs | 338 + .../Features/CompositeLayerManager.cs.meta | 11 + .../Features/DisplayRefreshRateFeature.cs | 175 + .../DisplayRefreshRateFeature.cs.meta | 3 + .../Runtime/Features/FoveationFeature.cs | 159 + .../Runtime/Features/FoveationFeature.cs.meta | 11 + .../Features/LayerSecureContentFeature.cs | 62 + .../LayerSecureContentFeature.cs.meta | 3 + .../Runtime/Features/MixedReality.meta | 8 + .../Features/MixedReality/MR_Plugin.cs | 927 ++ .../Features/MixedReality/MR_Plugin.cs.meta | 3 + .../Features/MixedReality/PXR_MixedReality.cs | 1048 ++ .../MixedReality/PXR_MixedReality.cs.meta | 11 + .../MixedReality/PXR_SpatialMeshManager.cs | 296 + .../PXR_SpatialMeshManager.cs.meta | 11 + .../Runtime/Features/OpenXRExtensions.cs | 411 + .../Runtime/Features/OpenXRExtensions.cs.meta | 3 + .../Runtime/Features/PICO.meta | 8 + .../Runtime/Features/PICO/PICOSceneCapture.cs | 54 + .../Features/PICO/PICOSceneCapture.cs.meta | 3 + .../Features/PICO/PICOSpatialAnchor.cs | 95 + .../Features/PICO/PICOSpatialAnchor.cs.meta | 3 + .../Runtime/Features/PICO/PICOSpatialMesh.cs | 70 + .../Features/PICO/PICOSpatialMesh.cs.meta | 3 + .../Runtime/Features/PassthroughFeature.cs | 532 + .../Features/PassthroughFeature.cs.meta | 3 + .../Features/PassthroughLayerFeature.cs | 81 + .../Features/PassthroughLayerFeature.cs.meta | 3 + .../Features/PerformanceSettingsFeature.cs | 113 + .../PerformanceSettingsFeature.cs.meta | 3 + .../Runtime/Features/Utils.meta | 3 + .../Runtime/Features/Utils/LayerBase.cs | 108 + .../Runtime/Features/Utils/LayerBase.cs.meta | 3 + .../Runtime/Features/Utils/LitJson.meta | 8 + .../Features/Utils/LitJson/IJsonWrapper.cs | 60 + .../Utils/LitJson/IJsonWrapper.cs.meta | 11 + .../Features/Utils/LitJson/JsonData.cs | 1059 ++ .../Features/Utils/LitJson/JsonData.cs.meta | 11 + .../Features/Utils/LitJson/JsonException.cs | 65 + .../Utils/LitJson/JsonException.cs.meta | 11 + .../Features/Utils/LitJson/JsonMapper.cs | 987 ++ .../Features/Utils/LitJson/JsonMapper.cs.meta | 11 + .../Features/Utils/LitJson/JsonMockWrapper.cs | 105 + .../Utils/LitJson/JsonMockWrapper.cs.meta | 11 + .../Features/Utils/LitJson/JsonReader.cs | 478 + .../Features/Utils/LitJson/JsonReader.cs.meta | 11 + .../Features/Utils/LitJson/JsonWriter.cs | 484 + .../Features/Utils/LitJson/JsonWriter.cs.meta | 11 + .../Runtime/Features/Utils/LitJson/Lexer.cs | 912 ++ .../Features/Utils/LitJson/Lexer.cs.meta | 11 + .../Utils/LitJson/Netstandard15Polyfill.cs | 24 + .../LitJson/Netstandard15Polyfill.cs.meta | 11 + .../Features/Utils/LitJson/ParserToken.cs | 44 + .../Utils/LitJson/ParserToken.cs.meta | 11 + .../Features/Utils/OpenXRFeatureBase.cs | 126 + .../Features/Utils/OpenXRFeatureBase.cs.meta | 3 + .../Features/Utils/OpenXRNativeTypes.cs | 755 ++ .../Features/Utils/OpenXRNativeTypes.cs.meta | 3 + .../Runtime/Features/Utils/PLog.cs | 104 + .../Runtime/Features/Utils/PLog.cs.meta | 11 + .../Features/Utils/PXR_PermissionRequest.cs | 93 + .../Utils/PXR_PermissionRequest.cs.meta | 11 + .../Runtime/Features/Utils/PXR_Plugin.cs | 251 + .../Runtime/Features/Utils/PXR_Plugin.cs.meta | 3 + .../Runtime/Features/Utils/PXR_Type.cs | 711 ++ .../Runtime/Features/Utils/PXR_Type.cs.meta | 3 + .../Runtime/Interactions.meta | 3 + .../Interactions/PICO4ControllerProfile.cs | 736 ++ .../PICO4ControllerProfile.cs.meta | 11 + .../PICO4UltraControllerProfile.cs | 737 ++ .../PICO4UltraControllerProfile.cs.meta | 3 + .../Interactions/PICOG3ControllerProfile.cs | 490 + .../PICOG3ControllerProfile.cs.meta | 11 + .../Interactions/PICONeo3ControllerProfile.cs | 732 ++ .../PICONeo3ControllerProfile.cs.meta | 11 + .../Interactions/Unity.XR.OpenXRPICO.asmdef | 28 + .../Unity.XR.OpenXRPICO.asmdef.meta | 7 + .../Runtime/PICOFeature.cs | 153 + .../Runtime/PICOFeature.cs.meta | 11 + .../Runtime/PICOManager.cs | 229 + .../Runtime/PICOManager.cs.meta | 3 + .../Runtime/PICOProjectSetting.cs | 100 + .../Runtime/PICOProjectSetting.cs.meta | 3 + .../Runtime/PICOScreenFade.cs | 214 + .../Runtime/PICOScreenFade.cs.meta | 11 + .../Runtime/Subsystem.meta | 8 + .../Runtime/Subsystem/PICOAnchorSubsystem.cs | 165 + .../Subsystem/PICOAnchorSubsystem.cs.meta | 3 + .../Runtime/Subsystem/PICOCameraSubsystem.cs | 70 + .../Subsystem/PICOCameraSubsystem.cs.meta | 11 + .../Runtime/Subsystem/PICOSessionSubsystem.cs | 114 + .../Subsystem/PICOSessionSubsystem.cs.meta | 3 + ...nity.XR.OpenXR.Features.PICOSupport.asmdef | 26 + ...XR.OpenXR.Features.PICOSupport.asmdef.meta | 7 + .../Runtime/UnitySubsystemsManifest.json | 10 + .../Runtime/UnitySubsystemsManifest.json.meta | 7 + .../package.json | 18 + .../package.json.meta | 7 + Packages/packages-lock.json | 9 + 628 files changed, 68895 insertions(+), 2 deletions(-) create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_b_l.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_b_l.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_l.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_l.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_axis_l.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_axis_l.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_b_l.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_b_l.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_grip_l.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_grip_l.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_index_l.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_index_l.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_thumb_l.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_thumb_l.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_trigger_l.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_trigger_l.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_axis_r.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_axis_r.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_grip_r.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_grip_r.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_index_r.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_index_r.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_thumb_r.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_thumb_r.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_trigger_r.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_trigger_r.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_r.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_r.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_y_r.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_y_r.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_y_r.mask create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_y_r.mask.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_L.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_L.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_R.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_R.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand_X_A_Y_B.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand_X_A_Y_B.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand_X_A_Y_B.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand_X_A_Y_B.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_l.overrideController create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_l.overrideController.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_r.controller create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_r.controller.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/leftHand.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/leftHand.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/rightHand.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/rightHand.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3_Power.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3_Power.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/TouchSphere.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/TouchSphere.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/G3.FBX create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/G3.FBX.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/dianliang.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/dianliang.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders/PXR_G3.shader create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders/PXR_G3.shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/G3.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/G3.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_01.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_01.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_02.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_02.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_03.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_03.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_04.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_04.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_05.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_05.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 L.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 L.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 R.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 R.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Left.controller create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Left.controller.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Right.controller create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Right.controller.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Left.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Left.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Right.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Right.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Left.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Left.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Right.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Right.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Left.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Left.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Right.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Right.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/PXR_Neo3.shader create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/PXR_Neo3.shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures/controller5_idle.jpg create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures/controller5_idle.jpg.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 L.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 L.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 R.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 R.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Left.controller create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Left.controller.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Right.controller create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Right.controller.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4_Controller.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4_Controller.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4__Power.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4__Power.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Left.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Left.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Right.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Right.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4.shader create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4.shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4_Power.shader create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4_Power.shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/PICO4_Controller_Albedo.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/PICO4_Controller_Albedo.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_01.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_01.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_02.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_02.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_03.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_03.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_04.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_04.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_05.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_05.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L WithHand.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L WithHand.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R WithHand.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R WithHand.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Left.overrideController create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Left.overrideController.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Right.overrideController create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Right.overrideController.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_left_01.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_left_01.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_right_01.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_right_01.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_power.shader create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_power.shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_shader_code.shader create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_shader_code.shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_01_b.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_01_b.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_a.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_a.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_b.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_b.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_01.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_01.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_02.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_02.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_03.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_03.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_04.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_04.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_05.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_05.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_01_b.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_01_b.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_02_b.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_02_b.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_03_b.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_03_b.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_01.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_01.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_02.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_02.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_03.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_03.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_04.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_04.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_05.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_05.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_01_b.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_01_b.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_02_b.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_02_b.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_01_b.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_01_b.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_02_a.png create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_02_a.png.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_01_m.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_01_m.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_power_m.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_power_m.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_L.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_L.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_R.fbx create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_R.fbx.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/PXR_Hand.shader create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/PXR_Hand.shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/UnderlayHole.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/UnderlayHole.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/LeftControllerModel.prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/LeftControllerModel.prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/RightControllerModel .prefab create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/RightControllerModel .prefab.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_CubemapBlit.shader create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_CubemapBlit.shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_Fade.shader create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_Fade.shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_UnderlayHole.shader create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_UnderlayHole.shader.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOCompositeLayerEditor.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOCompositeLayerEditor.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureEditor.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureEditor.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureSet.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureSet.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOModifyAndroidManifest.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOModifyAndroidManifest.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/Unity.XR.OpenXR.Features.PICOSupport.Editor.asmdef create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/Unity.XR.OpenXR.Features.PICOSupport.Editor.asmdef.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/PICOXR.TobSupport.asmdef create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/PICOXR.TobSupport.asmdef.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerKeyEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerKeyEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerPairTimeEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerPairTimeEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/CustomizeSettingsTabEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/CustomizeSettingsTabEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/DeviceControlEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/DeviceControlEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeEventEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeEventEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeFunctionEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeFunctionEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionOrStatusEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionOrStatusEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionValueEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionValueEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastUrlTypeEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastUrlTypeEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PackageControlEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PackageControlEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PicoCastMediaFormat.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PicoCastMediaFormat.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PoseErrorTypeEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PoseErrorTypeEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PowerOnOffLogoEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PowerOnOffLogoEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreenOffDelayTimeEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreenOffDelayTimeEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreencastAudioOutputEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreencastAudioOutputEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SleepDelayTimeEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SleepDelayTimeEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/StartVRSettingsEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/StartVRSettingsEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SwitchEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SwitchEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemFunctionSwitchEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemFunctionSwitchEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemInfoEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemInfoEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/USBConfigModeEnum.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/USBConfigModeEnum.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BindCallback.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BindCallback.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BoolCallback.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BoolCallback.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/FileCopyCallback.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/FileCopyCallback.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/IntCallback.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/IntCallback.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/LongCallback.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/LongCallback.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/MarkerInfoCallback.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/MarkerInfoCallback.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/StringCallback.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/StringCallback.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/WifiDisplayModelCallback.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/WifiDisplayModelCallback.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/MarkerInfo.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/MarkerInfo.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/WifiDisplayModel.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/WifiDisplayModel.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/PXR_Enterprise.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/PXR_Enterprise.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterprisePlugin.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterprisePlugin.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterpriseTools.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterpriseTools.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct/RGBCameraStruct.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct/RGBCameraStruct.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/BAuthLib-1.0.0.aar create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/BAuthLib-1.0.0.aar.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/gson-2.10.1.jar create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/gson-2.10.1.jar.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tob_api-release.aar create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tob_api-release.aar.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tobservicelib-release.aar create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tobservicelib-release.aar.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/EditorConf.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/EditorConf.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Gs.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Gs.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Menu.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Menu.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PICO.Platform.Editor.asmdef create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PICO.Platform.Editor.asmdef.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PXR_PlatformSettingEditor.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PXR_PlatformSettingEditor.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PcConfig.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PcConfig.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PicoGs.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PicoGs.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformConfig.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformConfig.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformManifestRewrite.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformManifestRewrite.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformPreprocessor.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformPreprocessor.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/PICO.Platform.asmdef create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/PICO.Platform.asmdef.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Android64.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Android64/libpxrplatformloader.so create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Android64/libpxrplatformloader.so.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/RTCFFmpeg.dll create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/RTCFFmpeg.dll.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/VolcEngineRTC.dll create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/VolcEngineRTC.dll.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/libEGL.dll create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/libEGL.dll.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/libGLESv2.dll create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/libGLESv2.dll.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/libpxrplatformloader.dll create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/libpxrplatformloader.dll.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/openh264-4.dll create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Windows/openh264-4.dll.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/Materials.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/Materials/Sky.mat create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/Materials/Sky.mat.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/Materials/skybox.tif create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/Materials/skybox.tif.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.unity create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.unity.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB2.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB2.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/MarshalUtil.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/MarshalUtil.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Looper.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Looper.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Message.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Message.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/MessageQueue.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/MessageQueue.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/PXR_PlatformSetting.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/PXR_PlatformSetting.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Runner.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Runner.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Task.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Task.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/TimeUtil.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/TimeUtil.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Achievement.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Achievement.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Application.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Application.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/AssetFile.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/AssetFile.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Challenge.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Challenge.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Common.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Common.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Compliance.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Compliance.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Highlight.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Highlight.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/IAP.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/IAP.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Leaderboard.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Leaderboard.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Matchmaking.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Matchmaking.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Notification.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Notification.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Packet.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Packet.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Presence.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Presence.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/RTC.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/RTC.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Room.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Room.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Speech.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Speech.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Sport.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Sport.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/User.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/User.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Achievements.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Achievements.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Application.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Application.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/AssetFile.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/AssetFile.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Challenges.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Challenges.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/CloudStorage.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/CloudStorage.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Compliance.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Compliance.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Core.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Core.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Highlight.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Highlight.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/IAP.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/IAP.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Leaderboard.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Leaderboard.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Matchmaking.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Matchmaking.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Network.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Network.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Notification.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Notification.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Presence.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Presence.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/RTC.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/RTC.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Room.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Room.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Speech.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Speech.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Sport.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Sport.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/User.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/User.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android/arm64.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android/arm64/libopenxr_loader.so create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android/arm64/libopenxr_loader.so.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android/arm64/libopenxr_pico.so create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android/arm64/libopenxr_pico.so.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerAnimator.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerAnimator.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerG3Animator.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerG3Animator.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerLoader.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerLoader.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerPower.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerPower.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerWithHandAnimator.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerWithHandAnimator.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerFeature.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerFeature.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerManager.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerManager.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/DisplayRefreshRateFeature.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/DisplayRefreshRateFeature.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/FoveationFeature.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/FoveationFeature.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/LayerSecureContentFeature.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/LayerSecureContentFeature.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/MR_Plugin.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/MR_Plugin.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_MixedReality.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_MixedReality.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_SpatialMeshManager.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_SpatialMeshManager.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/OpenXRExtensions.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/OpenXRExtensions.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSceneCapture.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSceneCapture.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialAnchor.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialAnchor.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialMesh.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialMesh.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughFeature.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughFeature.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughLayerFeature.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughLayerFeature.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PerformanceSettingsFeature.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PerformanceSettingsFeature.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LayerBase.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LayerBase.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/IJsonWrapper.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/IJsonWrapper.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonData.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonData.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonException.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonException.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMapper.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMapper.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMockWrapper.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMockWrapper.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonReader.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonReader.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonWriter.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonWriter.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Lexer.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Lexer.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Netstandard15Polyfill.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Netstandard15Polyfill.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/ParserToken.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/ParserToken.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRFeatureBase.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRFeatureBase.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRNativeTypes.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRNativeTypes.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PLog.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PLog.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_PermissionRequest.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_PermissionRequest.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Plugin.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Plugin.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Type.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Type.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4ControllerProfile.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4ControllerProfile.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4UltraControllerProfile.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4UltraControllerProfile.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICOG3ControllerProfile.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICOG3ControllerProfile.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICONeo3ControllerProfile.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICONeo3ControllerProfile.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/Unity.XR.OpenXRPICO.asmdef create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/Unity.XR.OpenXRPICO.asmdef.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOFeature.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOFeature.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOManager.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOManager.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOProjectSetting.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOProjectSetting.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOScreenFade.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOScreenFade.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOAnchorSubsystem.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOAnchorSubsystem.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOCameraSubsystem.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOCameraSubsystem.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOSessionSubsystem.cs create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOSessionSubsystem.cs.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Unity.XR.OpenXR.Features.PICOSupport.asmdef create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Unity.XR.OpenXR.Features.PICOSupport.asmdef.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/UnitySubsystemsManifest.json create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/UnitySubsystemsManifest.json.meta create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/package.json create mode 100644 Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/package.json.meta diff --git a/Assets/XR/Settings/OpenXR Editor Settings.asset b/Assets/XR/Settings/OpenXR Editor Settings.asset index c2917a2..57b57c1 100644 --- a/Assets/XR/Settings/OpenXR Editor Settings.asset +++ b/Assets/XR/Settings/OpenXR Editor Settings.asset @@ -12,6 +12,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 975057b4fdcfb8142b3080d19a5cc712, type: 3} m_Name: OpenXR Editor Settings m_EditorClassIdentifier: - Keys: - Values: [] + Keys: 07000000 + Values: + - featureSets: [] m_vulkanAdditionalGraphicsQueue: 0 diff --git a/Assets/XR/Settings/OpenXR Package Settings.asset b/Assets/XR/Settings/OpenXR Package Settings.asset index 31863fc..2e4062e 100644 --- a/Assets/XR/Settings/OpenXR Package Settings.asset +++ b/Assets/XR/Settings/OpenXR Package Settings.asset @@ -1,5 +1,26 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!114 &-9108296238869793286 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b1248416ce414cd0a788c5240bec5766, type: 3} + m_Name: PICOSpatialMesh Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: PICO Spatial Mesh + version: 1.0.0 + featureIdInternal: com.pico.openxr.feature.spatialmesh + openxrExtensionStrings: XR_PICO_spatial_mesh XR_PICO_spatial_sensing XR_EXT_future + company: PICO + priority: 0 + required: 0 + LOD: 0 --- !u!114 &-8146551627752511340 MonoBehaviour: m_ObjectHideFlags: 0 @@ -20,6 +41,46 @@ MonoBehaviour: company: Unity priority: 0 required: 0 +--- !u!114 &-7649041839370906959 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2a7d8f73c864e74eb753124087176f4, type: 3} + m_Name: PICO4ControllerProfile Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: PICO4 Touch Controller Profile + version: 1.0.0 + featureIdInternal: com.unity.openxr.feature.input.PICO4touch + openxrExtensionStrings: XR_BD_controller_interaction + company: PICO + priority: 0 + required: 0 +--- !u!114 &-6034472836761018925 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2b8a6d03de5f8f34383932f29d464a21, type: 3} + m_Name: PICONeo3ControllerProfile Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: PICO Neo3 Touch Controller Profile + version: 1.0.0 + featureIdInternal: com.unity.openxr.feature.input.PICONeo3touch + openxrExtensionStrings: XR_BD_controller_interaction + company: PICO + priority: 0 + required: 0 --- !u!114 &-5226143836710836960 MonoBehaviour: m_ObjectHideFlags: 0 @@ -101,6 +162,46 @@ MonoBehaviour: m_depthSubmissionMode: 0 m_optimizeBufferDiscards: 0 m_symmetricProjection: 0 +--- !u!114 &-3679551036866486216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 48a4218836ed47e2b2fe51c7c56925c7, type: 3} + m_Name: PerformanceSettingsFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: OpenXR Performance Settings + version: 1.0.0 + featureIdInternal: com.pico.openxr.feature.performancesettings + openxrExtensionStrings: XR_EXT_performance_settings + company: PICO + priority: 0 + required: 0 +--- !u!114 &-3649495988766833426 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a8b7731b990240c0b289e41fb880787b, type: 3} + m_Name: PICOSpatialAnchor Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: PICO Spatial Anchor + version: 1.0.0 + featureIdInternal: com.pico.openxr.feature.spatialanchor + openxrExtensionStrings: XR_PICO_spatial_anchor XR_PICO_spatial_sensing XR_EXT_future + company: PICO + priority: 0 + required: 0 --- !u!114 &-3481567510871780715 MonoBehaviour: m_ObjectHideFlags: 0 @@ -201,6 +302,46 @@ MonoBehaviour: company: Unity priority: 0 required: 0 +--- !u!114 &-1321381335546775959 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 233eef4f97ef4b0b8b65c5030c0b05f7, type: 3} + m_Name: DisplayRefreshRateFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: OpenXR Display Refresh Rate + version: 1.0.0 + featureIdInternal: com.pico.openxr.feature.refreshrate + openxrExtensionStrings: XR_FB_display_refresh_rate + company: PICO + priority: 0 + required: 0 +--- !u!114 &-1143834028155632764 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7d49168b6dfb469dadf8cd56e4ab8884, type: 3} + m_Name: PassthroughFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: OpenXR Passthrough + version: 1.0.0 + featureIdInternal: com.pico.openxr.feature.passthrough + openxrExtensionStrings: XR_FB_passthrough + company: PICO + priority: 0 + required: 0 --- !u!114 &-855441602587113020 MonoBehaviour: m_ObjectHideFlags: 0 @@ -247,6 +388,20 @@ MonoBehaviour: m_Name: Android m_EditorClassIdentifier: features: + - {fileID: 5914258216375899849} + - {fileID: -7649041839370906959} + - {fileID: 5561620637849874631} + - {fileID: -6034472836761018925} + - {fileID: -3679551036866486216} + - {fileID: 2289632375106342978} + - {fileID: -1321381335546775959} + - {fileID: 7125477652608497091} + - {fileID: 4556434061474762281} + - {fileID: -1143834028155632764} + - {fileID: -3649495988766833426} + - {fileID: -9108296238869793286} + - {fileID: 4523401926784539240} + - {fileID: 3321646004850517085} - {fileID: -2466123344957557661} - {fileID: 2718171240348235491} - {fileID: 1141069219629280137} @@ -448,6 +603,26 @@ MonoBehaviour: company: Unity priority: 0 required: 0 +--- !u!114 &2289632375106342978 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a0b5403262c64d5888bf5672e1e1f3bb, type: 3} + m_Name: PICOSceneCapture Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: PICO Scene Capture + version: 1.0.0 + featureIdInternal: com.pico.openxr.feature.scenecapture + openxrExtensionStrings: XR_PICO_scene_capture XR_PICO_spatial_sensing XR_EXT_future + company: PICO + priority: 0 + required: 0 --- !u!114 &2463518056143399292 MonoBehaviour: m_ObjectHideFlags: 0 @@ -543,6 +718,27 @@ MonoBehaviour: required: 0 cacheSize: 1048576 perThreadCacheSize: 51200 +--- !u!114 &3321646004850517085 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: baa5b568c4324bd4faad2da2e7ee7e84, type: 3} + m_Name: PICOFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: PICO Support + version: 1.3.3 + featureIdInternal: com.unity.openxr.feature.pico + openxrExtensionStrings: + company: PICO + priority: 0 + required: 0 + isPicoSupport: 0 --- !u!114 &3911856449119357355 MonoBehaviour: m_ObjectHideFlags: 0 @@ -605,6 +801,48 @@ MonoBehaviour: required: 0 cacheSize: 1048576 perThreadCacheSize: 51200 +--- !u!114 &4523401926784539240 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 077bca9897b444788c83491c066a79b1, type: 3} + m_Name: OpenXRExtensions Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: PICO OpenXR Features + version: 1.0.0 + featureIdInternal: com.unity.openxr.pico.features + openxrExtensionStrings: XR_EXT_local_floor XR_FB_triangle_mesh XR_FB_composition_layer_alpha_blend + XR_KHR_composition_layer_color_scale_bias XR_KHR_composition_layer_cylinder XR_KHR_composition_layer_equirect + XR_KHR_composition_layer_cube + company: PICO + priority: 0 + required: 0 +--- !u!114 &4556434061474762281 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 105a2b5276c1435d8411162e42e5064e, type: 3} + m_Name: LayerSecureContentFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: OpenXR Composition Layer Secure Content + version: 1.0.0 + featureIdInternal: com.pico.openxr.feature.LayerSecureContent + openxrExtensionStrings: XR_FB_composition_layer_secure_content + company: PICO + priority: 0 + required: 0 --- !u!114 &4583337648497013858 MonoBehaviour: m_ObjectHideFlags: 0 @@ -668,6 +906,46 @@ MonoBehaviour: required: 0 targetQuest: 1 targetQuest2: 1 +--- !u!114 &5561620637849874631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f528fb360066460c862f7a0ce1d8ad4c, type: 3} + m_Name: PICO4UltraControllerProfile Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: PICO4 Ultra Touch Controller Profile + version: 1.0.0 + featureIdInternal: com.unity.openxr.feature.input.PICO4Ultratouch + openxrExtensionStrings: XR_BD_controller_interaction + company: PICO + priority: 0 + required: 0 +--- !u!114 &5914258216375899849 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 21ea647c7f744df897be6365cbf559b7, type: 3} + m_Name: PICOG3ControllerProfile Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: PICOG3 Touch Controller Profile + version: 1.0.0 + featureIdInternal: com.unity.openxr.feature.input.PICOG3touch + openxrExtensionStrings: XR_BD_controller_interaction + company: PICO + priority: 0 + required: 0 --- !u!114 &5935454854569405708 MonoBehaviour: m_ObjectHideFlags: 0 @@ -748,6 +1026,27 @@ MonoBehaviour: company: Unity priority: 0 required: 0 +--- !u!114 &7125477652608497091 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f636716e11d15b4bbafb76eb9d63555, type: 3} + m_Name: FoveationFeature Android + m_EditorClassIdentifier: + m_enabled: 0 + nameUi: OpenXR Foveation + version: 1.0.0 + featureIdInternal: com.pico.openxr.feature.foveation + openxrExtensionStrings: 'XR_FB_foveation XR_FB_foveation_configuration XR_FB_foveation_vulkan + XR_META_foveation_eye_tracked XR_META_vulkan_swapchain_create_info XR_FB_swapchain_update_state ' + company: PICO + priority: 0 + required: 0 --- !u!114 &7240929883912825054 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets.meta new file mode 100644 index 0000000..e295e67 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9d4180f0db76cb44ab748525ae8906ff +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources.meta new file mode 100644 index 0000000..d8625ba --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b1debb95d47439345a691476b4f5c077 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller.meta new file mode 100644 index 0000000..b34d68e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bec0b6a8822fa3545bd8d1865e2c8940 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand.meta new file mode 100644 index 0000000..ff5de8c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 68b8fe83288a79c4bb1634e9e9e80640 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l.meta new file mode 100644 index 0000000..0a6cb8a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 383e67c791dfb4c4b90e2c2ad7ce512d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_b_l.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_b_l.mask new file mode 100644 index 0000000..dc0027b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_b_l.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_a_b_l + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_left + m_Weight: 0 + - m_Path: o_com_sparrow_left + m_Weight: 0 + - m_Path: o_com_sparrow_left_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/left_wrist + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_palm + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + m_Weight: 1 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLX + m_Weight: 1 + - m_Path: root/SkinRoot/SkinLY + m_Weight: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_b_l.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_b_l.mask.meta new file mode 100644 index 0000000..ecaf5c0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_b_l.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 173621e98c19c493a8f0288d8a933bed +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_l.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_l.mask new file mode 100644 index 0000000..bcfe5f7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_l.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_a_l + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_left + m_Weight: 0 + - m_Path: o_com_sparrow_left + m_Weight: 0 + - m_Path: o_com_sparrow_left_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/left_wrist + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_palm + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + m_Weight: 1 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLX + m_Weight: 1 + - m_Path: root/SkinRoot/SkinLY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_l.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_l.mask.meta new file mode 100644 index 0000000..93fffb4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_a_l.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f29a0ab70d309499c9c2d61a919d5020 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_axis_l.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_axis_l.mask new file mode 100644 index 0000000..e91cd56 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_axis_l.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_axis_l + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_left + m_Weight: 0 + - m_Path: o_com_sparrow_left + m_Weight: 0 + - m_Path: o_com_sparrow_left_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/left_wrist + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_palm + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + m_Weight: 1 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLJoystick + m_Weight: 1 + - m_Path: root/SkinRoot/SkinLMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_axis_l.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_axis_l.mask.meta new file mode 100644 index 0000000..dfedf29 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_axis_l.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bbb43fe65b38f4083bc5e644fe958f95 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_b_l.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_b_l.mask new file mode 100644 index 0000000..b5ff66e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_b_l.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_b_l + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_left + m_Weight: 0 + - m_Path: o_com_sparrow_left + m_Weight: 0 + - m_Path: o_com_sparrow_left_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/left_wrist + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_palm + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + m_Weight: 1 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLY + m_Weight: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_b_l.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_b_l.mask.meta new file mode 100644 index 0000000..b37b96e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_b_l.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4a887bf25b2d04a1bae1669ae6747419 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_grip_l.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_grip_l.mask new file mode 100644 index 0000000..3432e2a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_grip_l.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_grip_l + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_left + m_Weight: 0 + - m_Path: o_com_sparrow_left + m_Weight: 0 + - m_Path: o_com_sparrow_left_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/left_wrist + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal + m_Weight: 1 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + m_Weight: 1 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + m_Weight: 1 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + m_Weight: 1 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + m_Weight: 1 + - m_Path: root/left_wrist/left_palm + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + m_Weight: 0 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLGrip + m_Weight: 1 + - m_Path: root/SkinRoot/SkinLJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_grip_l.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_grip_l.mask.meta new file mode 100644 index 0000000..44fdda4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_grip_l.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4a1294d789b914d428541b480a16682c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_index_l.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_index_l.mask new file mode 100644 index 0000000..1628c21 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_index_l.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_index_l + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_left + m_Weight: 0 + - m_Path: o_com_sparrow_left + m_Weight: 0 + - m_Path: o_com_sparrow_left_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/left_wrist + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal + m_Weight: 1 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal + m_Weight: 1 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + m_Weight: 1 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + m_Weight: 1 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + m_Weight: 1 + - m_Path: root/left_wrist/left_little_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_palm + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + m_Weight: 0 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_index_l.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_index_l.mask.meta new file mode 100644 index 0000000..f2b370e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_index_l.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1a1333616d23d473a9564f02435a3d0b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_thumb_l.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_thumb_l.mask new file mode 100644 index 0000000..f22ae7b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_thumb_l.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_thumb_l + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_left + m_Weight: 0 + - m_Path: o_com_sparrow_left + m_Weight: 0 + - m_Path: o_com_sparrow_left_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/left_wrist + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_palm + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + m_Weight: 1 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + m_Weight: 1 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_thumb_l.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_thumb_l.mask.meta new file mode 100644 index 0000000..912a637 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_thumb_l.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fe8f7cd36e24d495c91d49ab5dcedc71 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_trigger_l.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_trigger_l.mask new file mode 100644 index 0000000..9489bdd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_trigger_l.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_trigger_l + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_left + m_Weight: 0 + - m_Path: o_com_sparrow_left + m_Weight: 0 + - m_Path: o_com_sparrow_left_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/left_wrist + m_Weight: 0 + - m_Path: root/left_wrist/left_index_metacarpal + m_Weight: 1 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal + m_Weight: 1 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + m_Weight: 1 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + m_Weight: 1 + - m_Path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + m_Weight: 1 + - m_Path: root/left_wrist/left_little_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_palm + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + m_Weight: 0 + - m_Path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + m_Weight: 0 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLTrigger + m_Weight: 1 + - m_Path: root/SkinRoot/SkinLX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinLY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_trigger_l.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_trigger_l.mask.meta new file mode 100644 index 0000000..a43fa19 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_l/mask_trigger_l.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: af135a35702834f20bb1e953c31f88ab +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r.meta new file mode 100644 index 0000000..7f73650 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e625d500d45755c40a6c0a77b7efedbe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_axis_r.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_axis_r.mask new file mode 100644 index 0000000..2c91aa0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_axis_r.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_axis_r + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_right + m_Weight: 0 + - m_Path: o_com_sparrow_right + m_Weight: 0 + - m_Path: o_com_sparrow_right_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/right_wrist + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_palm + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + m_Weight: 1 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRJoystick + m_Weight: 1 + - m_Path: root/SkinRoot/SkinRMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_axis_r.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_axis_r.mask.meta new file mode 100644 index 0000000..826001e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_axis_r.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 19109cae5d3dd4a21ab383ac58d3eb7d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_grip_r.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_grip_r.mask new file mode 100644 index 0000000..8ea3a58 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_grip_r.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_grip_r + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_right + m_Weight: 0 + - m_Path: o_com_sparrow_right + m_Weight: 0 + - m_Path: o_com_sparrow_right_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/right_wrist + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal + m_Weight: 1 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + m_Weight: 1 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + m_Weight: 1 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + m_Weight: 1 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + m_Weight: 1 + - m_Path: root/right_wrist/right_palm + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + m_Weight: 0 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRGrip + m_Weight: 1 + - m_Path: root/SkinRoot/SkinRJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_grip_r.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_grip_r.mask.meta new file mode 100644 index 0000000..ca5e465 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_grip_r.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7a424ef8cd6e9456fa0284c70460ce38 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_index_r.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_index_r.mask new file mode 100644 index 0000000..4ee9d12 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_index_r.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_index_r + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_right + m_Weight: 0 + - m_Path: o_com_sparrow_right + m_Weight: 0 + - m_Path: o_com_sparrow_right_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/right_wrist + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal + m_Weight: 1 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal + m_Weight: 1 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + m_Weight: 1 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + m_Weight: 1 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + m_Weight: 1 + - m_Path: root/right_wrist/right_little_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_palm + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + m_Weight: 0 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_index_r.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_index_r.mask.meta new file mode 100644 index 0000000..376bd9b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_index_r.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b12bcf1b2bfdc440999b5f1bc7dde1a2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_thumb_r.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_thumb_r.mask new file mode 100644 index 0000000..072afff --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_thumb_r.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_thumb_r + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_right + m_Weight: 0 + - m_Path: o_com_sparrow_right + m_Weight: 0 + - m_Path: o_com_sparrow_right_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/right_wrist + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_palm + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + m_Weight: 1 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_thumb_r.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_thumb_r.mask.meta new file mode 100644 index 0000000..a3bdfec --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_thumb_r.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a6cb34d0ab58a45b99e72f6e91ab2f6a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_trigger_r.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_trigger_r.mask new file mode 100644 index 0000000..16374f1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_trigger_r.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_trigger_r + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_right + m_Weight: 0 + - m_Path: o_com_sparrow_right + m_Weight: 0 + - m_Path: o_com_sparrow_right_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/right_wrist + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal + m_Weight: 1 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal + m_Weight: 1 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + m_Weight: 1 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + m_Weight: 1 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + m_Weight: 1 + - m_Path: root/right_wrist/right_little_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_palm + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + m_Weight: 0 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRTrigger + m_Weight: 1 + - m_Path: root/SkinRoot/SkinRX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_trigger_r.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_trigger_r.mask.meta new file mode 100644 index 0000000..0bdda88 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_trigger_r.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2f872c920e7224f889cde9b63d7311cc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_r.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_r.mask new file mode 100644 index 0000000..1047a10 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_r.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_x_r + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_right + m_Weight: 0 + - m_Path: o_com_sparrow_right + m_Weight: 0 + - m_Path: o_com_sparrow_right_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/right_wrist + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_palm + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + m_Weight: 1 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRX + m_Weight: 1 + - m_Path: root/SkinRoot/SkinRY + m_Weight: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_r.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_r.mask.meta new file mode 100644 index 0000000..5a0dcca --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_r.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b357b560d85dd4660a59d2c642820a26 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_y_r.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_y_r.mask new file mode 100644 index 0000000..6156e55 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_y_r.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_x_y_r + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_right + m_Weight: 0 + - m_Path: o_com_sparrow_right + m_Weight: 0 + - m_Path: o_com_sparrow_right_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/right_wrist + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_palm + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + m_Weight: 1 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRX + m_Weight: 1 + - m_Path: root/SkinRoot/SkinRY + m_Weight: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_y_r.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_y_r.mask.meta new file mode 100644 index 0000000..a3cc595 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_x_y_r.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 730b35d2a61a0402999fef7755ab7266 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_y_r.mask b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_y_r.mask new file mode 100644 index 0000000..6e8edf4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_y_r.mask @@ -0,0 +1,89 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!319 &31900000 +AvatarMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: mask_y_r + m_Mask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + m_Elements: + - m_Path: + m_Weight: 1 + - m_Path: base_right + m_Weight: 0 + - m_Path: o_com_sparrow_right + m_Weight: 0 + - m_Path: o_com_sparrow_right_power + m_Weight: 0 + - m_Path: root + m_Weight: 0 + - m_Path: root/right_wrist + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_palm + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + m_Weight: 0 + - m_Path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + m_Weight: 0 + - m_Path: root/right_wrist/right_thumb_metacarpal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + m_Weight: 1 + - m_Path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + m_Weight: 1 + - m_Path: root/SkinRoot + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRGrip + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRJoystick + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRMenu + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRPico + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRTrigger + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRX + m_Weight: 0 + - m_Path: root/SkinRoot/SkinRY + m_Weight: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_y_r.mask.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_y_r.mask.meta new file mode 100644 index 0000000..92e996b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mask_r/mask_y_r.mask.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 166b3d4f510e047ab9e97a27b546eca5 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 31900000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material.meta new file mode 100644 index 0000000..2ee61a3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 056de3362d95e1f40bf86fc4371d0f73 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_L.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_L.mat new file mode 100644 index 0000000..63c98f8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_L.mat @@ -0,0 +1,156 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Hand_L + m_Shader: {fileID: 4800000, guid: 4ae4d410c1995fa4e8fea1ab6359ea37, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _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} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AlphaClip: 0 + - _AlphaEnd: 0.56 + - _AlphaPower: 13 + - _AlphaSize: 0.1 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _ClickLightRange: 0.0315 + - _ClickRange: 0.0166 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _FadeIn: 1 + - _FresnelPower: 2.2 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _IndexRadius: 0.01 + - _LightIntens: 0 + - _LightRange: 1 + - _MainAlpha: 1 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _OutLineWidth: 0.00056 + - _Parallax: 0.005 + - _PressIntensity: 0 + - _PressLightRange: 0.0315 + - _PressRange: 0.0152 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _ThumbRadius: 0.01 + - _WorkflowMode: 1 + - _WristFadeRange: 0.4 + - _ZWrite: 1 + - _inClickMode: 0 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _ClickLight: {r: 1, g: 0.8117647, b: 0.3254902, a: 1} + - _ClickPosition: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _IndexPos: {r: 0, g: 0, b: 0, a: 0} + - _InnerColor: {r: 0.29411766, g: 0.3254902, b: 0.41568628, a: 0.6509804} + - _MainColor: {r: 1, g: 1, b: 1, a: 1} + - _OutColor: {r: 0.7695, g: 0.8176333, b: 0.95, a: 0.65882355} + - _OutLineColor: {r: 0.77875537, g: 0.8521459, b: 0.95, a: 0.5019608} + - _PressLight: {r: 1, g: 0.9843137, b: 0.95686275, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + - _SpotLightColor: {r: 1, g: 1, b: 1, a: 1} + - _ThumbPos: {r: 0, g: 0, b: 0, a: 0} + m_BuildTextureStacks: [] +--- !u!114 &1413629291158964113 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_L.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_L.mat.meta new file mode 100644 index 0000000..1bdaa00 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_L.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e5b6164e7d4f7e94fa1b1e7ac41fd5e9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_R.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_R.mat new file mode 100644 index 0000000..92bd2f9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_R.mat @@ -0,0 +1,156 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Hand_R + m_Shader: {fileID: 4800000, guid: 4ae4d410c1995fa4e8fea1ab6359ea37, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _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} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AlphaClip: 0 + - _AlphaEnd: 0.56 + - _AlphaPower: 13 + - _AlphaSize: 0.1 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _ClickLightRange: 0.0315 + - _ClickRange: 0.0166 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _FadeIn: 1 + - _FresnelPower: 2.2 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _IndexRadius: 0.01 + - _LightIntens: 0 + - _LightRange: 1 + - _MainAlpha: 1 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _OutLineWidth: 0.00056 + - _Parallax: 0.005 + - _PressIntensity: 1 + - _PressLightRange: 0.0315 + - _PressRange: 0.0152 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _ThumbRadius: 0.01 + - _WorkflowMode: 1 + - _WristFadeRange: 0.4 + - _ZWrite: 1 + - _inClickMode: 0 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _ClickLight: {r: 1, g: 0.8117647, b: 0.3254902, a: 1} + - _ClickPosition: {r: 0, g: 0, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _IndexPos: {r: 0, g: 0, b: 0, a: 0} + - _InnerColor: {r: 0.29411766, g: 0.3254902, b: 0.41568628, a: 0.6509804} + - _MainColor: {r: 1, g: 1, b: 1, a: 1} + - _OutColor: {r: 0.7695, g: 0.8176333, b: 0.95, a: 0.65882355} + - _OutLineColor: {r: 0.77875537, g: 0.8521459, b: 0.95, a: 0.5019608} + - _PressLight: {r: 1, g: 0.9843137, b: 0.95686275, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + - _SpotLightColor: {r: 1, g: 1, b: 1, a: 1} + - _ThumbPos: {r: 0, g: 0, b: 0, a: 0} + m_BuildTextureStacks: [] +--- !u!114 &1413629291158964113 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_R.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_R.mat.meta new file mode 100644 index 0000000..9f3dda8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Material/Hand_R.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 89939a917a9c35648a30ca15048f9e01 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh.meta new file mode 100644 index 0000000..603eba5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a308fac840f92c14ab254335fb950162 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand.meta new file mode 100644 index 0000000..ca5e7db --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 865c2da40ff796d47a25cfc111b85a0d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand.fbx new file mode 100644 index 0000000..cf25baf --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:066bd752139939f0029ae272597af8ba8d1b8621f8eb2873877e29fd98261e5f +size 1234944 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand.fbx.meta new file mode 100644 index 0000000..dd3b56c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand.fbx.meta @@ -0,0 +1,1526 @@ +fileFormatVersion: 2 +guid: 39b162b3758bf435f97c925ab0a320a3 +ModelImporter: + serializedVersion: 21300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 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: + - serializedVersion: 16 + name: idle + takeName: Take 001 + internalID: 1827226128182048838 + firstFrame: 0 + lastFrame: 3 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {fileID: 31900000, guid: bbb43fe65b38f4083bc5e644fe958f95, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: X_A_touch + takeName: Take 001 + internalID: -998496362607748373 + firstFrame: 5 + lastFrame: 9 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: fe8f7cd36e24d495c91d49ab5dcedc71, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: X_A_press + takeName: Take 001 + internalID: 3060872287085348379 + firstFrame: 10 + lastFrame: 14 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 1 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: f29a0ab70d309499c9c2d61a919d5020, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: trigger_press + takeName: Take 001 + internalID: 6641085478485924818 + firstFrame: 20 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 1 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 1 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 1 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 1 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 1 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 0 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 1 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: af135a35702834f20bb1e953c31f88ab, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: grjp_press + takeName: Take 001 + internalID: -5059006814000262888 + firstFrame: 30 + lastFrame: 34 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 1 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 1 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 1 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 1 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 1 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 0 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 1 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: 4a1294d789b914d428541b480a16682c, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: Y_B_touch + takeName: Take 001 + internalID: 6234510843852800090 + firstFrame: 35 + lastFrame: 39 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: fe8f7cd36e24d495c91d49ab5dcedc71, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: Y_B_press + takeName: Take 001 + internalID: -6788666626592393668 + firstFrame: 40 + lastFrame: 44 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 1 + maskType: 1 + maskSource: {fileID: 31900000, guid: 4a887bf25b2d04a1bae1669ae6747419, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: axis_touch + takeName: Take 001 + internalID: 1702301948168947093 + firstFrame: 65 + lastFrame: 69 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: fe8f7cd36e24d495c91d49ab5dcedc71, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: axis_vertial_up + takeName: Take 001 + internalID: 9093586079265926502 + firstFrame: 70 + lastFrame: 74 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 1 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: bbb43fe65b38f4083bc5e644fe958f95, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: axis_vertial_down + takeName: Take 001 + internalID: -4045831500588228705 + firstFrame: 75 + lastFrame: 79 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 1 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: bbb43fe65b38f4083bc5e644fe958f95, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: axis_horizontal_left + takeName: Take 001 + internalID: 7731641710072435382 + firstFrame: 80 + lastFrame: 84 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 1 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: bbb43fe65b38f4083bc5e644fe958f95, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: axis_horizontal_right + takeName: Take 001 + internalID: -6577145938085917429 + firstFrame: 85 + lastFrame: 89 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 1 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: bbb43fe65b38f4083bc5e644fe958f95, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: trigger_touch + takeName: Take 001 + internalID: -5912188926831197812 + firstFrame: 8 + lastFrame: 14 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 1 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 1 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 1 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 1 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 1 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 0 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: 1a1333616d23d473a9564f02435a3d0b, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: thumbstick_touch + takeName: Take 001 + internalID: -8608414141577764740 + firstFrame: 90 + lastFrame: 94 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: fe8f7cd36e24d495c91d49ab5dcedc71, type: 2} + additiveReferencePoseFrame: 0 + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + 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: 1 + 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: root + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 1 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand_X_A_Y_B.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand_X_A_Y_B.fbx new file mode 100644 index 0000000..cf25baf --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand_X_A_Y_B.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:066bd752139939f0029ae272597af8ba8d1b8621f8eb2873877e29fd98261e5f +size 1234944 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand_X_A_Y_B.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand_X_A_Y_B.fbx.meta new file mode 100644 index 0000000..e0281b1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/LeftHand/leftHand_X_A_Y_B.fbx.meta @@ -0,0 +1,323 @@ +fileFormatVersion: 2 +guid: 96071472ed1b841ddb13555bb3a2e3b3 +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 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: + - serializedVersion: 16 + name: X_A_Y_B_touch + takeName: Take 001 + internalID: 6641085478485924818 + firstFrame: 95 + lastFrame: 99 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 0 + - path: root/SkinRoot/SkinLY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: fe8f7cd36e24d495c91d49ab5dcedc71, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: X_A_Y_B_press + takeName: Take 001 + internalID: -998496362607748373 + firstFrame: 100 + lastFrame: 105 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_left + weight: 0 + - path: o_com_sparrow_left + weight: 0 + - path: o_com_sparrow_left_power + weight: 0 + - path: root + weight: 0 + - path: root/left_wrist + weight: 0 + - path: root/left_wrist/left_index_metacarpal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal + weight: 0 + - path: root/left_wrist/left_index_metacarpal/left_index_proximal/left_index_intermediate/left_index_distal/left_index_tip + weight: 0 + - path: root/left_wrist/left_little_metacarpal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal + weight: 0 + - path: root/left_wrist/left_little_metacarpal/left_little_proximal/left_little_intermediate/left_little_distal/left_little_tip + weight: 0 + - path: root/left_wrist/left_middle_metacarpal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal + weight: 0 + - path: root/left_wrist/left_middle_metacarpal/left_middle_proximal/left_middle_intermediate/left_middle_distal/left_middle_tip + weight: 0 + - path: root/left_wrist/left_palm + weight: 0 + - path: root/left_wrist/left_ring_metacarpal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal + weight: 0 + - path: root/left_wrist/left_ring_metacarpal/left_ring_proximal/left_ring_intermediate/left_ring_distal/left_ring_tip + weight: 0 + - path: root/left_wrist/left_thumb_metacarpal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal + weight: 1 + - path: root/left_wrist/left_thumb_metacarpal/left_thumb_proximal/left_thumb_distal/left_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinLGrip + weight: 0 + - path: root/SkinRoot/SkinLJoystick + weight: 0 + - path: root/SkinRoot/SkinLMenu + weight: 0 + - path: root/SkinRoot/SkinLPico + weight: 0 + - path: root/SkinRoot/SkinLTrigger + weight: 0 + - path: root/SkinRoot/SkinLX + weight: 1 + - path: root/SkinRoot/SkinLY + weight: 1 + maskType: 1 + maskSource: {fileID: 31900000, guid: 173621e98c19c493a8f0288d8a933bed, type: 2} + additiveReferencePoseFrame: 0 + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + 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: root + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 1 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand.meta new file mode 100644 index 0000000..af15bb8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8c1501896a3605b428668e13b98374da +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand.fbx new file mode 100644 index 0000000..f2a6511 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30b504127336300334d03a448c23ca3293ae4d6a216c3d2c4bb1da1a121d1980 +size 964768 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand.fbx.meta new file mode 100644 index 0000000..4230892 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand.fbx.meta @@ -0,0 +1,1526 @@ +fileFormatVersion: 2 +guid: dba11ee6c324e46f8bd36ffa00d5b6a2 +ModelImporter: + serializedVersion: 21300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 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: + - serializedVersion: 16 + name: idle + takeName: Take 001 + internalID: 9067093048684652814 + firstFrame: 0 + lastFrame: 3 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: X_A_touch + takeName: Take 001 + internalID: -3291206362154003629 + firstFrame: 5 + lastFrame: 9 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: a6cb34d0ab58a45b99e72f6e91ab2f6a, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: X_A_press + takeName: Take 001 + internalID: 1465369574596688972 + firstFrame: 10 + lastFrame: 14 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 1 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: b357b560d85dd4660a59d2c642820a26, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: trigger_press + takeName: Take 001 + internalID: 644589263403131068 + firstFrame: 20 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 1 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 1 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 1 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 1 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 1 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 0 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 1 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: 2f872c920e7224f889cde9b63d7311cc, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: grip_press + takeName: Take 001 + internalID: -7727135423134997463 + firstFrame: 30 + lastFrame: 34 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 1 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 1 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 1 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 1 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 1 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 0 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 1 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: 7a424ef8cd6e9456fa0284c70460ce38, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: Y_B_touch + takeName: Take 001 + internalID: 8069544894991528799 + firstFrame: 35 + lastFrame: 39 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: a6cb34d0ab58a45b99e72f6e91ab2f6a, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: Y_B_press + takeName: Take 001 + internalID: 2937323276152918717 + firstFrame: 40 + lastFrame: 44 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 1 + maskType: 1 + maskSource: {fileID: 31900000, guid: 166b3d4f510e047ab9e97a27b546eca5, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: axis_touch + takeName: Take 001 + internalID: 1053076475599293515 + firstFrame: 65 + lastFrame: 69 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: a6cb34d0ab58a45b99e72f6e91ab2f6a, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: axis_vertical_up + takeName: Take 001 + internalID: 4007025634288975674 + firstFrame: 70 + lastFrame: 74 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 1 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: 19109cae5d3dd4a21ab383ac58d3eb7d, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: axis_vertical_down + takeName: Take 001 + internalID: -4034711142557885395 + firstFrame: 75 + lastFrame: 79 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 1 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: 19109cae5d3dd4a21ab383ac58d3eb7d, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: axis_horizontal_right + takeName: Take 001 + internalID: 6625385973239635098 + firstFrame: 80 + lastFrame: 84 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 1 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: 19109cae5d3dd4a21ab383ac58d3eb7d, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: axis_horizontal_left + takeName: Take 001 + internalID: 9065212045443361151 + firstFrame: 85 + lastFrame: 89 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 1 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: 19109cae5d3dd4a21ab383ac58d3eb7d, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: trigger_touch + takeName: Take 001 + internalID: -3628734692961605625 + firstFrame: 8 + lastFrame: 14 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 1 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 1 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 1 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 1 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 1 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 0 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: b12bcf1b2bfdc440999b5f1bc7dde1a2, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: thumbstick_touch + takeName: Take 001 + internalID: -8608414141577764740 + firstFrame: 91 + lastFrame: 94 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 0 + - path: root/SkinRoot/SkinRY + weight: 0 + maskType: 1 + maskSource: {fileID: 31900000, guid: a6cb34d0ab58a45b99e72f6e91ab2f6a, type: 2} + additiveReferencePoseFrame: 0 + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + 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: 1 + 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: root + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 1 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand_X_A_Y_B.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand_X_A_Y_B.fbx new file mode 100644 index 0000000..f2a6511 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand_X_A_Y_B.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30b504127336300334d03a448c23ca3293ae4d6a216c3d2c4bb1da1a121d1980 +size 964768 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand_X_A_Y_B.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand_X_A_Y_B.fbx.meta new file mode 100644 index 0000000..b9e2661 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/Mesh/RightHand/rightHand_X_A_Y_B.fbx.meta @@ -0,0 +1,323 @@ +fileFormatVersion: 2 +guid: be856c9e1a47247068ebfc44ad402df6 +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 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: + - serializedVersion: 16 + name: X_A_Y_B_touch + takeName: Take 001 + internalID: 9067093048684652814 + firstFrame: 95 + lastFrame: 99 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 1 + - path: root/SkinRoot/SkinRY + weight: 1 + maskType: 1 + maskSource: {fileID: 31900000, guid: 730b35d2a61a0402999fef7755ab7266, type: 2} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: X_A_Y_B_press + takeName: Take 001 + internalID: -998496362607748373 + firstFrame: 100 + lastFrame: 105 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: + - path: + weight: 1 + - path: base_right + weight: 0 + - path: o_com_sparrow_right + weight: 0 + - path: o_com_sparrow_right_power + weight: 0 + - path: root + weight: 0 + - path: root/right_wrist + weight: 0 + - path: root/right_wrist/right_index_metacarpal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal + weight: 0 + - path: root/right_wrist/right_index_metacarpal/right_index_proximal/right_index_intermediate/right_index_distal/right_index_tip + weight: 0 + - path: root/right_wrist/right_little_metacarpal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal + weight: 0 + - path: root/right_wrist/right_little_metacarpal/right_little_proximal/right_little_intermediate/right_little_distal/right_little_tip + weight: 0 + - path: root/right_wrist/right_middle_metacarpal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal + weight: 0 + - path: root/right_wrist/right_middle_metacarpal/right_middle_proximal/right_middle_intermediate/right_middle_distal/right_middle_tip + weight: 0 + - path: root/right_wrist/right_palm + weight: 0 + - path: root/right_wrist/right_ring_metacarpal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal + weight: 0 + - path: root/right_wrist/right_ring_metacarpal/right_ring_proximal/right_ring_intermediate/right_ring_distal/right_ring_tip + weight: 0 + - path: root/right_wrist/right_thumb_metacarpal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal + weight: 1 + - path: root/right_wrist/right_thumb_metacarpal/right_thumb_proximal/right_thumb_distal/right_thumb_tip + weight: 1 + - path: root/SkinRoot + weight: 0 + - path: root/SkinRoot/SkinRGrip + weight: 0 + - path: root/SkinRoot/SkinRJoystick + weight: 0 + - path: root/SkinRoot/SkinRMenu + weight: 0 + - path: root/SkinRoot/SkinRPico + weight: 0 + - path: root/SkinRoot/SkinRTrigger + weight: 0 + - path: root/SkinRoot/SkinRX + weight: 1 + - path: root/SkinRoot/SkinRY + weight: 1 + maskType: 1 + maskSource: {fileID: 31900000, guid: 730b35d2a61a0402999fef7755ab7266, type: 2} + additiveReferencePoseFrame: 0 + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + 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: root + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 1 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_l.overrideController b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_l.overrideController new file mode 100644 index 0000000..4b2fbdd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_l.overrideController @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!221 &22100000 +AnimatorOverrideController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: controller_l + m_Controller: {fileID: 9100000, guid: 7eff928b71cfd46f298284c8e67429ed, type: 2} + m_Clips: + - m_OriginalClip: {fileID: 9065212045443361151, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: 7731641710072435382, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: 6625385973239635098, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: -6577145938085917429, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: 1053076475599293515, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: 1702301948168947093, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: -4034711142557885395, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: -4045831500588228705, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: 4007025634288975674, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: 9093586079265926502, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: -7727135423134997463, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: -5059006814000262888, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: 9067093048684652814, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: 1827226128182048838, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: -8608414141577764740, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: -8608414141577764740, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: 644589263403131068, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: 6641085478485924818, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: -3628734692961605625, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: -5912188926831197812, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: 1465369574596688972, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: 3060872287085348379, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: -3291206362154003629, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: -998496362607748373, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: -998496362607748373, guid: be856c9e1a47247068ebfc44ad402df6, type: 3} + m_OverrideClip: {fileID: -998496362607748373, guid: 96071472ed1b841ddb13555bb3a2e3b3, type: 3} + - m_OriginalClip: {fileID: 9067093048684652814, guid: be856c9e1a47247068ebfc44ad402df6, type: 3} + m_OverrideClip: {fileID: 6641085478485924818, guid: 96071472ed1b841ddb13555bb3a2e3b3, type: 3} + - m_OriginalClip: {fileID: 2937323276152918717, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: -6788666626592393668, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} + - m_OriginalClip: {fileID: 8069544894991528799, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_OverrideClip: {fileID: 6234510843852800090, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_l.overrideController.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_l.overrideController.meta new file mode 100644 index 0000000..5155f21 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_l.overrideController.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9a993e003cd304ee9b10e2c8a65fbdb1 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 22100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_r.controller b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_r.controller new file mode 100644 index 0000000..464ec34 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_r.controller @@ -0,0 +1,799 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-7101555362032542151 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: grip + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -7727135423134997463, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &-5264670380286320971 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: X_A_Y_B_touch + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -3768238520865437085} + m_Position: {x: 310, y: 220, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -3768238520865437085} +--- !u!1102 &-4567637703452413114 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: trigger_touch + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3628734692961605625, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &-4042532970288595488 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: thumbstick_touch + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 6003891639258260656} + m_Position: {x: 330, y: 160, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 6003891639258260656} +--- !u!1102 &-3768238520865437085 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Y_B_touch + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 9067093048684652814, guid: be856c9e1a47247068ebfc44ad402df6, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-2416898166414759475 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: thumbXTouch + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3291206362154003629, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &-2313129190453320430 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Y_B_touch + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 4233361181473184775} + m_Position: {x: 328.40527, y: 174.54456, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 4233361181473184775} +--- !u!1107 &-1242863904759397218 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: trigger_press + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 6773728840484310869} + m_Position: {x: 520, y: 220, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 6773728840484310869} +--- !u!206 &-1009412455799080891 +BlendTree: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Blend Tree + m_Childs: + - serializedVersion: 2 + m_Motion: {fileID: 1053076475599293515, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Threshold: 0 + m_Position: {x: 0, y: 0} + m_TimeScale: 0.3 + m_CycleOffset: 0 + m_DirectBlendParameter: axisUp + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 4007025634288975674, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Threshold: 0.25 + m_Position: {x: 0, y: 1} + m_TimeScale: 0.3 + m_CycleOffset: 0 + m_DirectBlendParameter: axisUp + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: -4034711142557885395, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Threshold: 0.5 + m_Position: {x: 0, y: -1} + m_TimeScale: 0.3 + m_CycleOffset: 0 + m_DirectBlendParameter: axisDown + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 6625385973239635098, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Threshold: 0.75 + m_Position: {x: 1, y: 0} + m_TimeScale: 0.3 + m_CycleOffset: 0 + m_DirectBlendParameter: axisRigh + m_Mirror: 0 + - serializedVersion: 2 + m_Motion: {fileID: 9065212045443361151, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Threshold: 1 + m_Position: {x: -1, y: 0} + m_TimeScale: 0.3 + m_CycleOffset: 0 + m_DirectBlendParameter: axisLeft + m_Mirror: 0 + m_BlendParameter: axis_horizontal + m_BlendParameterY: axis_vertical + m_MinThreshold: 0 + m_MaxThreshold: 1 + m_UseAutomaticThresholds: 1 + m_NormalizedBlendValues: 0 + m_BlendType: 2 +--- !u!1102 &-219832957408517205 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: thumbY + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 2937323276152918717, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: controller_r + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: axis_vertical + m_Type: 1 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: axis_horizontal + m_Type: 1 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: idle + m_StateMachine: {fileID: 4517447404130276652} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 1 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: trigger_touch + m_StateMachine: {fileID: 1957189739035770365} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: trigger_press + m_StateMachine: {fileID: -1242863904759397218} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: grip_press + m_StateMachine: {fileID: 4115632580455608622} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: thumbstick_touch + m_StateMachine: {fileID: -4042532970288595488} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: axis_touch + m_StateMachine: {fileID: 2929857927626961192} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: X_A_touch + m_StateMachine: {fileID: 7024025097188696438} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Y_B_touch + m_StateMachine: {fileID: -2313129190453320430} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: X_A_Y_B_touch + m_StateMachine: {fileID: -5264670380286320971} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: X_A_press + m_StateMachine: {fileID: 8293626763525540544} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Y_B_press + m_StateMachine: {fileID: 3899624571922000302} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: X_A_Y_B_press + m_StateMachine: {fileID: 4041127951310560090} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1102 &1384623190067455544 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: thumbX + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 1465369574596688972, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &1957189739035770365 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: trigger_touch + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -4567637703452413114} + m_Position: {x: 440, y: 80, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -4567637703452413114} +--- !u!1107 &2929857927626961192 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: axis_touch + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 7307173898641926813} + m_Position: {x: 360, y: 130, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 7307173898641926813} +--- !u!1102 &3899581534921788144 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: allIdle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 9067093048684652814, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &3899624571922000302 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Y_B_press + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -219832957408517205} + m_Position: {x: 380, y: 200, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -219832957408517205} +--- !u!1107 &4041127951310560090 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: X_A_Y_B_press + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 4284270414835866810} + m_Position: {x: 296.16403, y: 180.89337, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 4284270414835866810} +--- !u!1107 &4115632580455608622 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: grip_press + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -7101555362032542151} + m_Position: {x: 390, y: 210, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -7101555362032542151} +--- !u!1102 &4233361181473184775 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: thumbYTouch + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 8069544894991528799, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &4284270414835866810 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: X_A_Y_B_press + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -998496362607748373, guid: be856c9e1a47247068ebfc44ad402df6, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &4517447404130276652 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: idle + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 3899581534921788144} + m_Position: {x: 380, y: 160, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 3899581534921788144} +--- !u!1102 &6003891639258260656 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: thumbstick_touch + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -8608414141577764740, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &6773728840484310869 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: trigger + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 644589263403131068, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &7024025097188696438 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: X_A_touch + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -2416898166414759475} + m_Position: {x: 360, y: 170, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -2416898166414759475} +--- !u!1102 &7307173898641926813 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Blend Tree + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -1009412455799080891} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &8293626763525540544 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: X_A_press + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 1384623190067455544} + m_Position: {x: 410, y: 180, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 1384623190067455544} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_r.controller.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_r.controller.meta new file mode 100644 index 0000000..ebea28e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/controller_r.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7eff928b71cfd46f298284c8e67429ed +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/leftHand.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/leftHand.prefab new file mode 100644 index 0000000..6d7e9d3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/leftHand.prefab @@ -0,0 +1,130 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &3045104879649255626 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8721002785652668686, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: e5b6164e7d4f7e94fa1b1e7ac41fd5e9, type: 2} + - target: {fileID: -8679921383154817045, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -5693625846569519967, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: ad8827df856b77c48911d03893186baa, type: 2} + - target: {fileID: -3692213176466563813, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: a1b3dee6f3915d041b67ebcd32db75de, type: 2} + - target: {fileID: 919132149155446097, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_Name + value: leftHand + objectReference: {fileID: 0} + - target: {fileID: 5866666021909216657, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + propertyPath: m_Controller + value: + objectReference: {fileID: 22100000, guid: 9a993e003cd304ee9b10e2c8a65fbdb1, + type: 2} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 39b162b3758bf435f97c925ab0a320a3, type: 3} +--- !u!1 &2775073962953035163 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + m_PrefabInstance: {fileID: 3045104879649255626} + m_PrefabAsset: {fileID: 0} +--- !u!114 &3072678336823176712 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2775073962953035163} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 510be29229b88df4f9dd7b7a4a59ee39, type: 3} + m_Name: + m_EditorClassIdentifier: + controller: 0 +--- !u!1 &7092911202625823648 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 5200944990257927018, guid: 39b162b3758bf435f97c925ab0a320a3, + type: 3} + m_PrefabInstance: {fileID: 3045104879649255626} + m_PrefabAsset: {fileID: 0} +--- !u!114 &3666775096546563306 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7092911202625823648} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7cfc8380945cdad43ae2cacaadf47013, type: 3} + m_Name: + m_EditorClassIdentifier: + power1: {fileID: 2800000, guid: 64029f435f4d71f4999ea9c75b80c91a, type: 3} + power2: {fileID: 2800000, guid: d7540181fc229e8448f8276f14347b1b, type: 3} + power3: {fileID: 2800000, guid: c874b39fd1d35274cb34a60847385eb5, type: 3} + power4: {fileID: 2800000, guid: c097f47a26972414d93241c55296c220, type: 3} + power5: {fileID: 2800000, guid: a0967be76a24d48428a3f5bff9c73fed, type: 3} + hand: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/leftHand.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/leftHand.prefab.meta new file mode 100644 index 0000000..69d64d6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/leftHand.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: add26d782c2f14487a27bc09c2d6f4a6 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/rightHand.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/rightHand.prefab new file mode 100644 index 0000000..1553250 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/rightHand.prefab @@ -0,0 +1,129 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1001 &7373002392040224902 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -1185065108108141888, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 89939a917a9c35648a30ca15048f9e01, type: 2} + - target: {fileID: 919132149155446097, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_Name + value: rightHand + objectReference: {fileID: 0} + - target: {fileID: 5866666021909216657, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_Controller + value: + objectReference: {fileID: 9100000, guid: 7eff928b71cfd46f298284c8e67429ed, type: 2} + - target: {fileID: 6972209725336936091, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: ad8827df856b77c48911d03893186baa, type: 2} + - target: {fileID: 7244500070870471560, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: a1b3dee6f3915d041b67ebcd32db75de, type: 2} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, type: 3} +--- !u!1 &7246052014470150246 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: -9017033875622821664, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + m_PrefabInstance: {fileID: 7373002392040224902} + m_PrefabAsset: {fileID: 0} +--- !u!114 &9037552036973013468 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7246052014470150246} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7cfc8380945cdad43ae2cacaadf47013, type: 3} + m_Name: + m_EditorClassIdentifier: + power1: {fileID: 2800000, guid: 64029f435f4d71f4999ea9c75b80c91a, type: 3} + power2: {fileID: 2800000, guid: d7540181fc229e8448f8276f14347b1b, type: 3} + power3: {fileID: 2800000, guid: c874b39fd1d35274cb34a60847385eb5, type: 3} + power4: {fileID: 2800000, guid: c097f47a26972414d93241c55296c220, type: 3} + power5: {fileID: 2800000, guid: a0967be76a24d48428a3f5bff9c73fed, type: 3} + hand: 1 +--- !u!1 &7679555789696304599 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: dba11ee6c324e46f8bd36ffa00d5b6a2, + type: 3} + m_PrefabInstance: {fileID: 7373002392040224902} + m_PrefabAsset: {fileID: 0} +--- !u!114 &4674844603613058633 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7679555789696304599} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 510be29229b88df4f9dd7b7a4a59ee39, type: 3} + m_Name: + m_EditorClassIdentifier: + controller: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/rightHand.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/rightHand.prefab.meta new file mode 100644 index 0000000..d2da72b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/ControllerWithHand/rightHand.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1fc5f47805e00457ca97da2351c04180 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.meta new file mode 100644 index 0000000..904d4ae --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5926953c3ce96b54abb1beeeeb603374 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.prefab new file mode 100644 index 0000000..fcb4730 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.prefab @@ -0,0 +1,274 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3592357975929350142 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3592357975929350017} + - component: {fileID: 1534429355808917736} + m_Layer: 0 + m_Name: G3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3592357975929350017 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3592357975929350142} + 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: 7393112420434179706} + - {fileID: 3853582020136445660} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1534429355808917736 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3592357975929350142} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e4ee62d8e7a57c8458f969922f7a06a2, type: 3} + m_Name: + m_EditorClassIdentifier: + triggerTran: {fileID: 6165355476879913558} + menuTran: {fileID: 826874955553734840} + touchPadTran: {fileID: 3786392915043907200} + controllerPower: {fileID: 1295782513} +--- !u!1001 &3670456869294293303 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 3592357975929350017} + m_Modifications: + - target: {fileID: -8743162529194615082, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_Name + value: Home + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7371581722876817658, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_Name + value: Touch + objectReference: {fileID: 0} + - target: {fileID: -5342078123755387799, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 618e026a94e14184ca67698c5e8fa58a, type: 2} + - target: {fileID: -2586074106950604098, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_Name + value: Menu + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_Name + value: G3 + objectReference: {fileID: 0} + - target: {fileID: 4146042257782292879, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalPosition.y + value: 0.01594 + objectReference: {fileID: 0} + - target: {fileID: 4146042257782292879, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalPosition.z + value: 0.00019 + objectReference: {fileID: 0} + - target: {fileID: 6344076142717186503, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_Name + value: Trigger + objectReference: {fileID: 0} + - target: {fileID: 7457867762417955681, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7457867762417955681, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalRotation.x + value: 0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 7457867762417955681, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7457867762417955681, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalRotation.z + value: 0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 7457867762417955681, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 90 + objectReference: {fileID: 0} + - target: {fileID: 7457867762417955681, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 180 + objectReference: {fileID: 0} + - target: {fileID: 8779315993546084768, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + propertyPath: m_Name + value: G3 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} +--- !u!4 &826874955553734840 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 4146042257782292879, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + m_PrefabInstance: {fileID: 3670456869294293303} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3786392915043907200 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 467227952477812663, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + m_PrefabInstance: {fileID: 3670456869294293303} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3853582020136445660 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + m_PrefabInstance: {fileID: 3670456869294293303} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6165355476879913558 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7457867762417955681, guid: d77ad19165d84b844ac6b715a2ef6998, type: 3} + m_PrefabInstance: {fileID: 3670456869294293303} + m_PrefabAsset: {fileID: 0} +--- !u!1001 &6994976350540698001 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 3592357975929350017} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_LocalPosition.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 0e8851bbd4d7b2b4787a54d6d1f11f80, type: 2} + - target: {fileID: 919132149155446097, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + propertyPath: m_Name + value: Power + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} +--- !u!4 &7393112420434179706 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + m_PrefabInstance: {fileID: 6994976350540698001} + m_PrefabAsset: {fileID: 0} +--- !u!1 &7913471332706266304 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: c8f6a9fe365b9dd40a3886228ff5b74c, type: 3} + m_PrefabInstance: {fileID: 6994976350540698001} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1295782513 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7913471332706266304} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7cfc8380945cdad43ae2cacaadf47013, type: 3} + m_Name: + m_EditorClassIdentifier: + power1: {fileID: 2800000, guid: 559b0277d5f635545a7b034007f4f42c, type: 3} + power2: {fileID: 2800000, guid: 41938f04a6f4d884f82644a294f64a74, type: 3} + power3: {fileID: 2800000, guid: fa81cec4ef495964295e19ee18428ddf, type: 3} + power4: {fileID: 2800000, guid: 8d99b31c7444c73479bb9169420ddad9, type: 3} + power5: {fileID: 2800000, guid: 7dfa52c3c61f61542881145b740c7635, type: 3} + controllerL: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.prefab.meta new file mode 100644 index 0000000..a1e86b3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4632f3d33fc5ea94e8a7673306cbb3e2 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials.meta new file mode 100644 index 0000000..f72f89b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 658334ab213323343b6c43f7ca340548 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3.mat new file mode 100644 index 0000000..acb3fe1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3.mat @@ -0,0 +1,79 @@ +%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: G3 + m_Shader: {fileID: 4800000, guid: 60580f3955898e04bb2f7401cd521e89, type: 3} + m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _METALLICGLOSSMAP _NORMALMAP _PARALLAXMAP + _SPECULARHIGHLIGHTS_OFF + 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: 7216779f532dc2042bf61c3bc6dcf89b, 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: 46eff69f4f8c8e64ca295ba7356521f1, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 58049bb103947be4cb30fcec054206bc, 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: 2800000, guid: 5f5ec102e78a6a14e850fe5af6a2063b, type: 3} + 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.5 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3.mat.meta new file mode 100644 index 0000000..7f0549a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 618e026a94e14184ca67698c5e8fa58a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3_Power.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3_Power.mat new file mode 100644 index 0000000..36f206f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3_Power.mat @@ -0,0 +1,80 @@ +%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: G3_Power + m_Shader: {fileID: 10750, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _METALLICGLOSSMAP _NORMALMAP _PARALLAXMAP + _SPECULARHIGHLIGHTS_OFF + 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: 7216779f532dc2042bf61c3bc6dcf89b, 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: 7dfa52c3c61f61542881145b740c7635, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 58049bb103947be4cb30fcec054206bc, 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: 2800000, guid: 5f5ec102e78a6a14e850fe5af6a2063b, type: 3} + 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.5 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _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: 0.14388269, g: 0.9150943, b: 0.66478205, a: 1} + m_BuildTextureStacks: [] diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3_Power.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3_Power.mat.meta new file mode 100644 index 0000000..4e28f34 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/G3_Power.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0e8851bbd4d7b2b4787a54d6d1f11f80 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/TouchSphere.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/TouchSphere.mat new file mode 100644 index 0000000..02bec60 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/TouchSphere.mat @@ -0,0 +1,80 @@ +%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: TouchSphere + m_Shader: {fileID: 4800000, guid: 60580f3955898e04bb2f7401cd521e89, type: 3} + m_ShaderKeywords: _GLOSSYREFLECTIONS_OFF _METALLICGLOSSMAP _NORMALMAP _PARALLAXMAP + _SPECULARHIGHLIGHTS_OFF + 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: 7216779f532dc2042bf61c3bc6dcf89b, 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: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 2800000, guid: 58049bb103947be4cb30fcec054206bc, 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: 2800000, guid: 5f5ec102e78a6a14e850fe5af6a2063b, type: 3} + 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.5 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 0 + - _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: 0.14388269, g: 0.9150943, b: 0.66478205, a: 1} + m_BuildTextureStacks: [] diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/TouchSphere.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/TouchSphere.mat.meta new file mode 100644 index 0000000..944d7da --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Materials/TouchSphere.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4bfadd3e60167a44fa27c370bfe2ae26 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes.meta new file mode 100644 index 0000000..40a20a2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ffefa80e9b147a444923a7a4d6059a8a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/G3.FBX b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/G3.FBX new file mode 100644 index 0000000..dd028bc --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/G3.FBX @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79452bc872755d419862d59539b4204a82bd44983fd2eab7377ece77966e0e7e +size 189040 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/G3.FBX.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/G3.FBX.meta new file mode 100644 index 0000000..a35b929 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/G3.FBX.meta @@ -0,0 +1,105 @@ +fileFormatVersion: 2 +guid: d77ad19165d84b844ac6b715a2ef6998 +ModelImporter: + serializedVersion: 20200 + internalIDToNameTable: + - first: + 74: 1827226128182048838 + second: Take 001 + externalObjects: {} + materials: + materialImportMode: 0 + 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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/dianliang.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/dianliang.fbx new file mode 100644 index 0000000..a91390f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/dianliang.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:276d805c8d6425f4d39419f9113e0c9485a313ec07aae46c0c929226438c109e +size 26912 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/dianliang.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/dianliang.fbx.meta new file mode 100644 index 0000000..40569ed --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Meshes/dianliang.fbx.meta @@ -0,0 +1,102 @@ +fileFormatVersion: 2 +guid: c8f6a9fe365b9dd40a3886228ff5b74c +ModelImporter: + serializedVersion: 20200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 0 + 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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders.meta new file mode 100644 index 0000000..4fc8653 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d0fe67ffe669552498e1201efc3132bd +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders/PXR_G3.shader b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders/PXR_G3.shader new file mode 100644 index 0000000..5076164 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders/PXR_G3.shader @@ -0,0 +1,111 @@ +Shader "PXR/G3" +{ + Properties + { + [NoScaleOffset]_MainTex ("Texture", 2D) = "white" {} + _Tint("Tint",Color) = (1,1,1,1) + } + + SubShader + { + Tags + { + "RenderType"="Opaque" + "Queue"="Geometry" + "IgnoreProjector"="True" + "RenderPipeline" = "UniversalPipeline" + } + LOD 100 + ZWrite On + ZTest On + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + uniform sampler2D _MainTex; + uniform float4 _MainTex_ST; + uniform half4 _Tint; + + v2f vert(appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + fixed4 col = tex2D(_MainTex, i.uv) * _Tint; + return col; + } + ENDCG + } + } + SubShader + { + Tags + { + "RenderType"="Opaque" + "Queue"="Geometry" + "IgnoreProjector"="True" + } + LOD 100 + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + uniform sampler2D _MainTex; + uniform float4 _MainTex_ST; + uniform half4 _Tint; + + v2f vert(appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + fixed4 col = tex2D(_MainTex, i.uv) * _Tint; + + return col; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders/PXR_G3.shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders/PXR_G3.shader.meta new file mode 100644 index 0000000..95d2d69 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Shaders/PXR_G3.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 60580f3955898e04bb2f7401cd521e89 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures.meta new file mode 100644 index 0000000..60c2f47 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2d94e0932c37e8049bf7abab81d4fb4a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/G3.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/G3.png new file mode 100644 index 0000000..858af22 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/G3.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df18e0377df880c49d779be67b50d47ec714f174b594015b15eae29c16c8507d +size 106484 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/G3.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/G3.png.meta new file mode 100644 index 0000000..e4fdde2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/G3.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 46eff69f4f8c8e64ca295ba7356521f1 +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: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power.meta new file mode 100644 index 0000000..3e81375 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d89c307ebaf152d409ccd2a6bde97451 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_01.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_01.png new file mode 100644 index 0000000..a54fd59 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_01.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4203383bff8603641ae357c6d5b9198465f782e48ab397ef84a3e4877cc90779 +size 2237 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_01.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_01.png.meta new file mode 100644 index 0000000..815e7f9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_01.png.meta @@ -0,0 +1,121 @@ +fileFormatVersion: 2 +guid: 7dfa52c3c61f61542881145b740c7635 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 1 + 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_02.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_02.png new file mode 100644 index 0000000..cb448da --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_02.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41db5ab39c839ef8788c949815e92b48a90d4e4b81a86eb0c88c523d0ae4a682 +size 2202 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_02.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_02.png.meta new file mode 100644 index 0000000..eb68e07 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_02.png.meta @@ -0,0 +1,121 @@ +fileFormatVersion: 2 +guid: 8d99b31c7444c73479bb9169420ddad9 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 1 + 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_03.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_03.png new file mode 100644 index 0000000..2ccd1fa --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_03.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e60186a2103c37f6da751e7dc51e82e7b66820c3a65406487e8ae5fb09e6ee5b +size 2202 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_03.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_03.png.meta new file mode 100644 index 0000000..3390cd2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_03.png.meta @@ -0,0 +1,121 @@ +fileFormatVersion: 2 +guid: fa81cec4ef495964295e19ee18428ddf +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 1 + 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_04.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_04.png new file mode 100644 index 0000000..ae1afc4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_04.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c9f04324fbe80c6d7b23fca369c88cebc444822297433c2cc4384d42df82796 +size 2191 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_04.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_04.png.meta new file mode 100644 index 0000000..693db01 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_04.png.meta @@ -0,0 +1,121 @@ +fileFormatVersion: 2 +guid: 41938f04a6f4d884f82644a294f64a74 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 1 + 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_05.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_05.png new file mode 100644 index 0000000..1b500ef --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_05.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e4765b125aa9858bedc21b68ffef587661ab35710a5906a2cec775d4bc4a278 +size 2222 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_05.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_05.png.meta new file mode 100644 index 0000000..89374a3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/G3/Textures/Power/dianliang_05.png.meta @@ -0,0 +1,121 @@ +fileFormatVersion: 2 +guid: 559b0277d5f635545a7b034007f4f42c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 1 + 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 L.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 L.prefab new file mode 100644 index 0000000..2173a70 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 L.prefab @@ -0,0 +1,220 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &7118676274473289238 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7602444466196782252} + m_Layer: 0 + m_Name: Neo 3 L + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7602444466196782252 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7118676274473289238} + serializedVersion: 2 + 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: 3664634973460246780} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &3842097607210915607 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 7602444466196782252} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_LocalPosition.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -5608155238930693728, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 850f34a4baa4b4545af156ceeb07a90d, type: 2} + - target: {fileID: -4365425836530490892, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 89969b2a6b51f5e4a90da8a71cec1861, type: 2} + - target: {fileID: 919132149155446097, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + propertyPath: m_Name + value: Neo3_Controller_Left + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + insertIndex: -1 + addedObject: {fileID: 5005911789627569033} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + insertIndex: -1 + addedObject: {fileID: 4528417179619170961} + - targetCorrespondingSourceObject: {fileID: 8245864472737768373, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + insertIndex: -1 + addedObject: {fileID: 2615662343440698278} + m_SourcePrefab: {fileID: 100100000, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} +--- !u!4 &3572223861192634285 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 343058374925023418, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + m_PrefabInstance: {fileID: 3842097607210915607} + m_PrefabAsset: {fileID: 0} +--- !u!4 &3664634973460246780 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + m_PrefabInstance: {fileID: 3842097607210915607} + m_PrefabAsset: {fileID: 0} +--- !u!1 &4148016172058700358 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + m_PrefabInstance: {fileID: 3842097607210915607} + m_PrefabAsset: {fileID: 0} +--- !u!95 &5005911789627569033 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4148016172058700358} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: ad20dacf4b9790246baf957cfb1caf6b, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &4528417179619170961 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4148016172058700358} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0551a3e12ecf0614fa83e84a93d87bb5, type: 3} + m_Name: + m_EditorClassIdentifier: + primary2DAxisTran: {fileID: 7146597371438031146} + gripTran: {fileID: 3572223861192634285} + triggerTran: {fileID: 6103518825919152096} + controllerL: 1 +--- !u!1 &5133801649565021346 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8245864472737768373, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + m_PrefabInstance: {fileID: 3842097607210915607} + m_PrefabAsset: {fileID: 0} +--- !u!114 &2615662343440698278 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5133801649565021346} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7cfc8380945cdad43ae2cacaadf47013, type: 3} + m_Name: + m_EditorClassIdentifier: + power1: {fileID: 2800000, guid: 12a19b71643cd314291e0f6c3e9a2ac9, type: 3} + power2: {fileID: 2800000, guid: 00b918d38c21608499365dcf824b50ac, type: 3} + power3: {fileID: 2800000, guid: 77c7eb2aadfa27c40bbae105b90de610, type: 3} + power4: {fileID: 2800000, guid: 2feddea28647636409e9100780016736, type: 3} + power5: {fileID: 2800000, guid: bd452ee420c4d4945abec2c258c1f3b0, type: 3} + controllerL: 1 +--- !u!4 &6103518825919152096 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7054274610534983927, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + m_PrefabInstance: {fileID: 3842097607210915607} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7146597371438031146 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6231872593874564669, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, + type: 3} + m_PrefabInstance: {fileID: 3842097607210915607} + m_PrefabAsset: {fileID: 0} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 L.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 L.prefab.meta new file mode 100644 index 0000000..a918aac --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 L.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4ff92632f801a7444958bb72ef6aee53 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 R.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 R.prefab new file mode 100644 index 0000000..30000e8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 R.prefab @@ -0,0 +1,201 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8449525692238721171 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9081911576199211561} + m_Layer: 0 + m_Name: Neo 3 R + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9081911576199211561 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8449525692238721171} + 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: 5822148990318121413} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &6288947943713207854 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 9081911576199211561} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_LocalPosition.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -4365425836530490892, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 8bc837c9cb3f760448bfd88ed47169ff, type: 2} + - target: {fileID: -4032244408182837490, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: faf88df9fae0748438ea9807963c3787, type: 2} + - target: {fileID: 919132149155446097, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + propertyPath: m_Name + value: Neo3_Controller_Right + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} +--- !u!1 &6595448005392845695 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + m_PrefabInstance: {fileID: 6288947943713207854} + m_PrefabAsset: {fileID: 0} +--- !u!4 &5822148990318121413 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + m_PrefabInstance: {fileID: 6288947943713207854} + m_PrefabAsset: {fileID: 0} +--- !u!1 &2677925273273275803 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8245864472737768373, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + m_PrefabInstance: {fileID: 6288947943713207854} + m_PrefabAsset: {fileID: 0} +--- !u!4 &2840689723880156062 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -1140821836707635792, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + m_PrefabInstance: {fileID: 6288947943713207854} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1351744298325674262 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5009278849061388088, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + m_PrefabInstance: {fileID: 6288947943713207854} + m_PrefabAsset: {fileID: 0} +--- !u!4 &4533033954023121504 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -1608270464383724466, guid: 98595991fd68c5e419d1d37fed8658ff, + type: 3} + m_PrefabInstance: {fileID: 6288947943713207854} + m_PrefabAsset: {fileID: 0} +--- !u!114 &2394182678425697692 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2677925273273275803} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7cfc8380945cdad43ae2cacaadf47013, type: 3} + m_Name: + m_EditorClassIdentifier: + power1: {fileID: 2800000, guid: 12a19b71643cd314291e0f6c3e9a2ac9, type: 3} + power2: {fileID: 2800000, guid: 00b918d38c21608499365dcf824b50ac, type: 3} + power3: {fileID: 2800000, guid: 77c7eb2aadfa27c40bbae105b90de610, type: 3} + power4: {fileID: 2800000, guid: 2feddea28647636409e9100780016736, type: 3} + power5: {fileID: 2800000, guid: bd452ee420c4d4945abec2c258c1f3b0, type: 3} + hand: 1 +--- !u!95 &9202479174731645555 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6595448005392845695} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: cfd242c98ab12cc40b8b74aedee1ba0c, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!114 &6465803819032203205 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6595448005392845695} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0551a3e12ecf0614fa83e84a93d87bb5, type: 3} + m_Name: + m_EditorClassIdentifier: + primary2DAxisTran: {fileID: 1351744298325674262} + gripTran: {fileID: 2840689723880156062} + triggerTran: {fileID: 4533033954023121504} + controller: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 R.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 R.prefab.meta new file mode 100644 index 0000000..4193eff --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo 3 R.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d22bd72bebc3950409d2de288cdcabd2 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3.meta new file mode 100644 index 0000000..a55eea9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c98e2bb991bbb54284c8085323c4904 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators.meta new file mode 100644 index 0000000..07fe938 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 734905aa77a4579459ba901553081a82 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Left.controller b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Left.controller new file mode 100644 index 0000000..2730aa9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Left.controller @@ -0,0 +1,808 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-9191426595414499654 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PrimaryUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -6927826148070536318} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 8118803008505274171, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-6927826148070536318 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 7792254372272168406} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-6816635007179886073 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -693724927639952508} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-6814073410482776126 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsMenuDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -2734212588652438439} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-6290513898463596878 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PicoUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -6816635007179886073} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 4758964296961227170, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-5612465918457798565 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -2567483912494208015} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-4900741514691368024 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsPrimaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -3146770524075603833} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &-4482213543690290020 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Secondary + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -5612465918457798565} + m_Position: {x: 251.85501, y: 126.734314, z: 0} + - serializedVersion: 1 + m_State: {fileID: 8832678459180422744} + m_Position: {x: 600, y: 140, z: 0} + - serializedVersion: 1 + m_State: {fileID: 1202892387143743188} + m_Position: {x: 600, y: 260, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 940, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -5612465918457798565} +--- !u!1101 &-4398415816402801420 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 4473067805030766429} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &-4009141972638398933 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Pico + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -693724927639952508} + m_Position: {x: 260, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: -1220407785047893222} + m_Position: {x: 620, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: -6290513898463596878} + m_Position: {x: 620, y: 250, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 890, y: 130, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -693724927639952508} +--- !u!1102 &-3146770524075603833 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PrimaryDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 1322590568204847764} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 2244685009488511520, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &-2829783097282865317 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Menu + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 4473067805030766429} + m_Position: {x: 270, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: -2734212588652438439} + m_Position: {x: 630, y: 130, z: 0} + - serializedVersion: 1 + m_State: {fileID: 2617223191236027407} + m_Position: {x: 630, y: 240, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 890, y: 80, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 4473067805030766429} +--- !u!1102 &-2734212588652438439 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MenuDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 8727316902194714031} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -6138657454295028014, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-2567483912494208015 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsSecondaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 8832678459180422744} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-1854017476551497913 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsSecondaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 1202892387143743188} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-1220407785047893222 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PicoDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 6068134341188172826} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -5170297881424512605, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-758330942240963927 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsPicoDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -1220407785047893222} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &-706155607306262420 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Primary + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 7792254372272168406} + m_Position: {x: 299.33624, y: 137.02191, z: 0} + - serializedVersion: 1 + m_State: {fileID: -3146770524075603833} + m_Position: {x: 640, y: 140, z: 0} + - serializedVersion: 1 + m_State: {fileID: -9191426595414499654} + m_Position: {x: 640, y: 250, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 970, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 7792254372272168406} +--- !u!1102 &-693724927639952508 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -758330942240963927} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Neo3_Controller_Left + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: IsPrimaryDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + - m_Name: IsSecondaryDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + - m_Name: IsPicoDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + - m_Name: IsMenuDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Primary + m_StateMachine: {fileID: -706155607306262420} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Secondary + m_StateMachine: {fileID: -4482213543690290020} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Pico + m_StateMachine: {fileID: -4009141972638398933} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Menu + m_StateMachine: {fileID: -2829783097282865317} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1101 &469022800903853931 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -5612465918457798565} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &1202892387143743188 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SecondaryUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 469022800903853931} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 1953617875055348134, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &1322590568204847764 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsPrimaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -9191426595414499654} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &2617223191236027407 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MenuUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -4398415816402801420} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 5422713515743487830, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &4473067805030766429 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -6814073410482776126} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &6068134341188172826 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsPicoDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -6290513898463596878} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &7792254372272168406 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -4900741514691368024} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &8727316902194714031 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsMenuDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 2617223191236027407} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &8832678459180422744 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SecondaryDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -1854017476551497913} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 3341406217657718590, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Left.controller.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Left.controller.meta new file mode 100644 index 0000000..e6a3cfc --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Left.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ad20dacf4b9790246baf957cfb1caf6b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Right.controller b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Right.controller new file mode 100644 index 0000000..359c534 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Right.controller @@ -0,0 +1,808 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1101 &-9045032698417526354 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsMediaDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -460965442740021154} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-8390896896939170708 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 3192612043098231889} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-8128492238898596255 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsSecondaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -6936306114273760050} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-7896126806570162014 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsPicoDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 3859518462256462490} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-7212493111924076526 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -7896126806570162014} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-6936306114273760050 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SecondaryDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 1108449149145172535} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 3341406217657718590, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-6157458088790806486 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 3943993260266916066} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &-5823646784878515946 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Pico + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -7212493111924076526} + m_Position: {x: 300, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: 3859518462256462490} + m_Position: {x: 638, y: 129.66666, z: 0} + - serializedVersion: 1 + m_State: {fileID: 8573725440443162463} + m_Position: {x: 660, y: 240, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 870, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -7212493111924076526} +--- !u!1101 &-2733696436075571451 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsMediaDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 4365221441376584097} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-1067385579691444256 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsPicoDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 8573725440443162463} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-918642885656837873 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -8128492238898596255} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-460965442740021154 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MediaUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -6157458088790806486} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -7235812280335252764, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Neo3_Controller_Right + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: IsPrimaryDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: IsSecondaryDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: IsPicoDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: IsMediaDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Primary + m_StateMachine: {fileID: 8129606154356254233} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Secondary + m_StateMachine: {fileID: 4978737676985428957} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Pico + m_StateMachine: {fileID: -5823646784878515946} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Media + m_StateMachine: {fileID: 4453794217295508409} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1101 &1108449149145172535 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsSecondaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 8111245043167298827} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &1195131607914064634 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PrimaryUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 1728685265371160449} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 8118803008505274171, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &1728685265371160449 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -8390896896939170708} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &2025996920936480961 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -7212493111924076526} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &2573745656207587165 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PrimaryDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 5708640103914936983} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 2244685009488511520, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &2638273129834115965 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -918642885656837873} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &3192612043098231889 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsPrimaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 2573745656207587165} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &3859518462256462490 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PicoDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -1067385579691444256} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -5170297881424512605, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &3943993260266916066 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -2733696436075571451} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &4365221441376584097 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MediaDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -9045032698417526354} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 526006779981904284, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &4453794217295508409 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Media + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 3943993260266916066} + m_Position: {x: 300, y: 130, z: 0} + - serializedVersion: 1 + m_State: {fileID: 4365221441376584097} + m_Position: {x: 664, y: 135.66666, z: 0} + - serializedVersion: 1 + m_State: {fileID: -460965442740021154} + m_Position: {x: 660, y: 270, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 900, y: 80, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 3943993260266916066} +--- !u!1107 &4978737676985428957 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Secondary + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -918642885656837873} + m_Position: {x: 280, y: 130, z: 0} + - serializedVersion: 1 + m_State: {fileID: -6936306114273760050} + m_Position: {x: 620, y: 140, z: 0} + - serializedVersion: 1 + m_State: {fileID: 8111245043167298827} + m_Position: {x: 620, y: 260, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 850, y: 130, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -918642885656837873} +--- !u!1101 &5708640103914936983 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsPrimaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 1195131607914064634} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &8111245043167298827 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SecondaryUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 2638273129834115965} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 1953617875055348134, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &8129606154356254233 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Primary + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -8390896896939170708} + m_Position: {x: 260, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: 2573745656207587165} + m_Position: {x: 660, y: 130, z: 0} + - serializedVersion: 1 + m_State: {fileID: 1195131607914064634} + m_Position: {x: 660, y: 270, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 890, y: 50, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -8390896896939170708} +--- !u!1102 &8573725440443162463 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PicoUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 2025996920936480961} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 4758964296961227170, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Right.controller.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Right.controller.meta new file mode 100644 index 0000000..2e33534 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Animators/Neo3_Controller_Right.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cfd242c98ab12cc40b8b74aedee1ba0c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials.meta new file mode 100644 index 0000000..32f6db2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 94780a832bc18474793e7b411cab8942 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Left.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Left.mat new file mode 100644 index 0000000..56bbc8c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Left.mat @@ -0,0 +1,128 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-224097736212801340 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Neo3_Controller_Left + m_Shader: {fileID: 4800000, guid: 081528f6308b1134db2b9871766dd820, type: 3} + m_ShaderKeywords: _RENDERMODE_CUTOFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 2800000, guid: e2e56f25585aba74f8b763341de4bd95, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _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: e2e56f25585aba74f8b763341de4bd95, 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} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _FresnelPower: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _RenderMode: 0 + - _SampleGI: 0 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _DiffuseColor: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _FresnelCol: {r: 1, g: 1, b: 1, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Left.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Left.mat.meta new file mode 100644 index 0000000..c46934d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Left.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 850f34a4baa4b4545af156ceeb07a90d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Right.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Right.mat new file mode 100644 index 0000000..b822ada --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Right.mat @@ -0,0 +1,125 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-224097736212801340 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Neo3_Controller_Right + m_Shader: {fileID: 4800000, guid: 081528f6308b1134db2b9871766dd820, type: 3} + m_ShaderKeywords: _RENDERMODE_CUTOFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 2800000, guid: e2e56f25585aba74f8b763341de4bd95, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _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: e2e56f25585aba74f8b763341de4bd95, 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} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _RenderMode: 0 + - _SampleGI: 0 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {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} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Right.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Right.mat.meta new file mode 100644 index 0000000..47877c6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Controller_Right.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: faf88df9fae0748438ea9807963c3787 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Left.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Left.mat new file mode 100644 index 0000000..e8b61ab --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Left.mat @@ -0,0 +1,144 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-224097736212801340 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Neo3_Power_Left + m_Shader: {fileID: 4800000, guid: 081528f6308b1134db2b9871766dd820, type: 3} + m_ShaderKeywords: _RENDERMODE_CUTOFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: + - SHADOWCASTER + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 2800000, guid: bd452ee420c4d4945abec2c258c1f3b0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _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: bd452ee420c4d4945abec2c258c1f3b0, 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} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _ColorMode: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DistortionBlend: 0.5 + - _DistortionEnabled: 0 + - _DistortionStrength: 1 + - _DistortionStrengthScaled: 0.1 + - _DstBlend: 10 + - _EnvironmentReflections: 1 + - _FlipbookBlending: 0 + - _FlipbookMode: 0 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _RenderMode: 0 + - _SampleGI: 0 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 5 + - _Surface: 1 + - _WorkflowMode: 1 + - _ZWrite: 0 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _BaseColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0} + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Left.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Left.mat.meta new file mode 100644 index 0000000..4e6eb9b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Left.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 89969b2a6b51f5e4a90da8a71cec1861 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Right.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Right.mat new file mode 100644 index 0000000..27ee1cc --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Right.mat @@ -0,0 +1,144 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-224097736212801340 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Neo3_Power_Right + m_Shader: {fileID: 4800000, guid: 081528f6308b1134db2b9871766dd820, type: 3} + m_ShaderKeywords: _RENDERMODE_CUTOFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: + - SHADOWCASTER + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 2800000, guid: bd452ee420c4d4945abec2c258c1f3b0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _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: bd452ee420c4d4945abec2c258c1f3b0, 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} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _ColorMode: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DistortionBlend: 0.5 + - _DistortionEnabled: 0 + - _DistortionStrength: 1 + - _DistortionStrengthScaled: 0.1 + - _DstBlend: 10 + - _EnvironmentReflections: 1 + - _FlipbookBlending: 0 + - _FlipbookMode: 0 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _RenderMode: 0 + - _SampleGI: 0 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 5 + - _Surface: 1 + - _WorkflowMode: 1 + - _ZWrite: 0 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _BaseColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0} + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Right.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Right.mat.meta new file mode 100644 index 0000000..86827de --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Materials/Neo3_Power_Right.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8bc837c9cb3f760448bfd88ed47169ff +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes.meta new file mode 100644 index 0000000..467ceec --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 68aa82e03bf3cf9469d5a4ea10953820 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Left.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Left.fbx new file mode 100644 index 0000000..653b465 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Left.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b1089032b8f1cd929b1df2fd1ad37704ae9e273a9de2e92b602fb38f870b05e +size 206528 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Left.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Left.fbx.meta new file mode 100644 index 0000000..aba1e7b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Left.fbx.meta @@ -0,0 +1,422 @@ +fileFormatVersion: 2 +guid: fe8d9fd131b04ed4a8be3355cb9d4aa9 +ModelImporter: + serializedVersion: 20200 + internalIDToNameTable: + - first: + 74: 1827226128182048838 + second: Total + - first: + 74: -3100369314251171874 + second: Idle + - first: + 74: 3341406217657718590 + second: SecondaryDown + - first: + 74: 1953617875055348134 + second: SecondaryUp + - first: + 74: 2244685009488511520 + second: PrimaryDown + - first: + 74: 8118803008505274171 + second: PrimaryUp + - first: + 74: -5170297881424512605 + second: PicoDown + - first: + 74: 4758964296961227170 + second: PicoUp + - first: + 74: -6138657454295028014 + second: MenuDown + - first: + 74: 5422713515743487830 + second: MenuUp + externalObjects: {} + materials: + materialImportMode: 0 + 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: + - serializedVersion: 16 + name: Total + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: Idle + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 0 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondaryDown + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 3 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondaryUp + takeName: Take 001 + internalID: 0 + firstFrame: 3 + lastFrame: 6 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryDown + takeName: Take 001 + internalID: 0 + firstFrame: 6 + lastFrame: 9 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryUp + takeName: Take 001 + internalID: 0 + firstFrame: 9 + lastFrame: 12 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PicoDown + takeName: Take 001 + internalID: 0 + firstFrame: 12 + lastFrame: 15 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PicoUp + takeName: Take 001 + internalID: 0 + firstFrame: 15 + lastFrame: 18 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MenuDown + takeName: Take 001 + internalID: 0 + firstFrame: 18 + lastFrame: 21 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MenuUp + takeName: Take 001 + internalID: 0 + firstFrame: 21 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + 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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Right.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Right.fbx new file mode 100644 index 0000000..d32ee8d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Right.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84eaa9a6402fba4d164e6c3e708e38b1cd5e17a1287dfc9d3bbd9c2fbc25b396 +size 207136 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Right.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Right.fbx.meta new file mode 100644 index 0000000..c6987cf --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Meshes/Neo3_Controller_Right.fbx.meta @@ -0,0 +1,422 @@ +fileFormatVersion: 2 +guid: 98595991fd68c5e419d1d37fed8658ff +ModelImporter: + serializedVersion: 20200 + internalIDToNameTable: + - first: + 74: 1827226128182048838 + second: Total + - first: + 74: -3100369314251171874 + second: Idle + - first: + 74: 3341406217657718590 + second: SecondaryDown + - first: + 74: 1953617875055348134 + second: SecondaryUp + - first: + 74: 2244685009488511520 + second: PrimaryDown + - first: + 74: 8118803008505274171 + second: PrimaryUp + - first: + 74: -5170297881424512605 + second: PicoDown + - first: + 74: 4758964296961227170 + second: PicoUp + - first: + 74: 526006779981904284 + second: MediaDown + - first: + 74: -7235812280335252764 + second: MediaUp + externalObjects: {} + materials: + materialImportMode: 0 + 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: + - serializedVersion: 16 + name: Total + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: Idle + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 0 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondaryDown + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 3 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondaryUp + takeName: Take 001 + internalID: 0 + firstFrame: 3 + lastFrame: 6 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryDown + takeName: Take 001 + internalID: 0 + firstFrame: 6 + lastFrame: 9 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryUp + takeName: Take 001 + internalID: 0 + firstFrame: 9 + lastFrame: 12 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PicoDown + takeName: Take 001 + internalID: 0 + firstFrame: 12 + lastFrame: 15 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PicoUp + takeName: Take 001 + internalID: 0 + firstFrame: 15 + lastFrame: 18 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MediaDown + takeName: Take 001 + internalID: 0 + firstFrame: 18 + lastFrame: 21 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MediaUp + takeName: Take 001 + internalID: 0 + firstFrame: 21 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + 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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/PXR_Neo3.shader b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/PXR_Neo3.shader new file mode 100644 index 0000000..9663daa --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/PXR_Neo3.shader @@ -0,0 +1,88 @@ +Shader "PXR/Neo3" +{ + Properties + { + [NoScaleOffset] _MainTex("Texture", 2D) = "white" {} + [KeywordEnum(CutOff,Transparent)]_RenderMode("RenderMode",float) = 0 + } + CGINCLUDE +#include "UnityCG.cginc" + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + uniform sampler2D _MainTex; + uniform float4 _MainTex_ST; + uniform float _AlphaScale; + + v2f vert(appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + fixed4 col = tex2D(_MainTex, i.uv); + + #if defined(_RENDERMODE_CUTOFF) + clip(col.a - 0.1); + #elif defined(_RENDERMODE_TRANSPARENT) + + #endif + return col; + } + ENDCG + SubShader + { + Tags + { + "RenderType" = "Opaque" + "IgnoreProjector" = "True" + "RenderPipeline" = "UniversalPipeline" + } + LOD 100 + ZWrite On + ZTest On + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma shader_feature _RENDERMODE_CUTOFF _RENDERMODE_TRANSPARENT + ENDCG + } + } + SubShader + { + Tags + { + "RenderType" = "Opaque" + "IgnoreProjector" = "True" + } + LOD 100 + ZWrite On + ZTest On + Pass + { + Tags + { + "Queue" = "Geometry" + } + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma shader_feature _RENDERMODE_CUTOFF _RENDERMODE_TRANSPARENT + ENDCG + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/PXR_Neo3.shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/PXR_Neo3.shader.meta new file mode 100644 index 0000000..068d1e1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/PXR_Neo3.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 081528f6308b1134db2b9871766dd820 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures.meta new file mode 100644 index 0000000..cce11a3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0b340260f5f0024438d140a6a8246cc5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures/controller5_idle.jpg b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures/controller5_idle.jpg new file mode 100644 index 0000000..62687ee --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures/controller5_idle.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abda2a45afda20b21f440fc0fdfa917552fc3a057ce831498f66499d839cfbd4 +size 57540 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures/controller5_idle.jpg.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures/controller5_idle.jpg.meta new file mode 100644 index 0000000..d0465d1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/Neo3/Textures/controller5_idle.jpg.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: e2e56f25585aba74f8b763341de4bd95 +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: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 L.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 L.prefab new file mode 100644 index 0000000..bbda764 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 L.prefab @@ -0,0 +1,225 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3222469904833361626 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3222469904833361628} + m_Layer: 0 + m_Name: PICO 4 L + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3222469904833361628 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3222469904833361626} + serializedVersion: 2 + 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: 629444517539979649} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1096209834479765098 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 3222469904833361628} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_LocalPosition.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -4365425836530490892, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: f8ac02e5e051a384ea4184a3dc488e7b, type: 2} + - target: {fileID: 919132149155446097, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_Name + value: PICO4_Controller_Left + objectReference: {fileID: 0} + - target: {fileID: 5493962918168504272, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_Materials.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5493962918168504272, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 44423fbc73cf1334c8ab8ec0d0d79aa0, type: 2} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + insertIndex: -1 + addedObject: {fileID: 1183846128716313513} + - targetCorrespondingSourceObject: {fileID: 919132149155446097, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + insertIndex: -1 + addedObject: {fileID: 6494698954608102966} + - targetCorrespondingSourceObject: {fileID: 8245864472737768373, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + insertIndex: -1 + addedObject: {fileID: 5279413507387948785} + m_SourcePrefab: {fileID: 100100000, guid: c26f3085d9135a54a94a9b180e4e3b03, type: 3} +--- !u!1 &285957516829522747 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_PrefabInstance: {fileID: 1096209834479765098} + m_PrefabAsset: {fileID: 0} +--- !u!95 &1183846128716313513 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 285957516829522747} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 19363699162b3b842a8355f3f58473a7, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &6494698954608102966 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 285957516829522747} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0551a3e12ecf0614fa83e84a93d87bb5, type: 3} + m_Name: + m_EditorClassIdentifier: + primary2DAxisTran: {fileID: 6434106829245411415} + gripTran: {fileID: 861397882452066000} + triggerTran: {fileID: 7985819383929400989} + controllerL: 1 +--- !u!4 &629444517539979649 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_PrefabInstance: {fileID: 1096209834479765098} + m_PrefabAsset: {fileID: 0} +--- !u!4 &861397882452066000 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 343058374925023418, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_PrefabInstance: {fileID: 1096209834479765098} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6434106829245411415 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 6231872593874564669, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_PrefabInstance: {fileID: 1096209834479765098} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7985819383929400989 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7054274610534983927, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_PrefabInstance: {fileID: 1096209834479765098} + m_PrefabAsset: {fileID: 0} +--- !u!1 &9032451764015113695 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8245864472737768373, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_PrefabInstance: {fileID: 1096209834479765098} + m_PrefabAsset: {fileID: 0} +--- !u!114 &5279413507387948785 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9032451764015113695} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7cfc8380945cdad43ae2cacaadf47013, type: 3} + m_Name: + m_EditorClassIdentifier: + power1: {fileID: 2800000, guid: 12a19b71643cd314291e0f6c3e9a2ac9, type: 3} + power2: {fileID: 2800000, guid: 00b918d38c21608499365dcf824b50ac, type: 3} + power3: {fileID: 2800000, guid: 77c7eb2aadfa27c40bbae105b90de610, type: 3} + power4: {fileID: 2800000, guid: 2feddea28647636409e9100780016736, type: 3} + power5: {fileID: 2800000, guid: bd452ee420c4d4945abec2c258c1f3b0, type: 3} + controllerL: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 L.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 L.prefab.meta new file mode 100644 index 0000000..ddcc26b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 L.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 853840c5196b2486a97e1785f3a68575 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 R.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 R.prefab new file mode 100644 index 0000000..697e7d0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 R.prefab @@ -0,0 +1,206 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1704171135803129665 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1704171135803129664} + m_Layer: 0 + m_Name: PICO 4 R + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1704171135803129664 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1704171135803129665} + 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: 1597370572271799518} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &1270500456293018421 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1704171135803129664} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_LocalPosition.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -4365425836530490892, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: f8ac02e5e051a384ea4184a3dc488e7b, type: 2} + - target: {fileID: 919132149155446097, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_Name + value: PICO4_Controller_Right + objectReference: {fileID: 0} + - target: {fileID: 5493962918168504272, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_Materials.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5493962918168504272, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 44423fbc73cf1334c8ab8ec0d0d79aa0, type: 2} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} +--- !u!1 &2116921343157737060 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + m_PrefabInstance: {fileID: 1270500456293018421} + m_PrefabAsset: {fileID: 0} +--- !u!4 &1597370572271799518 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + m_PrefabInstance: {fileID: 1270500456293018421} + m_PrefabAsset: {fileID: 0} +--- !u!1 &7191838915158689920 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 8245864472737768373, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + m_PrefabInstance: {fileID: 1270500456293018421} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7028788585488283269 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -1140821836707635792, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + m_PrefabInstance: {fileID: 1270500456293018421} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6063307438897976333 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 5009278849061388088, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + m_PrefabInstance: {fileID: 1270500456293018421} + m_PrefabAsset: {fileID: 0} +--- !u!4 &8651414779421196155 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -1608270464383724466, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, + type: 3} + m_PrefabInstance: {fileID: 1270500456293018421} + m_PrefabAsset: {fileID: 0} +--- !u!95 &5693470270003671477 +Animator: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2116921343157737060} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: e5d23cb97e44b93469029f476f8ebd37, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!114 &6541657482657834481 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2116921343157737060} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0551a3e12ecf0614fa83e84a93d87bb5, type: 3} + m_Name: + m_EditorClassIdentifier: + primary2DAxisTran: {fileID: 6063307438897976333} + gripTran: {fileID: 7028788585488283269} + triggerTran: {fileID: 8651414779421196155} + controller: 1 +--- !u!114 &6808795965444519179 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7191838915158689920} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7cfc8380945cdad43ae2cacaadf47013, type: 3} + m_Name: + m_EditorClassIdentifier: + power1: {fileID: 2800000, guid: 12a19b71643cd314291e0f6c3e9a2ac9, type: 3} + power2: {fileID: 2800000, guid: 00b918d38c21608499365dcf824b50ac, type: 3} + power3: {fileID: 2800000, guid: 77c7eb2aadfa27c40bbae105b90de610, type: 3} + power4: {fileID: 2800000, guid: 2feddea28647636409e9100780016736, type: 3} + power5: {fileID: 2800000, guid: bd452ee420c4d4945abec2c258c1f3b0, type: 3} + hand: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 R.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 R.prefab.meta new file mode 100644 index 0000000..a3103c7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4 R.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3a5f20f82a5224d7d969e99da633fc69 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4.meta new file mode 100644 index 0000000..4368b10 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 04d9107a7fba37040b00fc49724aec9c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators.meta new file mode 100644 index 0000000..3a94935 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ef928aae6bfdf4fdfa39a94329a85fed +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Left.controller b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Left.controller new file mode 100644 index 0000000..f86a5b7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Left.controller @@ -0,0 +1,820 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-8818356342431189118 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SecondaryUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 5536540826773790151} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 1953617875055348134, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-7605083351917315223 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 6975715809872034687} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-4573287747299122731 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsSecondaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -8818356342431189118} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &-4276026456054432818 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Left_Pico + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -7605083351917315223} + m_Position: {x: 300, y: 140, z: 0} + - serializedVersion: 1 + m_State: {fileID: 5570321150895322606} + m_Position: {x: 680, y: 150, z: 0} + - serializedVersion: 1 + m_State: {fileID: -1992010328539058354} + m_Position: {x: 680, y: 260, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 990, y: 90, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -7605083351917315223} +--- !u!1101 &-3244158346234801040 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsPrimaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 5966179677768690360} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-3194180289695574249 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 3536466409710944805} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-2348111599403223308 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MenuUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 9142567890135588128} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 5422713515743487830, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-2329523692143257082 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -7605083351917315223} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-2256320500683155624 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsPrimaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 5435236245373241787} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &-2249603525314330928 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Left_Menu + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -3194180289695574249} + m_Position: {x: 270, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: 4570890459704206221} + m_Position: {x: 690, y: 130, z: 0} + - serializedVersion: 1 + m_State: {fileID: -2348111599403223308} + m_Position: {x: 690, y: 280, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 950, y: 10, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -3194180289695574249} +--- !u!1102 &-1992010328539058354 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PicoUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -2329523692143257082} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -998496362607748373, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-451635216026892401 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 2658436297363880646} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PICO4_Controller_Left + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: IsPrimaryDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: IsSecondaryDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: IsPicoDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + - m_Name: IsMenuDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Left_Primary + m_StateMachine: {fileID: 1741492897020245041} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Left_Secondary + m_StateMachine: {fileID: 3033588339987718297} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Left_Pico + m_StateMachine: {fileID: -4276026456054432818} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Left_Menu + m_StateMachine: {fileID: -2249603525314330928} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1101 &1154757746583211870 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsMenuDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -2348111599403223308} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &1741492897020245041 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Left_Primary + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 2658436297363880646} + m_Position: {x: 270, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: 5966179677768690360} + m_Position: {x: 640, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: 5435236245373241787} + m_Position: {x: 640, y: 240, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 660, y: -60, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 2658436297363880646} +--- !u!1102 &1951878301412197700 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SecondaryDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -4573287747299122731} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 3341406217657718590, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &2658436297363880646 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -3244158346234801040} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &2964063397659424392 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsPicoDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -1992010328539058354} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &3033588339987718297 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Left_Secondary + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 4361785475527541325} + m_Position: {x: 290, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: 1951878301412197700} + m_Position: {x: 652.6667, y: 127.33334, z: 0} + - serializedVersion: 1 + m_State: {fileID: -8818356342431189118} + m_Position: {x: 660, y: 240, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 1000, y: 110, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 4361785475527541325} +--- !u!1101 &3536466409710944805 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsMenuDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 4570890459704206221} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &4361785475527541325 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 5475568207224369914} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &4570890459704206221 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MenuDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 1154757746583211870} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -6138657454295028014, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &5435236245373241787 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PrimaryUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -451635216026892401} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 8118803008505274171, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &5475568207224369914 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsSecondaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 1951878301412197700} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &5536540826773790151 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 4361785475527541325} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &5570321150895322606 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PicoDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 2964063397659424392} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -5170297881424512605, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &5966179677768690360 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PrimaryDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -2256320500683155624} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 2244685009488511520, guid: c26f3085d9135a54a94a9b180e4e3b03, + type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &6975715809872034687 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsPicoDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 5570321150895322606} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &9142567890135588128 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -3194180289695574249} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Left.controller.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Left.controller.meta new file mode 100644 index 0000000..889921c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Left.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 19363699162b3b842a8355f3f58473a7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Right.controller b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Right.controller new file mode 100644 index 0000000..93359d1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Right.controller @@ -0,0 +1,808 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1101 &-9142415716745207845 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsMediaDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -2091816153108118916} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-8562300235842683068 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -3295593606822919124} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-8105266188358090069 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SecondaryDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -1832480346775740714} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 3341406217657718590, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &-8044824831811141246 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Right_Secondary + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 1569132227166347998} + m_Position: {x: 320, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: -8105266188358090069} + m_Position: {x: 760, y: 130, z: 0} + - serializedVersion: 1 + m_State: {fileID: -6212634821001877007} + m_Position: {x: 760, y: 270, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 820, y: -60, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 1569132227166347998} +--- !u!1101 &-7682713894074598839 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsMediaDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 2875392017600832700} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-6212634821001877007 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SecondaryUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -4500905726358492655} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 1953617875055348134, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-5207325196031152572 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PrimaryUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 4329112968746719182} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 8118803008505274171, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &-4904489857285493996 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PicoDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 2744517339392778882} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -5170297881424512605, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-4843961785427834047 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 241017678758796491} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-4500905726358492655 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 1569132227166347998} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 0 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-4107606665455645861 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsSecondaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -8105266188358090069} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &-3295593606822919124 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsPrimaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 8319416289159210106} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &-2091816153108118916 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MediaDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -7682713894074598839} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 526006779981904284, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &-1832480346775740714 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsSecondaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -6212634821001877007} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &-922973215208669470 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Right_Media + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 6484473039313678328} + m_Position: {x: 290, y: 130, z: 0} + - serializedVersion: 1 + m_State: {fileID: -2091816153108118916} + m_Position: {x: 770, y: 140, z: 0} + - serializedVersion: 1 + m_State: {fileID: 2875392017600832700} + m_Position: {x: 770, y: 300, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 1070, y: -10, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 6484473039313678328} +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PICO4_Controller_Right + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: IsPrimaryDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + - m_Name: IsSecondaryDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + - m_Name: IsPicoDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + - m_Name: IsMediaDown + m_Type: 4 + m_DefaultFloat: 0 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 0} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Right_Primary + m_StateMachine: {fileID: 1741492897020245041} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Right_Secondary + m_StateMachine: {fileID: -8044824831811141246} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Right_Pico + m_StateMachine: {fileID: 7789198567620252306} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Right_Media + m_StateMachine: {fileID: -922973215208669470} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 1 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1102 &241017678758796491 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 1881500008282669313} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &1569132227166347998 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -4107606665455645861} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1107 &1741492897020245041 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Right_Primary + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -8562300235842683068} + m_Position: {x: 321.6667, y: 115.33334, z: 0} + - serializedVersion: 1 + m_State: {fileID: 8319416289159210106} + m_Position: {x: 780, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: -5207325196031152572} + m_Position: {x: 780, y: 260, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 1020, y: -90, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -8562300235842683068} +--- !u!1101 &1881500008282669313 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 1 + m_ConditionEvent: IsPicoDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -4904489857285493996} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0.75 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1101 &2744517339392778882 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsPicoDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 4554068413230075127} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &2875392017600832700 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: MediaUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 7208228054265189186} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -7235812280335252764, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &4329112968746719182 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -8562300235842683068} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &4554068413230075127 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PicoUp + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -4843961785427834047} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 4758964296961227170, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &6484473039313678328 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Idle + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: -9142415716745207845} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: -3100369314251171874, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1101 &7208228054265189186 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: [] + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: 6484473039313678328} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 1 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1107 &7789198567620252306 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Right_Pico + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 241017678758796491} + m_Position: {x: 290, y: 120, z: 0} + - serializedVersion: 1 + m_State: {fileID: -4904489857285493996} + m_Position: {x: 681.6667, y: 128.33334, z: 0} + - serializedVersion: 1 + m_State: {fileID: 4554068413230075127} + m_Position: {x: 700, y: 260, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 840, y: 60, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 241017678758796491} +--- !u!1101 &8279857929998094422 +AnimatorStateTransition: + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: + m_Conditions: + - m_ConditionMode: 2 + m_ConditionEvent: IsPrimaryDown + m_EventTreshold: 0 + m_DstStateMachine: {fileID: 0} + m_DstState: {fileID: -5207325196031152572} + m_Solo: 0 + m_Mute: 0 + m_IsExit: 0 + serializedVersion: 3 + m_TransitionDuration: 0 + m_TransitionOffset: 0 + m_ExitTime: 0 + m_HasExitTime: 0 + m_HasFixedDuration: 1 + m_InterruptionSource: 3 + m_OrderedInterruption: 1 + m_CanTransitionToSelf: 1 +--- !u!1102 &8319416289159210106 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PrimaryDown + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: + - {fileID: 8279857929998094422} + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 2244685009488511520, guid: 88d8ac3ceef6b33439f56e9ca1e2fccd, type: 3} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Right.controller.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Right.controller.meta new file mode 100644 index 0000000..e52b3d9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Animators/PICO4_Controller_Right.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e5d23cb97e44b93469029f476f8ebd37 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials.meta new file mode 100644 index 0000000..6621a7c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9073cd4a9198f9749a649545ba11d662 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4_Controller.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4_Controller.mat new file mode 100644 index 0000000..1141974 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4_Controller.mat @@ -0,0 +1,133 @@ +%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: PICO4_Controller + m_Shader: {fileID: 4800000, guid: 4ef37ef333c3dc149b842dd2a3534ca1, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AoTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseMap: + m_Texture: {fileID: 2800000, guid: a00fd7b7e9b6c0d48951c6cb35cbf9e3, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _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: a9229f83992ae6c439fd8eb7c677e0e8, 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} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DiffusePower: 0.436 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _FresnelPower: 2.6 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _SampleGI: 0 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _DiffuseCol: {r: 1, g: 1, b: 1, a: 1} + - _DiffuseColor: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _FresnelCol: {r: 0.8025545, g: 0.9340862, b: 1.3155276, a: 1} + - _SpecColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_BuildTextureStacks: [] +--- !u!114 &2599002908461301438 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4_Controller.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4_Controller.mat.meta new file mode 100644 index 0000000..c283a55 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4_Controller.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 44423fbc73cf1334c8ab8ec0d0d79aa0 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4__Power.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4__Power.mat new file mode 100644 index 0000000..21387cd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4__Power.mat @@ -0,0 +1,126 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-8514308122103988610 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 4 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PICO4__Power + m_Shader: {fileID: 4800000, guid: 574ae8e957555df43b4cd9257e834e36, type: 3} + m_ShaderKeywords: _ALPHATEST_ON _RENDERMODE_CUTOFF + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 2800000, guid: bd452ee420c4d4945abec2c258c1f3b0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _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: bd452ee420c4d4945abec2c258c1f3b0, 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} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 1 + - _AlphaScale: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.514 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _RenderMode: 0 + - _SampleGI: 0 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {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} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4__Power.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4__Power.mat.meta new file mode 100644 index 0000000..50e8253 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Materials/PICO4__Power.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f8ac02e5e051a384ea4184a3dc488e7b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes.meta new file mode 100644 index 0000000..a219e48 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f71b377fc9dc4444cbca3ac0030da63c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Left.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Left.fbx new file mode 100644 index 0000000..0efb85b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Left.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a8359b0283b53330b8eb20bc30db404520d57b447ea46be34952908a5749f3a +size 276912 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Left.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Left.fbx.meta new file mode 100644 index 0000000..01d49ff --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Left.fbx.meta @@ -0,0 +1,425 @@ +fileFormatVersion: 2 +guid: c26f3085d9135a54a94a9b180e4e3b03 +ModelImporter: + serializedVersion: 20200 + internalIDToNameTable: + - first: + 74: -2551817162246492632 + second: CINEMA_4D___ + - first: + 74: 1827226128182048838 + second: Total + - first: + 74: 3341406217657718590 + second: SecondaryDown + - first: + 74: 1953617875055348134 + second: SecondaryUp + - first: + 74: 2244685009488511520 + second: PrimaryDown + - first: + 74: 8118803008505274171 + second: PrimaryUp + - first: + 74: -5170297881424512605 + second: PicoDown + - first: + 74: -998496362607748373 + second: PicoUp + - first: + 74: -6138657454295028014 + second: MenuDown + - first: + 74: 5422713515743487830 + second: MenuUp + - first: + 74: -3100369314251171874 + second: Idle + externalObjects: {} + materials: + materialImportMode: 0 + 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: + - serializedVersion: 16 + name: Total + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondaryDown + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 3 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondaryUp + takeName: Take 001 + internalID: 0 + firstFrame: 3 + lastFrame: 6 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryDown + takeName: Take 001 + internalID: 0 + firstFrame: 6 + lastFrame: 9 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryUp + takeName: Take 001 + internalID: 0 + firstFrame: 9 + lastFrame: 12 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PicoDown + takeName: Take 001 + internalID: 0 + firstFrame: 12 + lastFrame: 15 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PicoUp + takeName: Take 001 + internalID: 0 + firstFrame: 15 + lastFrame: 18 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MenuDown + takeName: Take 001 + internalID: 0 + firstFrame: 18 + lastFrame: 21 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MenuUp + takeName: Take 001 + internalID: 0 + firstFrame: 21 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: Idle + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 0 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + 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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Right.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Right.fbx new file mode 100644 index 0000000..42d4179 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Right.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecd8188ca72a8c3b07569cc0691fcead6de23a974cd52cce1b46f1e7f5555a2a +size 274576 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Right.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Right.fbx.meta new file mode 100644 index 0000000..282252b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Meshes/PICO4_Controller_Right.fbx.meta @@ -0,0 +1,425 @@ +fileFormatVersion: 2 +guid: 88d8ac3ceef6b33439f56e9ca1e2fccd +ModelImporter: + serializedVersion: 20200 + internalIDToNameTable: + - first: + 74: -2551817162246492632 + second: CINEMA_4D___ + - first: + 74: 1827226128182048838 + second: Total + - first: + 74: 3341406217657718590 + second: SecondaryDown + - first: + 74: 1953617875055348134 + second: SecondaryUp + - first: + 74: 2244685009488511520 + second: PrimaryDown + - first: + 74: 8118803008505274171 + second: PrimaryUp + - first: + 74: -5170297881424512605 + second: PicoDown + - first: + 74: 4758964296961227170 + second: PicoUp + - first: + 74: 526006779981904284 + second: MediaDown + - first: + 74: -7235812280335252764 + second: MediaUp + - first: + 74: -3100369314251171874 + second: Idle + externalObjects: {} + materials: + materialImportMode: 0 + 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: + - serializedVersion: 16 + name: Total + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondaryDown + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 3 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondaryUp + takeName: Take 001 + internalID: 0 + firstFrame: 3 + lastFrame: 6 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryDown + takeName: Take 001 + internalID: 0 + firstFrame: 6 + lastFrame: 9 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryUp + takeName: Take 001 + internalID: 0 + firstFrame: 9 + lastFrame: 12 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PicoDown + takeName: Take 001 + internalID: 0 + firstFrame: 12 + lastFrame: 15 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PicoUp + takeName: Take 001 + internalID: 0 + firstFrame: 15 + lastFrame: 18 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MediaDown + takeName: Take 001 + internalID: 0 + firstFrame: 18 + lastFrame: 21 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MediaUp + takeName: Take 001 + internalID: 0 + firstFrame: 21 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: Idle + takeName: Take 001 + internalID: 0 + firstFrame: 0 + lastFrame: 0 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + 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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders.meta new file mode 100644 index 0000000..8dfeb73 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7f38dcd9536298e44939e3670807fa7d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4.shader b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4.shader new file mode 100644 index 0000000..2a822f9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4.shader @@ -0,0 +1,141 @@ +Shader "PXR/PICO4" +{ + Properties + { + [NoScaleOffset]_MainTex ("Texture", 2D) = "white" {} + _DiffuseColor("DiffuseColor",Color) = (1,1,1,1) + [HDR]_FresnelCol("FresnelColor",Color) =(1,1,1,1) + _FresnelPower("FresnelPower",Range(0,99))=1 + } + + SubShader + { + Tags + { + "RenderType"="Opaque" + "Queue"="Geometry" + "IgnoreProjector"="True" + "RenderPipeline" = "UniversalPipeline" + } + LOD 100 + ZWrite On + ZTest On + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float3 normal:NORMAL; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + float3 nDir:TEXCOORD1; + float3 wsPos:TEXCOORD2; + }; + + uniform sampler2D _MainTex; + uniform float4 _MainTex_ST; + uniform float4 _FresnelCol; + uniform float _FresnelPower; + uniform float4 _DiffuseColor; + + v2f vert(appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + o.nDir = UnityObjectToWorldNormal(v.normal); + o.wsPos = mul(unity_ObjectToWorld, v.vertex).xyz; + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.wsPos); + float fresnelRate = 1 - saturate(dot(i.nDir, vDir)); + float3 fresnelCol = pow(fresnelRate, _FresnelPower) * _FresnelCol; + + //非菲尼尔区域的颜色 + fixed4 col = tex2D(_MainTex, i.uv); + col.rgb *= (1 - fresnelCol) * _DiffuseColor; + col.rgb += fresnelCol; + return col; + } + ENDCG + } + } + SubShader + { + Tags + { + "RenderType"="Opaque" "Queue"="Geometry" "IgnoreProjector"="True" + } + LOD 100 + ZWrite On + ZTest On + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + float3 normal:NORMAL; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + float3 nDir:TEXCOORD1; + float3 wsPos:TEXCOORD2; + }; + + uniform sampler2D _MainTex; + uniform float4 _MainTex_ST; + uniform float4 _FresnelCol; + uniform float _FresnelPower; + uniform float4 _DiffuseColor; + + v2f vert(appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + o.nDir = UnityObjectToWorldNormal(v.normal); + o.wsPos = mul(unity_ObjectToWorld, v.vertex).xyz; + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + float3 vDir = normalize(_WorldSpaceCameraPos.xyz - i.wsPos); + float fresnelRate = 1 - saturate(dot(i.nDir, vDir)); + float3 fresnelCol = pow(fresnelRate, _FresnelPower) * _FresnelCol; + + //非菲尼尔区域的颜色 + fixed4 col = tex2D(_MainTex, i.uv); + col.rgb *= (1 - fresnelCol) * _DiffuseColor; + col.rgb += fresnelCol; + return col; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4.shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4.shader.meta new file mode 100644 index 0000000..f66bf0e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4ef37ef333c3dc149b842dd2a3534ca1 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4_Power.shader b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4_Power.shader new file mode 100644 index 0000000..13ca4df --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4_Power.shader @@ -0,0 +1,88 @@ +Shader "PXR/PICO4_Power" +{ + Properties + { + [NoScaleOffset]_MainTex ("Texture", 2D) = "white" {} + [KeywordEnum(CutOff,Transparent)]_RenderMode("RenderMode",float) = 0 + } + CGINCLUDE + #include "UnityCG.cginc" + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + uniform sampler2D _MainTex; + uniform float4 _MainTex_ST; + uniform float _AlphaScale; + + v2f vert(appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + fixed4 col = tex2D(_MainTex, i.uv); + + #if defined(_RENDERMODE_CUTOFF) + clip(col.a-0.1); + #elif defined(_RENDERMODE_TRANSPARENT) + + #endif + return col; + } + ENDCG + SubShader + { + Tags + { + "RenderType"="Opaque" + "IgnoreProjector"="True" + "RenderPipeline" = "UniversalPipeline" + } + LOD 100 + ZWrite On + ZTest On + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma shader_feature _RENDERMODE_CUTOFF _RENDERMODE_TRANSPARENT + ENDCG + } + } + SubShader + { + Tags + { + "RenderType"="Opaque" + "IgnoreProjector"="True" + } + LOD 100 + ZWrite On + ZTest On + Pass + { + Tags + { + "Queue"="Geometry" + } + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma shader_feature _RENDERMODE_CUTOFF _RENDERMODE_TRANSPARENT + ENDCG + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4_Power.shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4_Power.shader.meta new file mode 100644 index 0000000..03b85e9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Shaders/PXR_PICO4_Power.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 574ae8e957555df43b4cd9257e834e36 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures.meta new file mode 100644 index 0000000..0c90f45 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0fae7aa8781394852b7e6927142a7e87 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/PICO4_Controller_Albedo.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/PICO4_Controller_Albedo.png new file mode 100644 index 0000000..18e52d3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/PICO4_Controller_Albedo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43012d5c153f64f411be1cc0290d69cf2e68ed78fd4cb1e67e757475a090fdab +size 619759 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/PICO4_Controller_Albedo.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/PICO4_Controller_Albedo.png.meta new file mode 100644 index 0000000..52d9506 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/PICO4_Controller_Albedo.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: a9229f83992ae6c439fd8eb7c677e0e8 +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: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power.meta new file mode 100644 index 0000000..7c9b232 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 64c8adb70b82f7140ac34539203c3f03 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_01.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_01.png new file mode 100644 index 0000000..a54fd59 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_01.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4203383bff8603641ae357c6d5b9198465f782e48ab397ef84a3e4877cc90779 +size 2237 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_01.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_01.png.meta new file mode 100644 index 0000000..e7e48f0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_01.png.meta @@ -0,0 +1,120 @@ +fileFormatVersion: 2 +guid: bd452ee420c4d4945abec2c258c1f3b0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_02.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_02.png new file mode 100644 index 0000000..cb448da --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_02.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:41db5ab39c839ef8788c949815e92b48a90d4e4b81a86eb0c88c523d0ae4a682 +size 2202 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_02.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_02.png.meta new file mode 100644 index 0000000..d47b1cf --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_02.png.meta @@ -0,0 +1,120 @@ +fileFormatVersion: 2 +guid: 2feddea28647636409e9100780016736 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_03.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_03.png new file mode 100644 index 0000000..2ccd1fa --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_03.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e60186a2103c37f6da751e7dc51e82e7b66820c3a65406487e8ae5fb09e6ee5b +size 2202 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_03.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_03.png.meta new file mode 100644 index 0000000..8909c56 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_03.png.meta @@ -0,0 +1,120 @@ +fileFormatVersion: 2 +guid: 77c7eb2aadfa27c40bbae105b90de610 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_04.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_04.png new file mode 100644 index 0000000..ae1afc4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_04.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c9f04324fbe80c6d7b23fca369c88cebc444822297433c2cc4384d42df82796 +size 2191 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_04.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_04.png.meta new file mode 100644 index 0000000..cc9f165 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_04.png.meta @@ -0,0 +1,120 @@ +fileFormatVersion: 2 +guid: 00b918d38c21608499365dcf824b50ac +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_05.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_05.png new file mode 100644 index 0000000..1b500ef --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_05.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e4765b125aa9858bedc21b68ffef587661ab35710a5906a2cec775d4bc4a278 +size 2222 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_05.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_05.png.meta new file mode 100644 index 0000000..fb3e0f9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4/Textures/Power/PICO4_ControllerPower_05.png.meta @@ -0,0 +1,120 @@ +fileFormatVersion: 2 +guid: 12a19b71643cd314291e0f6c3e9a2ac9 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 0 + wrapU: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L WithHand.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L WithHand.prefab new file mode 100644 index 0000000..dc4083d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L WithHand.prefab @@ -0,0 +1,147 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6884707070625379956 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6884707070625379957} + m_Layer: 0 + m_Name: PICO 4U L WithHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6884707070625379957 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6884707070625379956} + serializedVersion: 2 + 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: 8233634716778276665} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &6884707071545356312 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 6884707070625379957} + m_Modifications: + - target: {fileID: 2775073962953035163, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_Name + value: leftHand + objectReference: {fileID: 0} + - target: {fileID: 2775073962953035163, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_LocalPosition.x + value: 0.0042 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_LocalPosition.y + value: -0.0021 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_LocalPosition.z + value: 0.0259 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_LocalRotation.w + value: 0.99691737 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_LocalRotation.x + value: 0.078459114 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 3666775096546563306, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + propertyPath: controllerL + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 3072678336823176712, guid: add26d782c2f14487a27bc09c2d6f4a6, type: 3} + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: + - targetCorrespondingSourceObject: {fileID: 2775073962953035163, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + insertIndex: -1 + addedObject: {fileID: 2572623064472739066} + m_SourcePrefab: {fileID: 100100000, guid: add26d782c2f14487a27bc09c2d6f4a6, type: 3} +--- !u!4 &8233634716778276665 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 3299128329192347425, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + m_PrefabInstance: {fileID: 6884707071545356312} + m_PrefabAsset: {fileID: 0} +--- !u!1 &8721343317659680131 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2775073962953035163, guid: add26d782c2f14487a27bc09c2d6f4a6, + type: 3} + m_PrefabInstance: {fileID: 6884707071545356312} + m_PrefabAsset: {fileID: 0} +--- !u!114 &2572623064472739066 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8721343317659680131} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ad904341cd701b544911a03d77412e1d, type: 3} + m_Name: + m_EditorClassIdentifier: + controllerL: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L WithHand.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L WithHand.prefab.meta new file mode 100644 index 0000000..0172495 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L WithHand.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: da2bf9c72e4199340af64e2d379620d3 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L.prefab new file mode 100644 index 0000000..cc6500d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L.prefab @@ -0,0 +1,295 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &5160734707760153619 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5931069152408530641} + m_Layer: 0 + m_Name: PICO 4U L + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5931069152408530641 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5160734707760153619} + 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: 8080892964840390870} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &8624287918854154045 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 5931069152408530641} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -7781127744997363934, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.12693742 + objectReference: {fileID: 0} + - target: {fileID: -7781127744997363934, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.000015263475 + objectReference: {fileID: 0} + - target: {fileID: -7781127744997363934, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0.0022329798 + objectReference: {fileID: 0} + - target: {fileID: -7688996594785051263, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: -29.697998 + objectReference: {fileID: 0} + - target: {fileID: -7688996594785051263, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -2.2798352 + objectReference: {fileID: 0} + - target: {fileID: -7688996594785051263, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 11.741386 + objectReference: {fileID: 0} + - target: {fileID: -5693625846569519967, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_Materials.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -5693625846569519967, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: ad8827df856b77c48911d03893186baa, type: 2} + - target: {fileID: -5693625846569519967, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_Materials.Array.data[1] + value: + objectReference: {fileID: 2100000, guid: f95c08f6b37807e48aed9305bd74470c, type: 2} + - target: {fileID: -5654570259525832428, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 11.724536 + objectReference: {fileID: 0} + - target: {fileID: -5654570259525832428, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.0000037200857 + objectReference: {fileID: 0} + - target: {fileID: -5654570259525832428, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -0.00001537513 + objectReference: {fileID: 0} + - target: {fileID: -3323942411010345545, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 8.535552 + objectReference: {fileID: 0} + - target: {fileID: -3323942411010345545, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.000006142815 + objectReference: {fileID: 0} + - target: {fileID: -3323942411010345545, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -0.000007747097 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_Name + value: o_com_sparrow_left_01 + objectReference: {fileID: 0} + - target: {fileID: 3555671689143584517, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_Materials.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3555671689143584517, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: a1b3dee6f3915d041b67ebcd32db75de, type: 2} + - target: {fileID: 3555671689143584517, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_Materials.Array.data[1] + value: + objectReference: {fileID: 2100000, guid: 06aea12221e3c5d458026234d7a29f76, type: 2} + - target: {fileID: 4603592652929191832, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 7.5000005 + objectReference: {fileID: 0} + - target: {fileID: 4603592652929191832, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.00000010925675 + objectReference: {fileID: 0} + - target: {fileID: 4603592652929191832, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -0.000025799762 + objectReference: {fileID: 0} + - target: {fileID: 5995699586787853611, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 3.6719027 + objectReference: {fileID: 0} + - target: {fileID: 5995699586787853611, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.0000053415224 + objectReference: {fileID: 0} + - target: {fileID: 5995699586787853611, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -0.000009319388 + objectReference: {fileID: 0} + - target: {fileID: 6026766672989926305, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 84.42591 + objectReference: {fileID: 0} + - target: {fileID: 6026766672989926305, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -32.479977 + objectReference: {fileID: 0} + - target: {fileID: 6026766672989926305, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -32.603096 + objectReference: {fileID: 0} + - target: {fileID: 7929762451639249347, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: -89.98021 + objectReference: {fileID: 0} + - target: {fileID: 8969264202375571010, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.016179634 + objectReference: {fileID: 0} + - target: {fileID: 8969264202375571010, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0.000011937906 + objectReference: {fileID: 0} + - target: {fileID: 8969264202375571010, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -0.000014395326 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: b164e7767f1088a458acb6f692c01d83, type: 3} +--- !u!1 &8894268393305381484 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + m_PrefabInstance: {fileID: 8624287918854154045} + m_PrefabAsset: {fileID: 0} +--- !u!4 &8080892964840390870 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + m_PrefabInstance: {fileID: 8624287918854154045} + m_PrefabAsset: {fileID: 0} +--- !u!1 &73386776818536768 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: -672416466577623427, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + m_PrefabInstance: {fileID: 8624287918854154045} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7125981584487398076 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -7688996594785051263, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + m_PrefabInstance: {fileID: 8624287918854154045} + m_PrefabAsset: {fileID: 0} +--- !u!4 &7182187669596686367 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -7781127744997363934, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + m_PrefabInstance: {fileID: 8624287918854154045} + m_PrefabAsset: {fileID: 0} +--- !u!4 &853038978361164159 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 8969264202375571010, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + m_PrefabInstance: {fileID: 8624287918854154045} + m_PrefabAsset: {fileID: 0} +--- !u!114 &6968056708381636659 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 73386776818536768} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7cfc8380945cdad43ae2cacaadf47013, type: 3} + m_Name: + m_EditorClassIdentifier: + power1: {fileID: 2800000, guid: 64029f435f4d71f4999ea9c75b80c91a, type: 3} + power2: {fileID: 2800000, guid: d7540181fc229e8448f8276f14347b1b, type: 3} + power3: {fileID: 2800000, guid: c874b39fd1d35274cb34a60847385eb5, type: 3} + power4: {fileID: 2800000, guid: c097f47a26972414d93241c55296c220, type: 3} + power5: {fileID: 2800000, guid: a0967be76a24d48428a3f5bff9c73fed, type: 3} + controllerL: 1 +--- !u!95 &1939619644872643197 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8894268393305381484} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 22100000, guid: 3e6da93ce58c14438a129fc637235b7d, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &7733379151853503014 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8894268393305381484} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0551a3e12ecf0614fa83e84a93d87bb5, type: 3} + m_Name: + m_EditorClassIdentifier: + primary2DAxisTran: {fileID: 7182187669596686367} + gripTran: {fileID: 7125981584487398076} + triggerTran: {fileID: 853038978361164159} + controllerL: 1 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L.prefab.meta new file mode 100644 index 0000000..a35313d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U L.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d600af752179d4343b26d6d3eab89e8d +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R WithHand.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R WithHand.prefab new file mode 100644 index 0000000..47c874f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R WithHand.prefab @@ -0,0 +1,115 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2955502424807515460 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2955502424807515459} + m_Layer: 0 + m_Name: PICO 4U R WithHand + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2955502424807515459 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2955502424807515460} + 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: 5250245170303330170} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &2955502423956207639 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 2955502424807515459} + m_Modifications: + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_RootOrder + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_LocalPosition.x + value: -0.0042 + objectReference: {fileID: 0} + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_LocalPosition.y + value: -0.0021 + objectReference: {fileID: 0} + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_LocalPosition.z + value: 0.0259 + objectReference: {fileID: 0} + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_LocalRotation.w + value: 0.99691737 + objectReference: {fileID: 0} + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_LocalRotation.x + value: 0.078459114 + objectReference: {fileID: 0} + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 9 + objectReference: {fileID: 0} + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7679555789696304599, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + propertyPath: m_Name + value: rightHand + objectReference: {fileID: 0} + m_RemovedComponents: + - {fileID: 4674844603613058633, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + m_SourcePrefab: {fileID: 100100000, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} +--- !u!1 &4870447862897688000 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 7679555789696304599, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + m_PrefabInstance: {fileID: 2955502423956207639} + m_PrefabAsset: {fileID: 0} +--- !u!114 &4897895960739835987 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4870447862897688000} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ad904341cd701b544911a03d77412e1d, type: 3} + m_Name: + m_EditorClassIdentifier: + controller: 1 +--- !u!4 &5250245170303330170 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 7050547815102340973, guid: 1fc5f47805e00457ca97da2351c04180, type: 3} + m_PrefabInstance: {fileID: 2955502423956207639} + m_PrefabAsset: {fileID: 0} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R WithHand.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R WithHand.prefab.meta new file mode 100644 index 0000000..590a2b6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R WithHand.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a46f059c710f4d4448336f95461ea483 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R.prefab new file mode 100644 index 0000000..6859353 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R.prefab @@ -0,0 +1,295 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2641197622611298662 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1125849990618630095} + m_Layer: 0 + m_Name: PICO 4U R + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1125849990618630095 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2641197622611298662} + 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: 5551578648160335081} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &5368732899296154370 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1125849990618630095} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8109707847617594908, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: -31.27538 + objectReference: {fileID: 0} + - target: {fileID: -8109707847617594908, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -11.728481 + objectReference: {fileID: 0} + - target: {fileID: -8109707847617594908, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 4.831497 + objectReference: {fileID: 0} + - target: {fileID: -7932800877738653352, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_Materials.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: -7932800877738653352, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: a1b3dee6f3915d041b67ebcd32db75de, type: 2} + - target: {fileID: -7932800877738653352, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_Materials.Array.data[1] + value: + objectReference: {fileID: 2100000, guid: 06aea12221e3c5d458026234d7a29f76, type: 2} + - target: {fileID: -7416185511445563616, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.00000028176754 + objectReference: {fileID: 0} + - target: {fileID: -7416185511445563616, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.00000614979 + objectReference: {fileID: 0} + - target: {fileID: -7416185511445563616, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -179.99998 + objectReference: {fileID: 0} + - target: {fileID: -7218032476936822789, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.00000028634938 + objectReference: {fileID: 0} + - target: {fileID: -7218032476936822789, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.0000082433335 + objectReference: {fileID: 0} + - target: {fileID: -7218032476936822789, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 179.99998 + objectReference: {fileID: 0} + - target: {fileID: -6218109077856969745, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.00000028176416 + objectReference: {fileID: 0} + - target: {fileID: -6218109077856969745, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.0000060185657 + objectReference: {fileID: 0} + - target: {fileID: -6218109077856969745, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 179.99998 + objectReference: {fileID: 0} + - target: {fileID: -4611111201729923251, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.00000028176754 + objectReference: {fileID: 0} + - target: {fileID: -4611111201729923251, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.0000061498104 + objectReference: {fileID: 0} + - target: {fileID: -4611111201729923251, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -179.99998 + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_Name + value: o_com_sparrow_right_01 + objectReference: {fileID: 0} + - target: {fileID: 1444753995505789054, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.00000028176754 + objectReference: {fileID: 0} + - target: {fileID: 1444753995505789054, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.0000061497535 + objectReference: {fileID: 0} + - target: {fileID: 1444753995505789054, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: -179.99998 + objectReference: {fileID: 0} + - target: {fileID: 3489955779830630181, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0.00000027768849 + objectReference: {fileID: 0} + - target: {fileID: 3489955779830630181, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -0.000004317258 + objectReference: {fileID: 0} + - target: {fileID: 3489955779830630181, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 179.99998 + objectReference: {fileID: 0} + - target: {fileID: 4975900088886697368, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: -84.42591 + objectReference: {fileID: 0} + - target: {fileID: 4975900088886697368, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: -147.52031 + objectReference: {fileID: 0} + - target: {fileID: 4975900088886697368, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 147.39717 + objectReference: {fileID: 0} + - target: {fileID: 6972209725336936091, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_Materials.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6972209725336936091, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: ad8827df856b77c48911d03893186baa, type: 2} + - target: {fileID: 6972209725336936091, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_Materials.Array.data[1] + value: + objectReference: {fileID: 2100000, guid: f95c08f6b37807e48aed9305bd74470c, type: 2} + - target: {fileID: 7593785717723561821, guid: 85013fab55cf932458682912756a4fcb, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: -89.98021 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 85013fab55cf932458682912756a4fcb, type: 3} +--- !u!4 &5040959055159241446 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8109707847617594908, guid: 85013fab55cf932458682912756a4fcb, type: 3} + m_PrefabInstance: {fileID: 5368732899296154370} + m_PrefabAsset: {fileID: 0} +--- !u!1 &5062322995424210515 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 85013fab55cf932458682912756a4fcb, type: 3} + m_PrefabInstance: {fileID: 5368732899296154370} + m_PrefabAsset: {fileID: 0} +--- !u!95 &6502569784002467861 +Animator: + serializedVersion: 4 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5062322995424210515} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 22100000, guid: 5b670b470d1b64368901166ffb20d7ed, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorControllerStateOnDisable: 0 +--- !u!114 &4495004757731146630 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5062322995424210515} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0551a3e12ecf0614fa83e84a93d87bb5, type: 3} + m_Name: + m_EditorClassIdentifier: + primary2DAxisTran: {fileID: 6813205415513488252} + gripTran: {fileID: 5040959055159241446} + triggerTran: {fileID: 7148695427224963309} + controller: 1 +--- !u!4 &5551578648160335081 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 85013fab55cf932458682912756a4fcb, type: 3} + m_PrefabInstance: {fileID: 5368732899296154370} + m_PrefabAsset: {fileID: 0} +--- !u!4 &6813205415513488252 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 1444753995505789054, guid: 85013fab55cf932458682912756a4fcb, type: 3} + m_PrefabInstance: {fileID: 5368732899296154370} + m_PrefabAsset: {fileID: 0} +--- !u!1 &6819263356154732396 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 1451128595764268142, guid: 85013fab55cf932458682912756a4fcb, type: 3} + m_PrefabInstance: {fileID: 5368732899296154370} + m_PrefabAsset: {fileID: 0} +--- !u!114 &3161037079813014974 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6819263356154732396} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7cfc8380945cdad43ae2cacaadf47013, type: 3} + m_Name: + m_EditorClassIdentifier: + power1: {fileID: 2800000, guid: 64029f435f4d71f4999ea9c75b80c91a, type: 3} + power2: {fileID: 2800000, guid: d7540181fc229e8448f8276f14347b1b, type: 3} + power3: {fileID: 2800000, guid: c874b39fd1d35274cb34a60847385eb5, type: 3} + power4: {fileID: 2800000, guid: c097f47a26972414d93241c55296c220, type: 3} + power5: {fileID: 2800000, guid: a0967be76a24d48428a3f5bff9c73fed, type: 3} + hand: 0 +--- !u!4 &7148695427224963309 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -6218109077856969745, guid: 85013fab55cf932458682912756a4fcb, type: 3} + m_PrefabInstance: {fileID: 5368732899296154370} + m_PrefabAsset: {fileID: 0} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R.prefab.meta new file mode 100644 index 0000000..99a6bcf --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U R.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ab854e81d8fcde04eb1603f397457afc +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U.meta new file mode 100644 index 0000000..afaf315 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9f830968c51875e48baa2c46abf7c5c6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation.meta new file mode 100644 index 0000000..d8a7130 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d098d43efa69d894bb8c41514e5ac2f6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Left.overrideController b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Left.overrideController new file mode 100644 index 0000000..3355b61 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Left.overrideController @@ -0,0 +1,29 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!221 &22100000 +AnimatorOverrideController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PICO4U_Controller_Left + m_Controller: {fileID: 9100000, guid: ad20dacf4b9790246baf957cfb1caf6b, type: 2} + m_Clips: + - m_OriginalClip: {fileID: -3100369314251171874, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_OverrideClip: {fileID: 6313567973396844840, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + - m_OriginalClip: {fileID: -6138657454295028014, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_OverrideClip: {fileID: 542095706707716219, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + - m_OriginalClip: {fileID: 5422713515743487830, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_OverrideClip: {fileID: -6322513800116873103, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + - m_OriginalClip: {fileID: -5170297881424512605, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_OverrideClip: {fileID: -4492507055040485151, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + - m_OriginalClip: {fileID: 4758964296961227170, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_OverrideClip: {fileID: -2820481499951442891, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + - m_OriginalClip: {fileID: 2244685009488511520, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_OverrideClip: {fileID: -3903663820710633180, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + - m_OriginalClip: {fileID: 8118803008505274171, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_OverrideClip: {fileID: -2480445514951097906, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + - m_OriginalClip: {fileID: 3341406217657718590, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_OverrideClip: {fileID: -4524156999063776215, guid: b164e7767f1088a458acb6f692c01d83, type: 3} + - m_OriginalClip: {fileID: 1953617875055348134, guid: fe8d9fd131b04ed4a8be3355cb9d4aa9, type: 3} + m_OverrideClip: {fileID: -4813023440974984355, guid: b164e7767f1088a458acb6f692c01d83, type: 3} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Left.overrideController.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Left.overrideController.meta new file mode 100644 index 0000000..d667d5a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Left.overrideController.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e6da93ce58c14438a129fc637235b7d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 22100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Right.overrideController b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Right.overrideController new file mode 100644 index 0000000..114b2b4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Right.overrideController @@ -0,0 +1,29 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!221 &22100000 +AnimatorOverrideController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PICO4U_Controller_Right + m_Controller: {fileID: 9100000, guid: cfd242c98ab12cc40b8b74aedee1ba0c, type: 2} + m_Clips: + - m_OriginalClip: {fileID: -3100369314251171874, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_OverrideClip: {fileID: -8910972301016173187, guid: 85013fab55cf932458682912756a4fcb, type: 3} + - m_OriginalClip: {fileID: 526006779981904284, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_OverrideClip: {fileID: 6038508935759725102, guid: 85013fab55cf932458682912756a4fcb, type: 3} + - m_OriginalClip: {fileID: -7235812280335252764, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_OverrideClip: {fileID: -3963122108496336211, guid: 85013fab55cf932458682912756a4fcb, type: 3} + - m_OriginalClip: {fileID: -5170297881424512605, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_OverrideClip: {fileID: 5544957027817521514, guid: 85013fab55cf932458682912756a4fcb, type: 3} + - m_OriginalClip: {fileID: 4758964296961227170, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_OverrideClip: {fileID: 8638949603956449617, guid: 85013fab55cf932458682912756a4fcb, type: 3} + - m_OriginalClip: {fileID: 2244685009488511520, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_OverrideClip: {fileID: 6191762636365824326, guid: 85013fab55cf932458682912756a4fcb, type: 3} + - m_OriginalClip: {fileID: 8118803008505274171, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_OverrideClip: {fileID: -1761757082966585417, guid: 85013fab55cf932458682912756a4fcb, type: 3} + - m_OriginalClip: {fileID: 3341406217657718590, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_OverrideClip: {fileID: 580736372498371490, guid: 85013fab55cf932458682912756a4fcb, type: 3} + - m_OriginalClip: {fileID: 1953617875055348134, guid: 98595991fd68c5e419d1d37fed8658ff, type: 3} + m_OverrideClip: {fileID: 6550963475456108365, guid: 85013fab55cf932458682912756a4fcb, type: 3} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Right.overrideController.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Right.overrideController.meta new file mode 100644 index 0000000..8910de6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/PICO4U_Controller_Right.overrideController.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5b670b470d1b64368901166ffb20d7ed +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 22100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh.meta new file mode 100644 index 0000000..ef5d694 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: af0c9322577f6934a87d316856b2b115 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_left_01.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_left_01.fbx new file mode 100644 index 0000000..8d3fa15 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_left_01.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9059a68298a1a710cdea59410e54faab6d585f07f9628e61538599e48f795547 +size 748828 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_left_01.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_left_01.fbx.meta new file mode 100644 index 0000000..603bee8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_left_01.fbx.meta @@ -0,0 +1,396 @@ +fileFormatVersion: 2 +guid: b164e7767f1088a458acb6f692c01d83 +ModelImporter: + serializedVersion: 21300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 1 + 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: + - serializedVersion: 16 + name: Total + takeName: o_com_sparrow_left_01|PICO4S_Controller_Left|CINEMA_4D___|Layer0 + internalID: 6533314452094762490 + firstFrame: 0 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondaryDown + takeName: o_com_sparrow_left_01|PICO4S_Controller_Left|CINEMA_4D___|Layer0 + internalID: -4524156999063776215 + firstFrame: 0 + lastFrame: 3 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondayUp + takeName: o_com_sparrow_left_01|PICO4S_Controller_Left|CINEMA_4D___|Layer0 + internalID: -4813023440974984355 + firstFrame: 3 + lastFrame: 6 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryDown + takeName: o_com_sparrow_left_01|PICO4S_Controller_Left|CINEMA_4D___|Layer0 + internalID: -3903663820710633180 + firstFrame: 6 + lastFrame: 9 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryUp + takeName: o_com_sparrow_left_01|PICO4S_Controller_Left|CINEMA_4D___|Layer0 + internalID: -2480445514951097906 + firstFrame: 9 + lastFrame: 12 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PICODown + takeName: o_com_sparrow_left_01|PICO4S_Controller_Left|CINEMA_4D___|Layer0 + internalID: -4492507055040485151 + firstFrame: 12 + lastFrame: 15 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PICOUp + takeName: o_com_sparrow_left_01|PICO4S_Controller_Left|CINEMA_4D___|Layer0 + internalID: -2820481499951442891 + firstFrame: 15 + lastFrame: 18 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MenuDown + takeName: o_com_sparrow_left_01|PICO4S_Controller_Left|CINEMA_4D___|Layer0 + internalID: 542095706707716219 + firstFrame: 18 + lastFrame: 21 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MenuUp + takeName: o_com_sparrow_left_01|PICO4S_Controller_Left|CINEMA_4D___|Layer0 + internalID: -6322513800116873103 + firstFrame: 21 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: Idle + takeName: o_com_sparrow_left_01|PICO4S_Controller_Left|CINEMA_4D___|Layer0 + internalID: 6313567973396844840 + firstFrame: 0 + lastFrame: 0 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + 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 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_right_01.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_right_01.fbx new file mode 100644 index 0000000..dc6e8d0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_right_01.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1874bc6786ebb90085db42fcaee8c63dd92f779a5b556f28afaad3c68ed84578 +size 749228 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_right_01.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_right_01.fbx.meta new file mode 100644 index 0000000..5197a14 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Animation/mesh/o_com_PICO4U_right_01.fbx.meta @@ -0,0 +1,396 @@ +fileFormatVersion: 2 +guid: 85013fab55cf932458682912756a4fcb +ModelImporter: + serializedVersion: 21300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 1 + 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: + - serializedVersion: 16 + name: Total + takeName: o_com_sparrow_right_01|PICO4S_Controller_Right|CINEMA_4D___|Layer0 + internalID: 1873956295834415900 + firstFrame: 0 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondaryDown + takeName: o_com_sparrow_right_01|PICO4S_Controller_Right|CINEMA_4D___|Layer0 + internalID: 580736372498371490 + firstFrame: 0 + lastFrame: 3 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: SecondayUp + takeName: o_com_sparrow_right_01|PICO4S_Controller_Right|CINEMA_4D___|Layer0 + internalID: 6550963475456108365 + firstFrame: 3 + lastFrame: 6 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryDown + takeName: o_com_sparrow_right_01|PICO4S_Controller_Right|CINEMA_4D___|Layer0 + internalID: 6191762636365824326 + firstFrame: 6 + lastFrame: 9 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PrimaryUp + takeName: o_com_sparrow_right_01|PICO4S_Controller_Right|CINEMA_4D___|Layer0 + internalID: -1761757082966585417 + firstFrame: 9 + lastFrame: 12 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PICODown + takeName: o_com_sparrow_right_01|PICO4S_Controller_Right|CINEMA_4D___|Layer0 + internalID: 5544957027817521514 + firstFrame: 12 + lastFrame: 15 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: PICOUp + takeName: o_com_sparrow_right_01|PICO4S_Controller_Right|CINEMA_4D___|Layer0 + internalID: 8638949603956449617 + firstFrame: 15 + lastFrame: 18 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MenuDown + takeName: o_com_sparrow_right_01|PICO4S_Controller_Right|CINEMA_4D___|Layer0 + internalID: 6038508935759725102 + firstFrame: 18 + lastFrame: 21 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: MenuUp + takeName: o_com_sparrow_right_01|PICO4S_Controller_Right|CINEMA_4D___|Layer0 + internalID: -3963122108496336211 + firstFrame: 21 + lastFrame: 24 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + - serializedVersion: 16 + name: Idle + takeName: o_com_sparrow_right_01|PICO4S_Controller_Right|CINEMA_4D___|Layer0 + internalID: -8910972301016173187 + firstFrame: 0 + lastFrame: 0 + wrapMode: 0 + orientationOffsetY: 0 + level: 0 + cycleOffset: 0 + loop: 0 + hasAdditiveReferencePose: 0 + loopTime: 0 + loopBlend: 0 + loopBlendOrientation: 0 + loopBlendPositionY: 0 + loopBlendPositionXZ: 0 + keepOriginalOrientation: 0 + keepOriginalPositionY: 1 + keepOriginalPositionXZ: 0 + heightFromFeet: 0 + mirror: 0 + bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000 + curves: [] + events: [] + transformMask: [] + maskType: 3 + maskSource: {instanceID: 0} + additiveReferencePoseFrame: 0 + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + 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 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader.meta new file mode 100644 index 0000000..d050467 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3b7d78c478152ec4fa1a887be8f572f8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_power.shader b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_power.shader new file mode 100644 index 0000000..3288636 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_power.shader @@ -0,0 +1,96 @@ +Shader "o_com_power_code" +{ + Properties + { + _MainTex ("Texture", 2D) = "white" {} + } + + CGINCLUDE + #include "UnityCG.cginc" + #pragma target 3.0 + + sampler2D _MainTex; + float4 _MainTex_ST; + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + + + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = TRANSFORM_TEX(v.uv, _MainTex); + UNITY_TRANSFER_FOG(o,o.vertex); + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + // sample the texture + fixed4 col = tex2D(_MainTex, i.uv); + return col; + } + ENDCG + SubShader + { + Tags + { + "RenderPipeline"="UniversalPipeline" + "Queue" = "Transparent" + "RenderType" = "Opaque" + } + + Pass + { + Name "Forward" + Tags { "LightMode"="UniversalForward" } + + Blend One Zero, One Zero + ZWrite On + ZTest LEqual + Offset 0,0 + ColorMask RGBA + + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } + + + } + SubShader + { + Tags + { + "Queue" = "Transparent" + "RenderType" = "Opaque" + "IgnoreProjector" = "True" + } + Pass + { + Name "Interior" + Blend SrcAlpha OneMinusSrcAlpha + ZWrite On + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } + } +} + diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_power.shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_power.shader.meta new file mode 100644 index 0000000..36950d4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_power.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 6837ed7aa7a8c8d4597569922ffcbca5 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_shader_code.shader b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_shader_code.shader new file mode 100644 index 0000000..12ac460 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_shader_code.shader @@ -0,0 +1,146 @@ +Shader "o_com_shader_code" +{ + Properties + { + [HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5 + [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) + _LightColor_01("Light Color_01", Color) = (0.3921569,0.3921569,0.3921569,1) + _LightColor_02("Light Color_02", Color) = (0.3921569,0.3921569,0.3921569,1) + _MainTex("MainTex", 2D) = "white" {} + _Tint("Tint", Color) = (1,1,1,0) + _Matcap_01("Matcap_01", 2D) = "white" {} + _Matcap_02("Matcap_02", 2D) = "white" {} + _MatcapIntensity("MatcapIntensity", Range( 0 , 2)) = 0 + _Light("Light", Vector) = (0,0,0,0) + _Light_Power("Light_Power", Range( 0 , 4)) = 1 + [Toggle(_LIGHT_O_ON)] _Light_O("Light_O", Float) = 0 + _Mask("Mask", 2D) = "white" {} + } + + + CGINCLUDE + #include "Lighting.cginc" + #pragma target 3.0 + + float4 _Tint; + float4 _LightColor_01; + float4 _LightColor_02; + float3 _Light; + float _MatcapIntensity; + float _Light_Power; + + sampler2D _MainTex; + sampler2D _Matcap_01; + sampler2D _Matcap_02; + sampler2D _Mask; + + + struct VertexInput + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float4 texcoord : TEXCOORD0; + }; + + struct VertexOutput + { + float4 clipPos : SV_POSITION; + float4 uv : TEXCOORD3; + float4 vertex : TEXCOORD4; + float4 worldNormal : TEXCOORD5; + }; + + + VertexOutput vert ( VertexInput v ) + { + VertexOutput o = (VertexOutput)0; + o.worldNormal.xyz = UnityObjectToWorldNormal(v.normal); + o.uv.xy = v.texcoord.xy; + o.vertex = v.vertex; + //float3 positionWS = mul(unity_ObjectToWorld, v.vertex.xyz); + float4 positionCS = UnityObjectToClipPos(v.vertex); + o.clipPos = positionCS; + return o; + } + + half4 frag ( VertexOutput IN ) : SV_Target + { + float2 uv = IN.uv.xy * float2( 1,1 ) + float2( 0,0 ); + float4 maintex = tex2D( _MainTex, uv ); + float3 ViewPos = mul( UNITY_MATRIX_MV, float4( IN.vertex.xyz, 1 ) ).xyz; + ViewPos = normalize( ViewPos ); + float3 worldNormal = normalize(IN.worldNormal.xyz); + float3 break80 = cross( ViewPos , mul( UNITY_MATRIX_V, float4( worldNormal , 0.0 ) ).xyz ); + float2 MatCapUV = (float2(-break80.y , break80.x)); + MatCapUV = (MatCapUV*0.5 + 0.5); + float4 mask = tex2D( _Mask, uv ); + float4 lerpMatCap = lerp( tex2D( _Matcap_01, MatCapUV ) , tex2D( _Matcap_02, MatCapUV ) , mask.r); + float4 mainColor = ( ( maintex * _Tint ) * ( lerpMatCap * _MatcapIntensity ) ); + mainColor+=mainColor; + float4 lerpLightColor = lerp( _LightColor_01 , _LightColor_02 , mask.r); + float lambert = dot( worldNormal , _Light ); + float4 Color = ( mainColor + ( ( ( lerpLightColor * max( lambert , 0.0 ) ) / 20.0 ) * _Light_Power ) ); + float4 finalCol = float4(Color.rgb, 1); + + return finalCol; + } + + ENDCG + + SubShader + { + Tags + { + "RenderPipeline"="UniversalPipeline" + "Queue" = "Geometry" + "RenderType" = "Opaque" + } + + Pass + { + Name "Forward" + Tags { "LightMode"="UniversalForward" } + + Blend One Zero, One Zero + ZWrite On + ZTest LEqual + Offset 0,0 + ColorMask RGBA + + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } + + + } + + SubShader + { + Tags + { + "Queue" = "Transparent" + "RenderType" = "Opaque" + "IgnoreProjector" = "True" + } + LOD 200 + Pass + { + Name "Depth" + ZWrite On + ColorMask 0 + } + Pass + { + Name "Interior" + Blend SrcAlpha OneMinusSrcAlpha + ZWrite On + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + ENDCG + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_shader_code.shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_shader_code.shader.meta new file mode 100644 index 0000000..42bfb8b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Shader/o_com_shader_code.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 296b2106775d132469d4ddadfa937fc4 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture.meta new file mode 100644 index 0000000..4dec829 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1fe299767e7d8db4eaefe18b72634458 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_01_b.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_01_b.png new file mode 100644 index 0000000..f650805 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_01_b.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8e89696ff362b2703dc17c340f715078dee74617487acfc200a144eea1efc1e +size 227660 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_01_b.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_01_b.png.meta new file mode 100644 index 0000000..121a029 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_01_b.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: e1721d77f8f68c941899d270ca2b57f5 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_a.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_a.png new file mode 100644 index 0000000..3b984fa --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_a.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71045c6c27d36b6497ae8a52a4d8583491554ad0580d763bb9f1a879750d43fd +size 11870 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_a.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_a.png.meta new file mode 100644 index 0000000..f03bc08 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_a.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: c4959a0adbe7a874cb1b2b7641284ede +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_b.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_b.png new file mode 100644 index 0000000..944f0f9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_b.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80c27cef24fbc99c854d409aa6867c78f5f5a111b9ee921ce6eeeb103d0ff0d6 +size 170972 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_b.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_b.png.meta new file mode 100644 index 0000000..9ba8439 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_02_b.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: a12a0e3ab0496e54688b85ba2e1d4ea7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_01.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_01.png new file mode 100644 index 0000000..bf5df6c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_01.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6472f05338a30915d0106fbed09318774e7ecb7d325bbff900dfd6ecb51c7622 +size 2480 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_01.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_01.png.meta new file mode 100644 index 0000000..388da74 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_01.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 6a8f8e966738570459db901ed84ef9b6 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_02.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_02.png new file mode 100644 index 0000000..e4193fd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_02.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77f00a01fad87d668e71d3144c354beac43087c4850e38a499947eaf4e4c54cd +size 2812 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_02.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_02.png.meta new file mode 100644 index 0000000..19dc968 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_02.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 4f3c1260c5bd8c64985946fc6af20f00 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_03.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_03.png new file mode 100644 index 0000000..57a63bc --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_03.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbdb576ed55458b08f3ee4fcdfe2726e21f50c8100289cfa849881ce9bc67fbe +size 2812 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_03.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_03.png.meta new file mode 100644 index 0000000..91d6f4a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_03.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: ec194f0bc3d9ae14082c5e7cff8fb17c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_04.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_04.png new file mode 100644 index 0000000..67aa278 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_04.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c62f70748e516b98122003beb1767c3c6e1179a40dbf15c1115ce1653ca8604 +size 1512 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_04.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_04.png.meta new file mode 100644 index 0000000..7f691f8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_04.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 5496c96b97fb7ee469f4ca36671c32d0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_05.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_05.png new file mode 100644 index 0000000..484d2f0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_05.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9831761497540bed67c62652c1007c99ff83445f615363a138a7599dff9e2c1e +size 1521 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_05.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_05.png.meta new file mode 100644 index 0000000..f841971 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_PICO4U_power_05.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 0f37039b4a5cd3f48bff00c92911c80c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_01_b.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_01_b.png new file mode 100644 index 0000000..d4cdbfe --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_01_b.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9e0add7b235555dfe974b1e066f339c36896e965697ca0f9b722568dba4405e +size 22292 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_01_b.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_01_b.png.meta new file mode 100644 index 0000000..8424890 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_01_b.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: ac8818945755185409a09289d09dda7a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_02_b.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_02_b.png new file mode 100644 index 0000000..bf7a7ac --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_02_b.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1473c1ac1eea230e40569e462c97583bcfd3b963c760278ccca9056e17cfef7 +size 34050 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_02_b.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_02_b.png.meta new file mode 100644 index 0000000..ee1f72f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_02_b.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 85601fedf8a9794499989ae0ccb88a86 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_03_b.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_03_b.png new file mode 100644 index 0000000..54f4119 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_03_b.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34fc236f4bfc2f33520b45cd63c5bba9bd9bddfc8afec3d8a985bd0f4d4a562a +size 28215 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_03_b.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_03_b.png.meta new file mode 100644 index 0000000..f99a090 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Texture/o_com_matcap_03_b.png.meta @@ -0,0 +1,135 @@ +fileFormatVersion: 2 +guid: 768b1dc8c63b0c44d91c84b5cf367592 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + 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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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 + cookieLightType: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures.meta new file mode 100644 index 0000000..6111c1d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5398d8d2caaa346cba7c055a0d458983 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power.meta new file mode 100644 index 0000000..7586eb8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0a82278058340fe45aa3e09270569443 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_01.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_01.png new file mode 100644 index 0000000..bf5df6c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_01.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6472f05338a30915d0106fbed09318774e7ecb7d325bbff900dfd6ecb51c7622 +size 2480 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_01.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_01.png.meta new file mode 100644 index 0000000..f38ae13 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_01.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: a0967be76a24d48428a3f5bff9c73fed +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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_02.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_02.png new file mode 100644 index 0000000..e4193fd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_02.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77f00a01fad87d668e71d3144c354beac43087c4850e38a499947eaf4e4c54cd +size 2812 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_02.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_02.png.meta new file mode 100644 index 0000000..c51070c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_02.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: c097f47a26972414d93241c55296c220 +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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_03.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_03.png new file mode 100644 index 0000000..57a63bc --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_03.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fbdb576ed55458b08f3ee4fcdfe2726e21f50c8100289cfa849881ce9bc67fbe +size 2812 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_03.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_03.png.meta new file mode 100644 index 0000000..c9d5de3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_03.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: c874b39fd1d35274cb34a60847385eb5 +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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_04.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_04.png new file mode 100644 index 0000000..67aa278 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_04.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c62f70748e516b98122003beb1767c3c6e1179a40dbf15c1115ce1653ca8604 +size 1512 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_04.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_04.png.meta new file mode 100644 index 0000000..b1fc79d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_04.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: d7540181fc229e8448f8276f14347b1b +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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_05.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_05.png new file mode 100644 index 0000000..484d2f0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_05.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9831761497540bed67c62652c1007c99ff83445f615363a138a7599dff9e2c1e +size 1521 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_05.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_05.png.meta new file mode 100644 index 0000000..4d74fef --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/Power/o_com_PICO4U_power_05.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: 64029f435f4d71f4999ea9c75b80c91a +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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_01_b.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_01_b.png new file mode 100644 index 0000000..d4cdbfe --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_01_b.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9e0add7b235555dfe974b1e066f339c36896e965697ca0f9b722568dba4405e +size 22292 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_01_b.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_01_b.png.meta new file mode 100644 index 0000000..3c3b56d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_01_b.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: 9d3720e74aa770c4ab771954af51c36b +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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_02_b.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_02_b.png new file mode 100644 index 0000000..bf7a7ac --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_02_b.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1473c1ac1eea230e40569e462c97583bcfd3b963c760278ccca9056e17cfef7 +size 34050 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_02_b.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_02_b.png.meta new file mode 100644 index 0000000..7ffdb1a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_matcap_02_b.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: 2fc108a4d4e9d5d41bf34f493b563d76 +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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_01_b.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_01_b.png new file mode 100644 index 0000000..f650805 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_01_b.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8e89696ff362b2703dc17c340f715078dee74617487acfc200a144eea1efc1e +size 227660 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_01_b.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_01_b.png.meta new file mode 100644 index 0000000..4a4b2e4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_01_b.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: a0d171ecb61251f499e61977161e37fe +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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_02_a.png b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_02_a.png new file mode 100644 index 0000000..b44e31f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_02_a.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac5eb5f3a5e5fa79a6c6b6b263be9168094c234dc0c729b7253b7da80e3da055 +size 6774 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_02_a.png.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_02_a.png.meta new file mode 100644 index 0000000..bf0a99b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/Textures/o_com_sparrow_02_a.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: c5365c6b6f861ed4ebbf709f331de625 +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 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + 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: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material.meta new file mode 100644 index 0000000..728e917 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6299756a9ccfcbb4093bb461d74b9264 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_01_m.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_01_m.mat new file mode 100644 index 0000000..a9aeaaa --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_01_m.mat @@ -0,0 +1,173 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: o_com_PICO4U_01_m + m_Shader: {fileID: 4800000, guid: 296b2106775d132469d4ddadfa937fc4, type: 3} + m_ValidKeywords: [] + m_InvalidKeywords: + - _LIGHT_O_ON + m_LightmapFlags: 6 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _EmissiveTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _HighlightTex: + m_Texture: {fileID: 2800000, guid: 674e40a4815815440b1f5c6a63260ac7, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: a0d171ecb61251f499e61977161e37fe, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Mask: + m_Texture: {fileID: 2800000, guid: c5365c6b6f861ed4ebbf709f331de625, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Matcap: + m_Texture: {fileID: 2800000, guid: 1b486dd9692504f4f852148b8f2fd182, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Matcap2: + m_Texture: {fileID: 2800000, guid: 1e308ef411232ca42b498443156b90e0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MatcapTex: + m_Texture: {fileID: 2800000, guid: c49e9f056be7ab0468d21c8fffe1bcc0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Matcap_01: + m_Texture: {fileID: 2800000, guid: 2fc108a4d4e9d5d41bf34f493b563d76, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Matcap_02: + m_Texture: {fileID: 2800000, guid: 9d3720e74aa770c4ab771954af51c36b, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _NorTex: + 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} + - _NormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Tex: + m_Texture: {fileID: 2800000, guid: cc5bd5c060be2b74f87d38bd724cecf7, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Texture2D: + m_Texture: {fileID: 2800000, guid: 674e40a4815815440b1f5c6a63260ac7, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Texture2D_1: + m_Texture: {fileID: 2800000, guid: 95a1ae9b50ef24a4cac8ec71828e553d, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _TextureSample1: + m_Texture: {fileID: 2800000, guid: adfd0344911d9c340951e341ad9367a9, 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} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _Alpha: 1 + - _AlphaClip: 0 + - _AlphaCutoff: 0.5 + - _Blend: 0 + - _CastShadows: 1 + - _Cull: 2 + - _CullMode: 2 + - _DstBlend: 0 + - _Emission: 0 + - _EmissiveIntensity: 1 + - _Float: 0.48 + - _Float_1: 0.3 + - _Fre: -1 + - _Fre_Range: 0 + - _Fre_Strength: 0 + - _FresPower: -0.09411765 + - _FresScale: -0.11 + - _FresScale1: -0.09411765 + - _Fresnel: 0 + - _Keyword0: 0 + - _Light: 0 + - _LightOn: 1 + - _LightPower: 0.33 + - _Light_O: 1 + - _Light_Power: 1.4 + - _MatcapIntensity: 1.2 + - _MatcapStrength: 1.4 + - _Metallic: 0 + - _NormalScale: 1 + - _NormalStrength: 0 + - _QueueControl: 0 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _RimScale: 3 + - _ShadowPosition: 0 + - _ShadowSoftness: 0.2 + - _Smoothness: 0.155 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZTest: 4 + - _ZWrite: 1 + - _ZWriteControl: 0 + - _power2: 0.8 + m_Colors: + - _Color: {r: 0.2924528, g: 0.29107332, b: 0.29107332, a: 1} + - _Color_1: {r: 0.13207549, g: 0.13207549, b: 0.13207549, a: 1} + - _EmissionColor: {r: 1, g: 1, b: 1, a: 0} + - _FreColor: {r: 0.16981131, g: 0.16981131, b: 0.16981131, a: 0} + - _FresColor: {r: 0.62264144, g: 0.62264144, b: 0.62264144, a: 0} + - _FresColor1: {r: 0.62264144, g: 0.62264144, b: 0.62264144, a: 0} + - _HighlightColor: {r: 0.14150941, g: 0.14150941, b: 0.14150941, a: 1} + - _HighlightO: {r: 0.3, g: -0.15, b: 0, a: 0} + - _HighlightT: {r: 1, g: 1, b: 0, a: 0} + - _LDir: {r: 0.14, g: 1, b: -0.2, a: 0} + - _Light: {r: 0.28, g: 3.41, b: 1.24, a: 0} + - _LightColor: {r: 0.8104307, g: 0.8155927, b: 0.8207547, a: 1} + - _LightColor_01: {r: 0.5299631, g: 0.54144835, b: 0.5471698, a: 1} + - _LightColor_02: {r: 0.8104307, g: 0.8155927, b: 0.8207547, a: 1} + - _MainColor: {r: 0.39215687, g: 0.39215687, b: 0.39215687, a: 1} + - _MatcapColor: {r: 2.4748788, g: 2.4748788, b: 2.4748788, a: 0} + - _RimColor: {r: 0, g: 0, b: 0, a: 0} + - _Tint: {r: 0.7815355, g: 0.80573845, b: 0.8396226, a: 1} + - _Vector0: {r: 1, g: 1, b: 1, a: 0} + - _Vector2: {r: 1, g: 1, b: 0, a: 0} + - _Vector2_1: {r: 0.3, g: -0.15, b: 0, a: 0} + - _Vector4: {r: 3, g: 3.51, b: -0.3, a: -0.23} + m_BuildTextureStacks: [] diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_01_m.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_01_m.mat.meta new file mode 100644 index 0000000..529faab --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_01_m.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ad8827df856b77c48911d03893186baa +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_power_m.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_power_m.mat new file mode 100644 index 0000000..75737b4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_power_m.mat @@ -0,0 +1,251 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-7996032717077748679 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 5 +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: o_com_PICO4U_power_m + m_Shader: {fileID: 4800000, guid: 574ae8e957555df43b4cd9257e834e36, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: + - DepthOnly + - SHADOWCASTER + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _AlphaMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BaseMap: + m_Texture: {fileID: 2800000, guid: 6a8f8e966738570459db901ed84ef9b6, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _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} + - _EmissiveTex: + m_Texture: {fileID: 2800000, guid: c7025285d77eb6a4bb4f3eb515babe35, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmssionCubemap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _HighlightTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LayerAlphaMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LayerBaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _LayerBumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 64029f435f4d71f4999ea9c75b80c91a, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Mask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Matcap: + m_Texture: {fileID: 2800000, guid: c49e9f056be7ab0468d21c8fffe1bcc0, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MatcapTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Matcap_01: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Matcap_02: + 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} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Tex: + m_Texture: {fileID: 2800000, guid: c7025285d77eb6a4bb4f3eb515babe35, 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} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AdjustColorIntensity: 1 + - _Advanced: 0 + - _Alpha: 1 + - _AlphaClip: 0 + - _AlphaCutoff: 0.5 + - _ApplyVertexColor: 0 + - _BaseMapBias: 0 + - _Blend: 0 + - _BlendOp: 0 + - _BumpMapBias: 0 + - _BumpScale: 1 + - _CastShadows: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _CloudShadowIntensity: 1 + - _Cull: 2 + - _CullMode: 2 + - _CustomFogFragment: 0 + - _CustomSpecularIntensity: 1 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailInputs: 0 + - _DetailNormalMapScale: 1 + - _DisableHeightmapRenderer: 0 + - _DstBlend: 10 + - _Emission: 1 + - _EmissionCubemapIntensity: 1 + - _EmissionCubemapLod: 0 + - _EmissiveIntensity: 1 + - _EnableAlphaMap: 0 + - _EnableBoxProjection: 0 + - _EnableCustomSpecular: 0 + - _EnableLayerBlend: 0 + - _EnvironmentReflections: 1 + - _Fre: 0 + - _Fre_Range: 0 + - _Fre_Strength: 0 + - _FresScale: -0.15 + - _Fresnel: 1 + - _FresnelBias: 0 + - _FresnelPower: 4 + - _FresnelScale: 1 + - _GlobalCloudShadow: 0 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossinessSource: 0 + - _GlossyReflections: 0 + - _LayerBlendGroup: 0 + - _LayerBlendSmoothness: 1 + - _LayerBlendStrength: 0.5 + - _LayerBumpScale: 1 + - _LayerEnableAlphaMap: 0 + - _LayerMetallic: 0 + - _LayerOcclusionStrength: 1 + - _LayerSmoothness: 0.5 + - _Light_O: 0 + - _Light_Power: 1 + - _LightingModel: 1 + - _LightmapSpecular: 1 + - _MatcapIntensity: 0.7 + - _MatcapStrength: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueControl: 0 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _RenderMode: 0 + - _SampleGI: 0 + - _Shininess: 0 + - _Smoothness: 0.5 + - _SmoothnessSource: 0 + - _SmoothnessTextureChannel: 0 + - _SpecSource: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 5 + - _Surface: 1 + - _SurfaceInputs: 0 + - _SurfaceOptions: 0 + - _WeatherMode: 0 + - _WorkflowMode: 1 + - _ZTest: 4 + - _ZWrite: 0 + - _ZWriteControl: 0 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _BlingPhongSpecColor: {r: 0, g: 0, b: 0, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0.07227186, g: 0.69387203, b: 0.12743773, a: 1} + - _FreColor: {r: 0, g: 0, b: 0, a: 0} + - _FresColor: {r: 1, g: 1, b: 1, a: 0} + - _HighlightColor: {r: 0, g: 0, b: 0, a: 0} + - _HighlightO: {r: 0, g: 0, b: 0, a: 0} + - _HighlightT: {r: 0, g: 0, b: 0, a: 0} + - _LayerBaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Light: {r: 0, g: 0, b: 0, a: 0} + - _LightColor_01: {r: 0.39215687, g: 0.39215687, b: 0.39215687, a: 1} + - _LightColor_02: {r: 0.39215687, g: 0.39215687, b: 0.39215687, a: 1} + - _MatcapColor: {r: 0, g: 0, b: 0, a: 0} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + - _Tint: {r: 1, g: 1, b: 1, a: 0} + m_BuildTextureStacks: [] diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_power_m.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_power_m.mat.meta new file mode 100644 index 0000000..1c9687b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Controller/PICO 4U/material/o_com_PICO4U_power_m.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a1b3dee6f3915d041b67ebcd32db75de +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand.meta new file mode 100644 index 0000000..6247ab9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f6a441e8ade2dce4f8996ad56ebc2834 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models.meta new file mode 100644 index 0000000..5d7385d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e642f8eaef9fbb0459ed63c0e614e9e1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_L.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_L.fbx new file mode 100644 index 0000000..21e7e92 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_L.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c5903a4392a0742c521f04e3fb0318ddce69dc6aeaa8db66cdb8e7c624427da +size 178320 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_L.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_L.fbx.meta new file mode 100644 index 0000000..d21ec41 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_L.fbx.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: d103d152776d96a448730ac45c026750 +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 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 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + 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 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_R.fbx b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_R.fbx new file mode 100644 index 0000000..135293e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_R.fbx @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d5d05b01e46a498c23f40474688f2d4718f3e2b2a7d42143a37d003753ad04a +size 178688 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_R.fbx.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_R.fbx.meta new file mode 100644 index 0000000..dfa83ed --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Hand/Models/Hand_R.fbx.meta @@ -0,0 +1,109 @@ +fileFormatVersion: 2 +guid: 32e4299f223a5e74ba6c96aa836018a1 +ModelImporter: + serializedVersion: 22200 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 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 + importPhysicalCameras: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + strictVertexDataChecks: 0 + 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 + importBlendShapeDeformPercent: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials.meta new file mode 100644 index 0000000..65f4375 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e49344338b17e1548a84e517fbff4ace +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/PXR_Hand.shader b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/PXR_Hand.shader new file mode 100644 index 0000000..4033285 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/PXR_Hand.shader @@ -0,0 +1,203 @@ +Shader "PXR/Hand" +{ + Properties + { + [Header(BaseColor)] + _InnerColor("内部颜色",Color) = (1,1,1,1) + _OutColor("外部颜色",Color) = (1,1,1,1) + _FresnelPower("菲涅尔强度",float) = 1 + + [Header(Light)][Space(5)] + _PressLight("按下光照",Color) = (1,1,1,1) + _ClickLight("点击光照",Color) = (1,1,1,1) + _PressRange("按压范围",Range(0,1)) = 0.015 + _ClickRange("点击范围",Range(0,1)) = 0.015 + _ClickPosition("点击位置",Vector)=(1,1,1,1) + _PressIntensity("按压强度",Range(0,1)) = 1 + + [Header(Wrist)][Space(10)] + _WristFadeRange("腕部渐变范围",Range(0,1)) = 1 + _MainAlpha("总透明度",Range(0,1)) = 1 + + _FadeIn("透明消隐",Range(0,1))=0 + } + + CGINCLUDE + #include "Lighting.cginc" + #pragma target 3.0 + + float4 _InnerColor; + float4 _OutColor; + float _FresnelPower; + + float4 _PressLight; + float4 _ClickLight; + half _PressIntensity; + float4 _ClickPosition; + + float _PressRange; + float _ClickRange; + + float _WristFadeRange; + float _FadeIn; + float _MainAlpha; + + //-----------------描边参数---------------- + struct OutlineVertexInput + { + float4 vertex : POSITION; + float3 normal : NORMAL; + float2 texcoord : TEXCOORD0; + }; + + struct OutlineVertexOutput + { + float4 vertex : SV_POSITION; + float2 uv:TEXCOORD3; + }; + + //------------------------------------------- + + //---------------------正常绘制参数------------------- + struct VertexInput + { + float4 vertex : POSITION; + half3 normal : NORMAL; + half4 vertexColor : COLOR; + float2 texcoord : TEXCOORD0; + }; + + struct VertexOutput + { + float4 vertex : SV_POSITION; + float3 worldPos : TEXCOORD1; + float3 worldNormal : TEXCOORD2; + float2 uv:TEXCOORD3; + }; + + void CustomRemap(in float4 inValue, float2 inMinMax, float2 outMinMax, out float4 outValue) + { + outValue = outMinMax.x + (inValue - inMinMax.x) * (outMinMax.y - outMinMax.x) / (inMinMax.y - inMinMax.x); + } + + float GetAlpha(float2 uv) + { + float dis = distance(float2(0.5, 0), uv * float2(0.9, 1) + float2(0.05, 0)); + float4 s1; + CustomRemap(_WristFadeRange, float2(0, 1), float2(0.12, 1), s1); + const float s2 = 0.12; + float alpha = smoothstep(s2, s1, dis); + + float s3 = 1 - _FadeIn; + float4 s4; + CustomRemap(s3, float2(0, 0.5), float2(0, 1), s4); + s4 = 1.1 * saturate(s4); + + return alpha * smoothstep(s3, s4, dis); + } + float GetFresnel(float3 viewDir, float3 normal, float power) + { + return pow(1 - dot(viewDir, normal), power); + } + + //-----------------正常绘制------------------------ + VertexOutput baseVertex(VertexInput v) + { + VertexOutput o; + o.worldPos = mul(unity_ObjectToWorld, v.vertex); + o.worldNormal = UnityObjectToWorldNormal(v.normal); + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = v.texcoord; + return o; + } + + fixed4 baseFragment(VertexOutput v) : SV_Target + { + float3 normalWS = normalize(v.worldNormal); + float3 viewWS = normalize(UnityWorldSpaceViewDir(v.worldPos)); + float fresnel = saturate(GetFresnel(viewWS, normalWS, _FresnelPower)); + + float4 baseColor = lerp(_InnerColor, _OutColor, fresnel); + float4 clickColor = lerp(_PressLight, _ClickLight, step(0.99, _PressIntensity)); + + + float3 localClickPos = mul((float3x3)unity_WorldToObject, _ClickPosition); + float3 vertexPos = mul((float3x3)unity_WorldToObject, v.worldPos); + float dis = distance(localClickPos, vertexPos); + + float2 inMinMax = float2(0, lerp(_PressRange, _ClickRange, _PressIntensity)); + float2 outMinMax = float2(1, 0); + float4 s; + CustomRemap(dis, inMinMax, outMinMax, s); + float4 r = smoothstep(0, 1, clamp(s, 0, 1)); + r.a *= _PressIntensity; + + fixed4 finalCol = lerp(baseColor, clickColor, r.a); + finalCol.a *= saturate(GetAlpha(v.uv)); + finalCol.a *= _MainAlpha; + return finalCol; + } + + ENDCG + + SubShader + { + Tags + { + "RenderPipeline" = "UniversalPipeline" + "Queue" = "Transparent" + "RenderType" = "Transparent" + "IgnoreProjector" = "True" + } + Pass + { + Name "Depth" + Tags + { + "LightMode" = "SRPDefaultUnlit" + } + ZWrite On + ColorMask 0 + } + Pass + { + Name "BaseColor" + Tags + { + "LightMode" = "UniversalForward" + } + Blend SrcAlpha OneMinusSrcAlpha + Cull Off + CGPROGRAM + #pragma vertex baseVertex + #pragma fragment baseFragment + ENDCG + } + } + SubShader + { + Tags + { + "Queue" = "Transparent" + "RenderType" = "Transparent" + "IgnoreProjector" = "True" + } + LOD 200 + Pass + { + Name "Depth" + ZWrite On + ColorMask 0 + } + Pass + { + Name "Interior" + Blend SrcAlpha OneMinusSrcAlpha + ZWrite On + CGPROGRAM + #pragma vertex baseVertex + #pragma fragment baseFragment + ENDCG + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/PXR_Hand.shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/PXR_Hand.shader.meta new file mode 100644 index 0000000..0af1bcc --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/PXR_Hand.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4ae4d410c1995fa4e8fea1ab6359ea37 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/UnderlayHole.mat b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/UnderlayHole.mat new file mode 100644 index 0000000..2347812 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/UnderlayHole.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: UnderlayHole + m_Shader: {fileID: 4800000, guid: 4212f1d23993b2640922b428f2748e20, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _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} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _Surface: 0 + - _WorkflowMode: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {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} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] +--- !u!114 &2824030880348393175 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 5 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/UnderlayHole.mat.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/UnderlayHole.mat.meta new file mode 100644 index 0000000..409b988 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Materials/UnderlayHole.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7dceaed51abddf64eb52ba3f767eb4dd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs.meta new file mode 100644 index 0000000..ff9172f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e3ad957f0e359774baa4931b2c24b81b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/LeftControllerModel.prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/LeftControllerModel.prefab new file mode 100644 index 0000000..42f56bd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/LeftControllerModel.prefab @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2673240740586844485 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2673240740586844490} + - component: {fileID: 8805142202525567399} + m_Layer: 0 + m_Name: LeftControllerModel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2673240740586844490 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2673240740586844485} + 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: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8805142202525567399 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2673240740586844485} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c1ba2bcdb414e3b47aca41fdc1a87e64, type: 3} + m_Name: + m_EditorClassIdentifier: + Lefthand: 1 + neo3L: {fileID: 7118676274473289238, guid: 4ff92632f801a7444958bb72ef6aee53, type: 3} + neo3R: {fileID: 8449525692238721171, guid: d22bd72bebc3950409d2de288cdcabd2, type: 3} + PICO_4L: {fileID: 3222469904833361626, guid: 853840c5196b2486a97e1785f3a68575, type: 3} + PICO_4R: {fileID: 1704171135803129665, guid: 3a5f20f82a5224d7d969e99da633fc69, type: 3} + G3: {fileID: 3592357975929350142, guid: 4632f3d33fc5ea94e8a7673306cbb3e2, type: 3} + PICO_4U_L: {fileID: 5160734707760153619, guid: d600af752179d4343b26d6d3eab89e8d, type: 3} + PICO_4U_R: {fileID: 2641197622611298662, guid: ab854e81d8fcde04eb1603f397457afc, type: 3} + legacyMaterial: {fileID: 2100000, guid: ea5d1bb890cef78439598b7062576fa3, type: 2} + controllerSimulation: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/LeftControllerModel.prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/LeftControllerModel.prefab.meta new file mode 100644 index 0000000..00813f9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/LeftControllerModel.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c29eabddf8367d4429e891ca7fe078a2 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/RightControllerModel .prefab b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/RightControllerModel .prefab new file mode 100644 index 0000000..bcf8cef --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/RightControllerModel .prefab @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &588274493876933136 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2281696399307846454} + - component: {fileID: 8151791578876099827} + m_Layer: 0 + m_Name: 'RightControllerModel ' + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2281696399307846454 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 588274493876933136} + 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: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8151791578876099827 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 588274493876933136} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c1ba2bcdb414e3b47aca41fdc1a87e64, type: 3} + m_Name: + m_EditorClassIdentifier: + hand: 1 + neo3L: {fileID: 7118676274473289238, guid: 4ff92632f801a7444958bb72ef6aee53, type: 3} + neo3R: {fileID: 8449525692238721171, guid: d22bd72bebc3950409d2de288cdcabd2, type: 3} + PICO_4L: {fileID: 3222469904833361626, guid: 853840c5196b2486a97e1785f3a68575, type: 3} + PICO_4R: {fileID: 1704171135803129665, guid: 3a5f20f82a5224d7d969e99da633fc69, type: 3} + G3: {fileID: 3592357975929350142, guid: 4632f3d33fc5ea94e8a7673306cbb3e2, type: 3} + PICO_4U_L: {fileID: 5160734707760153619, guid: d600af752179d4343b26d6d3eab89e8d, type: 3} + PICO_4U_R: {fileID: 2641197622611298662, guid: ab854e81d8fcde04eb1603f397457afc, type: 3} + legacyMaterial: {fileID: 2100000, guid: ea5d1bb890cef78439598b7062576fa3, type: 2} + controllerSimulation: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/RightControllerModel .prefab.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/RightControllerModel .prefab.meta new file mode 100644 index 0000000..319def0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Prefabs/RightControllerModel .prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d8ac97d549ca7354c9183e745cb8d4ae +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader.meta new file mode 100644 index 0000000..8104e04 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: de5364a3f922c924488e72bc45c0ccb0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_CubemapBlit.shader b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_CubemapBlit.shader new file mode 100644 index 0000000..7154462 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_CubemapBlit.shader @@ -0,0 +1,53 @@ +Shader "PXR_SDK/PXR_CubemapBlit" { + Properties{ + _MainTex("MainTex", CUBE) = "white" {} + _d("Direction", Int) = 0 + } + SubShader{ + Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + + Pass{ + ZWrite Off + ColorMask RGBA + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f + { + float4 vertex : POSITION; + half3 cubedir : TEXCOORD0; + }; + + samplerCUBE _MainTex; + int _d; + + v2f vert(appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + float3 of[6] = { {1.0, -1.0, 1.0}, {-1.0, -1.0, -1.0}, {-1.0, 1.0, 1.0}, {-1.0, -1.0, -1.0}, {-1.0, -1.0, 1.0}, { 1.0, -1.0, -1.0} }; + float3 uf[6] = { {0.0, 0.0, -1.0}, { 0.0, 0.0, 1.0}, { 1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, {-1.0, 0.0, 0.0} }; + float3 vf[6] = { {0.0, 1.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, -1.0}, { 0.0, 0.0, 1.0}, { 0.0, 1.0, 0.0}, { 0.0, 1.0, 0.0} }; + o.cubedir = of[_d] + 2.0 * v.texcoord.x * uf[_d] + 2.0 * (1.0 - v.texcoord.y) * vf[_d]; + return o; + } + + fixed4 frag(v2f v) : COLOR + { + fixed4 col = texCUBE(_MainTex, v.cubedir); + return col; + } + ENDCG + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_CubemapBlit.shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_CubemapBlit.shader.meta new file mode 100644 index 0000000..b12ca4c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_CubemapBlit.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 964f6c596d90fce419911a05881292e3 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_Fade.shader b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_Fade.shader new file mode 100644 index 0000000..220de32 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_Fade.shader @@ -0,0 +1,16 @@ +Shader "PXR_SDK/PXR_Fade" { + Properties{ + _Color("Color", Color) = (0,0,0,1) + } + SubShader{ + Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + LOD 100 + + ZWrite Off + ZTest Always + Blend SrcAlpha OneMinusSrcAlpha + Color[_Color] + + Pass{} + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_Fade.shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_Fade.shader.meta new file mode 100644 index 0000000..f06f458 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_Fade.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a993dd2c437a2b3409060ffcdd23b83f +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_UnderlayHole.shader b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_UnderlayHole.shader new file mode 100644 index 0000000..e98a82b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_UnderlayHole.shader @@ -0,0 +1,58 @@ +Shader "PXR_SDK/PXR_UnderlayHole" +{ + Properties + { + _MainTex("Texture(A)", 2D) = "black" {} + } + + SubShader + { + Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } + LOD 100 + ZWrite Off + Blend Zero OneMinusSrcAlpha,Zero Zero + ColorMask RGBA + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float2 texcoord : TEXCOORD0; + }; + + sampler2D _MainTex; + + v2f vert(appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.texcoord = v.texcoord; + return o; + } + + fixed4 frag(v2f i) : SV_Target + { + fixed4 col = tex2D(_MainTex, i.texcoord); + col.r = 0; + col.g = 0; + col.b = 0; + col.a = col.a; + return col; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_UnderlayHole.shader.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_UnderlayHole.shader.meta new file mode 100644 index 0000000..b2b763b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Assets/Resources/Shader/PXR_UnderlayHole.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 4212f1d23993b2640922b428f2748e20 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor.meta new file mode 100644 index 0000000..4334daf --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ca66dac516e3a1247b7f1694f1a6a677 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOCompositeLayerEditor.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOCompositeLayerEditor.cs new file mode 100644 index 0000000..6f5db85 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOCompositeLayerEditor.cs @@ -0,0 +1,201 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained hererin are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using UnityEditor; +using UnityEngine; + + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + [CanEditMultipleObjects] + [CustomEditor(typeof(CompositeLayerFeature))] + public class PICOCompositeLayerEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + var guiContent = new GUIContent(); + foreach (CompositeLayerFeature overlayTarget in targets) + { + EditorGUILayout.LabelField("Overlay Settings", EditorStyles.boldLabel); + + EditorGUILayout.BeginVertical("frameBox"); + guiContent.text = "Type"; + overlayTarget.overlayType = (CompositeLayerFeature.OverlayType)EditorGUILayout.EnumPopup(guiContent, overlayTarget.overlayType); + guiContent.text = "Shape"; + overlayTarget.overlayShape = (CompositeLayerFeature.OverlayShape)EditorGUILayout.EnumPopup(guiContent, overlayTarget.overlayShape); + guiContent.text = "Depth"; + overlayTarget.layerDepth = EditorGUILayout.IntField(guiContent, overlayTarget.layerDepth); + + EditorGUILayout.EndVertical(); + + EditorGUILayout.Separator(); + EditorGUILayout.LabelField("Overlay Textures", EditorStyles.boldLabel); + guiContent.text = "Texture Type"; + overlayTarget.textureType = (CompositeLayerFeature.TextureType)EditorGUILayout.EnumPopup(guiContent, overlayTarget.textureType); + EditorGUILayout.Separator(); + + if (overlayTarget.textureType == CompositeLayerFeature.TextureType.StaticTexture) + { + overlayTarget.isDynamic = false; + } + else if (overlayTarget.textureType == CompositeLayerFeature.TextureType.DynamicTexture) + { + overlayTarget.isDynamic = true; + } + else + { + overlayTarget.isDynamic = false; + } + + EditorGUILayout.LabelField("Texture"); + EditorGUILayout.BeginVertical("frameBox"); + + var labelControlRect = EditorGUILayout.GetControlRect(); + EditorGUI.LabelField(new Rect(labelControlRect.x, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Left", "Texture used for the left eye")); + EditorGUI.LabelField(new Rect(labelControlRect.x + labelControlRect.width / 2, labelControlRect.y, labelControlRect.width / 2, labelControlRect.height), new GUIContent("Right", "Texture used for the right eye")); + + var textureControlRect = EditorGUILayout.GetControlRect(GUILayout.Height(64)); + overlayTarget.layerTextures[0] = (Texture)EditorGUI.ObjectField(new Rect(textureControlRect.x, textureControlRect.y, 64, textureControlRect.height), overlayTarget.layerTextures[0], typeof(Texture), false); + overlayTarget.layerTextures[1] = (Texture)EditorGUI.ObjectField(new Rect(textureControlRect.x + textureControlRect.width / 2, textureControlRect.y, 64, textureControlRect.height), overlayTarget.layerTextures[1] != null ? overlayTarget.layerTextures[1] : overlayTarget.layerTextures[0], typeof(Texture), false); + + EditorGUILayout.EndVertical(); + + EditorGUILayout.Separator(); + + + if (overlayTarget.overlayShape == CompositeLayerFeature.OverlayShape.Equirect) + { + guiContent.text = "Radius"; + overlayTarget.radius = EditorGUILayout.FloatField(guiContent, Mathf.Abs(overlayTarget.radius)); + } + + if (overlayTarget.overlayShape == CompositeLayerFeature.OverlayShape.Quad || overlayTarget.overlayShape == CompositeLayerFeature.OverlayShape.Cylinder || overlayTarget.overlayShape == CompositeLayerFeature.OverlayShape.Equirect) + { + guiContent.text = "Texture Rects"; + overlayTarget.useImageRect = EditorGUILayout.Toggle(guiContent, overlayTarget.useImageRect); + if (overlayTarget.useImageRect) + { + guiContent.text = "Source Rects"; + overlayTarget.textureRect = (CompositeLayerFeature.TextureRect)EditorGUILayout.EnumPopup(guiContent, overlayTarget.textureRect); + + if (overlayTarget.textureRect == CompositeLayerFeature.TextureRect.Custom) + { + EditorGUILayout.BeginVertical("frameBox"); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Left Rect"); + EditorGUILayout.LabelField("Right Rect"); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + overlayTarget.srcRectLeft = ClampRect(EditorGUILayout.RectField(overlayTarget.srcRectLeft)); + EditorGUILayout.Space(15); + guiContent.text = "Right"; + overlayTarget.srcRectRight = ClampRect(EditorGUILayout.RectField(overlayTarget.srcRectRight)); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.EndVertical(); + EditorGUILayout.Space(); + } + else if (overlayTarget.textureRect == CompositeLayerFeature.TextureRect.MonoScopic) + { + overlayTarget.srcRectLeft = new Rect(0, 0, 1, 1); + overlayTarget.srcRectRight = new Rect(0, 0, 1, 1); + } + else if (overlayTarget.textureRect == CompositeLayerFeature.TextureRect.StereoScopic) + { + overlayTarget.srcRectLeft = new Rect(0, 0, 0.5f, 1); + overlayTarget.srcRectRight = new Rect(0.5f, 0, 0.5f, 1); + } + + if (overlayTarget.overlayShape == CompositeLayerFeature.OverlayShape.Quad || overlayTarget.overlayShape == CompositeLayerFeature.OverlayShape.Equirect) + { + guiContent.text = "Destination Rects"; + overlayTarget.destinationRect = (CompositeLayerFeature.DestinationRect)EditorGUILayout.EnumPopup(guiContent, overlayTarget.destinationRect); + + if (overlayTarget.destinationRect == CompositeLayerFeature.DestinationRect.Custom) + { + EditorGUILayout.BeginVertical("frameBox"); + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Left Rect"); + EditorGUILayout.LabelField("Right Rect"); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + overlayTarget.dstRectLeft = ClampRect(EditorGUILayout.RectField(overlayTarget.dstRectLeft)); + EditorGUILayout.Space(15); + guiContent.text = "Right"; + overlayTarget.dstRectRight = ClampRect(EditorGUILayout.RectField(overlayTarget.dstRectRight)); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.EndVertical(); + EditorGUILayout.Space(); + } + else + { + overlayTarget.dstRectLeft = new Rect(0, 0, 1, 1); + overlayTarget.dstRectRight = new Rect(0, 0, 1, 1); + } + } + } + } + + guiContent.text = "Layer Blend"; + overlayTarget.useLayerBlend = EditorGUILayout.Toggle(guiContent, overlayTarget.useLayerBlend); + if (overlayTarget.useLayerBlend) + { + EditorGUILayout.BeginVertical("frameBox"); + guiContent.text = "Src Color"; + overlayTarget.srcColor = (PxrBlendFactor)EditorGUILayout.EnumPopup(guiContent, overlayTarget.srcColor); + guiContent.text = "Dst Color"; + overlayTarget.dstColor = (PxrBlendFactor)EditorGUILayout.EnumPopup(guiContent, overlayTarget.dstColor); + guiContent.text = "Src Alpha"; + overlayTarget.srcAlpha = (PxrBlendFactor)EditorGUILayout.EnumPopup(guiContent, overlayTarget.srcAlpha); + guiContent.text = "Dst Alpha"; + overlayTarget.dstAlpha = (PxrBlendFactor)EditorGUILayout.EnumPopup(guiContent, overlayTarget.dstAlpha); + + EditorGUILayout.EndVertical(); + } + + guiContent.text = "Override Color Scale"; + overlayTarget.overrideColorScaleAndOffset = EditorGUILayout.Toggle(guiContent, overlayTarget.overrideColorScaleAndOffset); + if (overlayTarget.overrideColorScaleAndOffset) + { + EditorGUILayout.BeginVertical("frameBox"); + + guiContent.text = "Scale"; + Vector4 colorScale = EditorGUILayout.Vector4Field(guiContent, overlayTarget.colorScale); + + guiContent.text = "Offset"; + Vector4 colorOffset = EditorGUILayout.Vector4Field(guiContent, overlayTarget.colorOffset); + overlayTarget.SetLayerColorScaleAndOffset(colorScale, colorOffset); + + EditorGUILayout.EndVertical(); + } + } + + if (GUI.changed) + { + UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEngine.SceneManagement.SceneManager.GetActiveScene()); + } + } + private Rect ClampRect(Rect rect) + { + rect.x = Mathf.Clamp01(rect.x); + rect.y = Mathf.Clamp01(rect.y); + rect.width = Mathf.Clamp01(rect.width); + rect.height = Mathf.Clamp01(rect.height); + return rect; + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOCompositeLayerEditor.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOCompositeLayerEditor.cs.meta new file mode 100644 index 0000000..e226df6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOCompositeLayerEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d0dfa675096f67419bbdde07d4e7b65 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureEditor.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureEditor.cs new file mode 100644 index 0000000..89ef550 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureEditor.cs @@ -0,0 +1,95 @@ +using Unity.XR.PXR; +using UnityEditor; +using UnityEngine; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + [CustomEditor(typeof(PICOFeature))] + internal class PICOFeatureEditor : Editor + { + void OnEnable() + { + + } + + public override void OnInspectorGUI() + { + PICOFeature picoFeature = (PICOFeature)target; + PICOProjectSetting projectConfig = PICOProjectSetting.GetProjectConfig(); + EditorGUIUtility.labelWidth = 180; + //eye tracking + GUIStyle firstLevelStyle = new GUIStyle(GUI.skin.label); + firstLevelStyle.alignment = TextAnchor.UpperLeft; + firstLevelStyle.fontStyle = FontStyle.Bold; + firstLevelStyle.fontSize = 12; + firstLevelStyle.wordWrap = true; + var guiContent = new GUIContent(); + guiContent.text = "Eye Tracking"; + guiContent.tooltip = "Before calling EyeTracking API, enable this option first, only for Neo3 Pro Eye , PICO 4 Pro device."; + projectConfig.isEyeTracking = EditorGUILayout.Toggle(guiContent, projectConfig.isEyeTracking); + if (projectConfig.isEyeTracking) + { + projectConfig.isEyeTrackingCalibration = EditorGUILayout.Toggle(new GUIContent("Eye Tracking Calibration"), projectConfig.isEyeTrackingCalibration); + EditorGUILayout.BeginVertical("box"); + EditorGUILayout.LabelField("Note: Eye Tracking is supported only on Neo 3 Pro Eye , PICO 4 Pro", firstLevelStyle); + EditorGUILayout.EndVertical(); + } + projectConfig.isHandTracking = EditorGUILayout.Toggle("Hand Tracking", projectConfig.isHandTracking); + + var displayFrequencyContent = new GUIContent(); + displayFrequencyContent.text = "Display Refresh Rates"; + projectConfig.displayFrequency = (SystemDisplayFrequency)EditorGUILayout.EnumPopup(displayFrequencyContent, projectConfig.displayFrequency); + + // content protect + projectConfig.useContentProtect = EditorGUILayout.Toggle("Use Content Protect", projectConfig.useContentProtect); + if (projectConfig.useContentProtect) + { + projectConfig.contentProtectFlags = (SecureContentFlag)EditorGUILayout.EnumPopup("Content Protect", projectConfig.contentProtectFlags); + } + + //FFR + var foveationEnableContent = new GUIContent(); + foveationEnableContent.text = "Foveated Rendering"; + projectConfig.foveationEnable = EditorGUILayout.Toggle(foveationEnableContent, projectConfig.foveationEnable); + if (projectConfig.foveationEnable) + { + var foveationContent = new GUIContent(); + foveationContent.text = "Foveated Rendering Mode"; + projectConfig.foveatedRenderingMode = (FoveationFeature.FoveatedRenderingMode)EditorGUILayout.EnumPopup(foveationContent, projectConfig.foveatedRenderingMode); + + var foveationLevel = new GUIContent(); + foveationLevel.text = "Foveated Rendering Level"; + projectConfig.foveatedRenderingLevel = (FoveationFeature.FoveatedRenderingLevel)EditorGUILayout.EnumPopup(foveationLevel, projectConfig.foveatedRenderingLevel); + + if (projectConfig.foveatedRenderingLevel !=FoveationFeature.FoveatedRenderingLevel.Off) + { + var subsampledEnabledContent = new GUIContent(); + subsampledEnabledContent.text = "Subsampling"; + projectConfig.isSubsampledEnabled = EditorGUILayout.Toggle(subsampledEnabledContent, projectConfig.isSubsampledEnabled); + } + } + GUILayout.BeginHorizontal(); + guiContent.text = "System Splash Screen"; + guiContent.tooltip = ""; + EditorGUILayout.LabelField(guiContent, GUILayout.Width(165)); + projectConfig.systemSplashScreen = (Texture2D)EditorGUILayout.ObjectField(projectConfig.systemSplashScreen, typeof(Texture2D), true); + GUILayout.EndHorizontal(); + + EditorGUILayout.BeginVertical("box"); + EditorGUILayout.LabelField("Note: Set the system splash screen picture in PNG format.", firstLevelStyle); + EditorGUILayout.EndVertical(); + + var MRSafeguard = new GUIContent(); + MRSafeguard.text = "MR Safeguard"; + MRSafeguard.tooltip = "MR safety, if you choose this option, your application will adopt MR safety policies during runtime. If not selected, it will continue to use VR safety policies by default."; + projectConfig.MRSafeguard = EditorGUILayout.Toggle(MRSafeguard, projectConfig.MRSafeguard); + + serializedObject.Update(); + if (GUI.changed) + { + EditorUtility.SetDirty(projectConfig); + } + serializedObject.ApplyModifiedProperties(); + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureEditor.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureEditor.cs.meta new file mode 100644 index 0000000..5a0bba4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fcd29c90e0340f14d89d51672511f326 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureSet.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureSet.cs new file mode 100644 index 0000000..a73a5e3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureSet.cs @@ -0,0 +1,37 @@ + +using UnityEditor; +using UnityEditor.XR.OpenXR.Features; + + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + + [OpenXRFeatureSet( + FeatureIds = new string[] { + PICOFeature.featureId, + OpenXRExtensions.featureId, + DisplayRefreshRateFeature.featureId, + LayerSecureContentFeature.featureId, + FoveationFeature.featureId, + PassthroughFeature.featureId, + PICOSpatialMesh.featureId, + PICOSceneCapture.featureId, + PICOSpatialAnchor.featureId, + }, + UiName = "PICO XR", + Description = "Feature set for using PICO XR Features", + FeatureSetId = featureSetId, + SupportedBuildTargets = new BuildTargetGroup[] { BuildTargetGroup.Android}, + RequiredFeatureIds = new string[] + { + PICOFeature.featureId, + OpenXRExtensions.featureId, + } + )] + class PICOFeatureSet + { + public const string featureSetId = "com.picoxr.openxr.features"; + } +} + + diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureSet.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureSet.cs.meta new file mode 100644 index 0000000..60843c7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOFeatureSet.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8d880f62ed1684040b6a86b50393d5f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOModifyAndroidManifest.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOModifyAndroidManifest.cs new file mode 100644 index 0000000..22547e3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOModifyAndroidManifest.cs @@ -0,0 +1,260 @@ +using System; +using System.IO; +using System.Text; +using System.Xml; +using UnityEditor; +using UnityEditor.Build.Reporting; +using UnityEditor.XR.OpenXR.Features; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; + + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + internal class PICOModifyAndroidManifest : OpenXRFeatureBuildHooks + { + public override int callbackOrder => 1; + public override Type featureType => typeof(PICOFeature); + protected override void OnPreprocessBuildExt(BuildReport report) { } + protected override void OnPostGenerateGradleAndroidProjectExt(string path) + { + var androidManifest = new AndroidManifest(GetManifestPath(path)); + androidManifest.AddPICOMetaData(path); + androidManifest.Save(); + } + protected override void OnPostprocessBuildExt(BuildReport report) { } + private string _manifestFilePath; + private string GetManifestPath(string basePath) + { + if (!string.IsNullOrEmpty(_manifestFilePath)) return _manifestFilePath; + var pathBuilder = new StringBuilder(basePath); + pathBuilder.Append(Path.DirectorySeparatorChar).Append("src"); + pathBuilder.Append(Path.DirectorySeparatorChar).Append("main"); + pathBuilder.Append(Path.DirectorySeparatorChar).Append("AndroidManifest.xml"); + _manifestFilePath = pathBuilder.ToString(); + + return _manifestFilePath; + } + private class AndroidXmlDocument : XmlDocument + { + private string m_Path; + protected XmlNamespaceManager nsMgr; + public readonly string AndroidXmlNamespace = "http://schemas.android.com/apk/res/android"; + + public AndroidXmlDocument(string path) + { + m_Path = path; + using (var reader = new XmlTextReader(m_Path)) + { + reader.Read(); + Load(reader); + } + nsMgr = new XmlNamespaceManager(NameTable); + nsMgr.AddNamespace("android", AndroidXmlNamespace); + } + public string Save() + { + return SaveAs(m_Path); + } + public string SaveAs(string path) + { + using (var writer = new XmlTextWriter(path, new UTF8Encoding(false))) + { + writer.Formatting = Formatting.Indented; + Save(writer); + } + return path; + } + } + private class AndroidManifest : AndroidXmlDocument + { + private readonly XmlElement ApplicationElement; + private readonly XmlElement ManifestElement; + public AndroidManifest(string path) : base(path) + { + ManifestElement = SelectSingleNode("/manifest") as XmlElement; + ApplicationElement = SelectSingleNode("/manifest/application") as XmlElement; + } + private XmlAttribute CreateOrUpdateAndroidAttribute(string key, string value) + { + XmlAttribute attr = CreateAttribute("android", key, AndroidXmlNamespace); + attr.Value = value; + return attr; + } + private void CreateOrUpdateAndroidPermissionData(string name) + { + XmlNodeList nodeList = ManifestElement.SelectNodes("uses-permission"); + foreach (XmlNode node in nodeList) + { + if (node != null) + { + // Update existing nodes + if (node.Attributes != null && name.Equals(node.Attributes[0].Value)) + { + return; + } + } + } + + // Create new node + var md = ManifestElement.AppendChild(CreateElement("uses-permission")); + md.Attributes.Append(CreateOrUpdateAndroidAttribute("name", name.ToString())); + } + + private void DeleteAndroidPermissionData(string name) + { + XmlNodeList nodeList = ManifestElement.SelectNodes("uses-permission"); + foreach (XmlNode node in nodeList) + { + if (node != null) + { + // Delete existing nodes + if (node.Attributes != null && name.Equals(node.Attributes[0].Value)) + { + node.ParentNode?.RemoveChild(node); + return; + } + } + } + } + + private void CreateOrUpdateAndroidMetaData(string name, string value) + { + XmlNodeList nodeList = ApplicationElement.SelectNodes("meta-data"); + foreach (XmlNode node in nodeList) + { + if (node != null) + { + // Update existing nodes + if (node.Attributes != null && name.Equals(node.Attributes[0].Value)) + { + node.Attributes[0].Value = name; + node.Attributes[1].Value = value; + return; + } + } + } + + // Create new node + var md = ApplicationElement.AppendChild(CreateElement("meta-data")); + md.Attributes.Append(CreateOrUpdateAndroidAttribute("name", name.ToString())); + md.Attributes.Append(CreateOrUpdateAndroidAttribute("value", value.ToString())); + } + + private void DeleteAndroidMetaData(string name) + { + XmlNodeList nodeList = ApplicationElement.SelectNodes("meta-data"); + foreach (XmlNode node in nodeList) + { + if (node != null) + { + // Delete existing nodes + if (node.Attributes != null && name.Equals(node.Attributes[0].Value)) + { + node.ParentNode?.RemoveChild(node); + return; + } + } + } + } + + internal void AddPICOMetaData(string path) + { + CreateOrUpdateAndroidMetaData("pvr.app.type", "vr"); + CreateOrUpdateAndroidMetaData("pvr.sdk.version", "Unity OpenXR "+PICOFeature.SDKVersion); + CreateOrUpdateAndroidMetaData("pxr.sdk.version_code", "5800"); + + if (PICOProjectSetting.GetProjectConfig().isHandTracking) + { + CreateOrUpdateAndroidPermissionData("com.picovr.permission.HAND_TRACKING"); + CreateOrUpdateAndroidMetaData("handtracking", "1"); + } + else + { + DeleteAndroidPermissionData("com.picovr.permission.HAND_TRACKING"); + DeleteAndroidMetaData("handtracking"); + } + + if (PICOProjectSetting.GetProjectConfig().isEyeTracking) + { + CreateOrUpdateAndroidPermissionData("com.picovr.permission.EYE_TRACKING"); + CreateOrUpdateAndroidMetaData("picovr.software.eye_tracking", "1"); + CreateOrUpdateAndroidMetaData("eyetracking_calibration", PICOProjectSetting.GetProjectConfig().isEyeTrackingCalibration ? "true" : "false"); + } + else + { + DeleteAndroidPermissionData("com.picovr.permission.EYE_TRACKING"); + DeleteAndroidMetaData("picovr.software.eye_tracking"); + DeleteAndroidMetaData("eyetracking_calibration"); + } + + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(BuildTargetGroup.Android); + bool mrPermission = false; + + foreach (var feature in settings.GetFeatures()) + { + + if (feature is PICOSceneCapture) + { + if (feature.enabled) + { + CreateOrUpdateAndroidMetaData("enable_scene_anchor", "1"); + + mrPermission = true; + } + else + { + DeleteAndroidMetaData("enable_scene_anchor"); + } + } + + if (feature is PICOSpatialAnchor) + { + if (feature.enabled) + { + CreateOrUpdateAndroidMetaData("enable_spatial_anchor", "1"); + mrPermission = true; + } + else + { + DeleteAndroidMetaData("enable_spatial_anchor"); + } + } + + if (feature is PICOSpatialMesh) + { + if (feature.enabled) + { + CreateOrUpdateAndroidMetaData("enable_mesh_anchor", "1"); + mrPermission = true; + } + else + { + DeleteAndroidMetaData("enable_mesh_anchor"); + } + } + + } + if (PICOProjectSetting.GetProjectConfig().MRSafeguard) + { + CreateOrUpdateAndroidMetaData("enable_mr_safeguard", PICOProjectSetting.GetProjectConfig().MRSafeguard ? "1" : "0"); + } + else + { + DeleteAndroidMetaData("enable_mr_safeguard"); + } + + if (mrPermission) + { + CreateOrUpdateAndroidPermissionData("com.picovr.permission.SPATIAL_DATA"); + } + else + { + DeleteAndroidPermissionData("com.picovr.permission.SPATIAL_DATA"); + } + + CreateOrUpdateAndroidMetaData("pvr.app.splash", PICOProjectSetting.GetProjectConfig().GetSystemSplashScreen(path)); + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOModifyAndroidManifest.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOModifyAndroidManifest.cs.meta new file mode 100644 index 0000000..e75d43f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/PICOModifyAndroidManifest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d81cf8af565abea45b00eecb77ab4a3e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/Unity.XR.OpenXR.Features.PICOSupport.Editor.asmdef b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/Unity.XR.OpenXR.Features.PICOSupport.Editor.asmdef new file mode 100644 index 0000000..0d2b512 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/Unity.XR.OpenXR.Features.PICOSupport.Editor.asmdef @@ -0,0 +1,26 @@ +{ + "name": "Unity.XR.OpenXR.Features.PICOSupport.Editor", + "rootNamespace": "", + "references": [ + "GUID:96aa6ba065960476598f8f643e7252b6", + "GUID:4847341ff46394e83bb78fbd0652937e", + "GUID:d1451cc2aec4ed743adcac8be3b46381" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.xr.arfoundation", + "expression": "5.1.2", + "define": "AR_FOUNDATION" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/Unity.XR.OpenXR.Features.PICOSupport.Editor.asmdef.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/Unity.XR.OpenXR.Features.PICOSupport.Editor.asmdef.meta new file mode 100644 index 0000000..e6747d5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Editor/Unity.XR.OpenXR.Features.PICOSupport.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: dfc9a0c467fa3854eb85cf2dcdebef5d +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise.meta new file mode 100644 index 0000000..edc8b3a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c84e1f5b048136144a957941625d34e7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/PICOXR.TobSupport.asmdef b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/PICOXR.TobSupport.asmdef new file mode 100644 index 0000000..acdbeeb --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/PICOXR.TobSupport.asmdef @@ -0,0 +1,25 @@ +{ + "name": "PICO.TobSupport", + "references": [ + "Unity.XR.PICO.Editor", + "Unity.XR.PICO", + "Unity.XR.OpenXR.Features.PICOSupport.Editor", + "Unity.XR.OpenXR.Features.PICOSupport", + "Unity.XR.OpenXR" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.xr.picoxr", + "expression": "2.3.3", + "define": "PICO_XR" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/PICOXR.TobSupport.asmdef.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/PICOXR.TobSupport.asmdef.meta new file mode 100644 index 0000000..36aba8a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/PICOXR.TobSupport.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f34d393b8d26cb44d9a77c73186b30d0 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts.meta new file mode 100644 index 0000000..3c622dd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3d50237881bc77e4087171150691c3a1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums.meta new file mode 100644 index 0000000..13af666 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 865e330f2b0cd4141ab4a4153d535675 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerKeyEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerKeyEnum.cs new file mode 100644 index 0000000..a057b54 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerKeyEnum.cs @@ -0,0 +1,18 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum ControllerKeyEnum + { + CONTROLLER_KEY_JOYSTICK=0, + CONTROLLER_KEY_MENU=1, + CONTROLLER_KEY_TRIGGER=2, + CONTROLLER_KEY_RIGHT_A=3, + CONTROLLER_KEY_RIGHT_B=4, + CONTROLLER_KEY_LEFT_X=5, + CONTROLLER_KEY_LEFT_Y=6, + CONTROLLER_KEY_LEFT_GRIP=7, + CONTROLLER_KEY_RIGHT_GRIP=8, + CONTROLLER_KEY_VOLUME_DOWN=9, + CONTROLLER_KEY_VOLUME_UP=10, + CONTROLLER_KEY_CLICK=11 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerKeyEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerKeyEnum.cs.meta new file mode 100644 index 0000000..8b15a17 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerKeyEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 71820ab70affcbd4faa8707df25e1725 +timeCreated: 1685945465 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerPairTimeEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerPairTimeEnum.cs new file mode 100644 index 0000000..8f1ba69 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerPairTimeEnum.cs @@ -0,0 +1,12 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum ControllerPairTimeEnum + { + DEFAULT=0, + FIFTEEN=15, + SIXTY=60, + ONE_HUNDRED_AND_TWENTY=120, + SIX_HUNDRED=600, + NEVER=-1 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerPairTimeEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerPairTimeEnum.cs.meta new file mode 100644 index 0000000..e35ae15 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ControllerPairTimeEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 88ffdfff23fd922469ae84af0a209731 +timeCreated: 1685943806 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/CustomizeSettingsTabEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/CustomizeSettingsTabEnum.cs new file mode 100644 index 0000000..202ffca --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/CustomizeSettingsTabEnum.cs @@ -0,0 +1,13 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum CustomizeSettingsTabEnum + { + CUSTOMIZE_SETTINGS_TAB_WLAN = 0, + CUSTOMIZE_SETTINGS_TAB_CONTROLLER = 1, + CUSTOMIZE_SETTINGS_TAB_BLUETOOTH = 2, + CUSTOMIZE_SETTINGS_TAB_DISPLAY = 3, + CUSTOMIZE_SETTINGS_TAB_LAB = 4, + CUSTOMIZE_SETTINGS_TAB_GENERAL_LOCKSCREEN = 5, + CUSTOMIZE_SETTINGS_TAB_GENERAL_FACTORY_RESET = 6 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/CustomizeSettingsTabEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/CustomizeSettingsTabEnum.cs.meta new file mode 100644 index 0000000..049ce2b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/CustomizeSettingsTabEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f2714615e3a23d9449fdf19cdf584b48 +timeCreated: 1685945379 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/DeviceControlEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/DeviceControlEnum.cs new file mode 100644 index 0000000..ed1cea3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/DeviceControlEnum.cs @@ -0,0 +1,8 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum DeviceControlEnum + { + DEVICE_CONTROL_REBOOT=0, + DEVICE_CONTROL_SHUTDOWN=1 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/DeviceControlEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/DeviceControlEnum.cs.meta new file mode 100644 index 0000000..1d1b593 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/DeviceControlEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9cfd7333ed47ab44a874e4fe98c1c08d +timeCreated: 1685937183 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeEventEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeEventEnum.cs new file mode 100644 index 0000000..3863bab --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeEventEnum.cs @@ -0,0 +1,18 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum HomeEventEnum + { + SINGLE_CLICK=0, + DOUBLE_CLICK=1, + LONG_PRESS=2, + SINGLE_CLICK_RIGHT_CTL=3, + DOUBLE_CLICK_RIGHT_CTL=4, + LONG_PRESS_RIGHT_CTL=5, + SINGLE_CLICK_LEFT_CTL=6, + DOUBLE_CLICK_LEFT_CTL=7, + LONG_PRESS_LEFT_CTL=8, + SINGLE_CLICK_HMD=9, + DOUBLE_CLICK_HMD=10, + LONG_PRESS_HMD=11 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeEventEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeEventEnum.cs.meta new file mode 100644 index 0000000..a4e5d81 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeEventEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 599cdfc907c46d6488436b1622eafd50 +timeCreated: 1685937306 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeFunctionEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeFunctionEnum.cs new file mode 100644 index 0000000..9dd934e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeFunctionEnum.cs @@ -0,0 +1,17 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum HomeFunctionEnum + { + VALUE_HOME_GO_TO_SETTING=0, + VALUE_HOME_BACK=1, + VALUE_HOME_RECENTER=2, + VALUE_HOME_OPEN_APP=3, + VALUE_HOME_DISABLE=4, + VALUE_HOME_GO_TO_HOME=5, + VALUE_HOME_SEND_BROADCAST=6, + VALUE_HOME_CLEAN_MEMORY=7, + VALUE_HOME_QUICK_SETTING=8, + VALUE_HOME_SCREEN_CAP=9, + VALUE_HOME_SCREEN_RECORD=10 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeFunctionEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeFunctionEnum.cs.meta new file mode 100644 index 0000000..635f048 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/HomeFunctionEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6effac1077bec9348aaf4f68c8787e7f +timeCreated: 1685937603 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionOrStatusEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionOrStatusEnum.cs new file mode 100644 index 0000000..2330107 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionOrStatusEnum.cs @@ -0,0 +1,10 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum PICOCastOptionOrStatusEnum + { + OPTION_RESOLUTION_LEVEL=0, + OPTION_BITRATE_LEVEL=1, + OPTION_AUDIO_ENABLE=2, + PICO_CAST_STATUS=3 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionOrStatusEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionOrStatusEnum.cs.meta new file mode 100644 index 0000000..560d170 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionOrStatusEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: aab97c5d20f1fe940beb18a3fe308e46 +timeCreated: 1685945051 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionValueEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionValueEnum.cs new file mode 100644 index 0000000..312f5dd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionValueEnum.cs @@ -0,0 +1,22 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum PICOCastOptionValueEnum + { + OPTION_VALUE_RESOLUTION_HIGH, + OPTION_VALUE_RESOLUTION_MIDDLE, + OPTION_VALUE_RESOLUTION_AUTO, + OPTION_VALUE_RESOLUTION_HIGH_2K, + OPTION_VALUE_RESOLUTION_HIGH_4K, + + OPTION_VALUE_BITRATE_HIGH, + OPTION_VALUE_BITRATE_MIDDLE, + OPTION_VALUE_BITRATE_LOW, + + OPTION_VALUE_AUDIO_ON, + OPTION_VALUE_AUDIO_OFF, + + STATUS_VALUE_STATE_STARTED, + STATUS_VALUE_STATE_STOPPED, + STATUS_VALUE_ERROR + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionValueEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionValueEnum.cs.meta new file mode 100644 index 0000000..0a4bfc8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastOptionValueEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1de348b2dfe662e4b9053c101bbda4fa +timeCreated: 1685945106 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastUrlTypeEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastUrlTypeEnum.cs new file mode 100644 index 0000000..63a0c3d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastUrlTypeEnum.cs @@ -0,0 +1,9 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum PICOCastUrlTypeEnum + { + NORMAL_URL=0, + NO_CONFIRM_URL=1, + RTMP_URL=2 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastUrlTypeEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastUrlTypeEnum.cs.meta new file mode 100644 index 0000000..10c2ccf --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PICOCastUrlTypeEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1d04bb6dfca248143bdd812fb00ea7b2 +timeCreated: 1685944504 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PackageControlEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PackageControlEnum.cs new file mode 100644 index 0000000..031521a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PackageControlEnum.cs @@ -0,0 +1,8 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum PackageControlEnum + { + PACKAGE_SILENCE_INSTALL=0, + PACKAGE_SILENCE_UNINSTALL=1 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PackageControlEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PackageControlEnum.cs.meta new file mode 100644 index 0000000..6bbd616 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PackageControlEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f9508b93fb3d76f49ae71ad9e3d679f9 +timeCreated: 1685937232 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PicoCastMediaFormat.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PicoCastMediaFormat.cs new file mode 100644 index 0000000..99bc0e5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PicoCastMediaFormat.cs @@ -0,0 +1,7 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public class PicoCastMediaFormat + { + public int bitrate = -1;//kb + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PicoCastMediaFormat.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PicoCastMediaFormat.cs.meta new file mode 100644 index 0000000..db577b7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PicoCastMediaFormat.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8eca65ab8e7e4984a8415528a35a2f3d +timeCreated: 1686223794 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PoseErrorTypeEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PoseErrorTypeEnum.cs new file mode 100644 index 0000000..32c59d1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PoseErrorTypeEnum.cs @@ -0,0 +1,20 @@ +using System; +using System.Runtime.InteropServices; + +namespace Unity.XR.PICO.TOBSupport +{ + public enum PoseErrorType + { + BRIGHT_LIGHT_ERROR = (1 << 0), + LOW_LIGHT_ERROR = (1 << 1), + LOW_FEATURE_COUNT_ERROR = (1 << 2), + CAMERA_CALIBRATION_ERROR = (1 << 3), + RELOCATION_IN_PROGRESS = (1 << 4), + INITILIZATION_IN_PROGRESS = (1 << 5), + NO_CAMERA_ERROR = (1 << 6), + NO_IMU_ERROR = (1 << 7), + IMU_JITTER_ERROR = (1 << 8), + UNKNOWN_ERROR = (1 << 9) + }; + +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PoseErrorTypeEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PoseErrorTypeEnum.cs.meta new file mode 100644 index 0000000..4c41c43 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PoseErrorTypeEnum.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 46bdaa338aeb42e4c813168706e540f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PowerOnOffLogoEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PowerOnOffLogoEnum.cs new file mode 100644 index 0000000..3af59cd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PowerOnOffLogoEnum.cs @@ -0,0 +1,9 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum PowerOnOffLogoEnum + { + PLPowerOnLogo=0, + PLPowerOnAnimation=1, + PLPowerOffAnimation=2 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PowerOnOffLogoEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PowerOnOffLogoEnum.cs.meta new file mode 100644 index 0000000..1c735d3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/PowerOnOffLogoEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f7e0adfb5b4e8e342ad0fa15263e54ca +timeCreated: 1685945676 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreenOffDelayTimeEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreenOffDelayTimeEnum.cs new file mode 100644 index 0000000..01fe7d1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreenOffDelayTimeEnum.cs @@ -0,0 +1,13 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum ScreenOffDelayTimeEnum + { + THREE, + TEN , + THIRTY , + SIXTY, + THREE_HUNDRED, + SIX_HUNDRED , + NEVER + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreenOffDelayTimeEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreenOffDelayTimeEnum.cs.meta new file mode 100644 index 0000000..2964be2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreenOffDelayTimeEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 22e9ab23329ae354097af770cf179472 +timeCreated: 1685943725 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreencastAudioOutputEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreencastAudioOutputEnum.cs new file mode 100644 index 0000000..def253e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreencastAudioOutputEnum.cs @@ -0,0 +1,10 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum ScreencastAudioOutputEnum + { + AUDIO_ERROR=0, + AUDIO_SINK = 1, + AUDIO_TARGET = 2, + AUDIO_SINK_TARGET = 3, + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreencastAudioOutputEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreencastAudioOutputEnum.cs.meta new file mode 100644 index 0000000..e955fe4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/ScreencastAudioOutputEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d484897b4d6e06b4281b6e25e222c723 +timeCreated: 1685945230 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SleepDelayTimeEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SleepDelayTimeEnum.cs new file mode 100644 index 0000000..1484096 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SleepDelayTimeEnum.cs @@ -0,0 +1,13 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum SleepDelayTimeEnum + { + FIFTEEN , + THIRTY , + SIXTY , + THREE_HUNDRED , + SIX_HUNDRED , + ONE_THOUSAND_AND_EIGHT_HUNDRED , + NEVER + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SleepDelayTimeEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SleepDelayTimeEnum.cs.meta new file mode 100644 index 0000000..4373976 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SleepDelayTimeEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ca0a63d4310322847a9569df3fb34d4a +timeCreated: 1685943762 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/StartVRSettingsEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/StartVRSettingsEnum.cs new file mode 100644 index 0000000..3a08071 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/StartVRSettingsEnum.cs @@ -0,0 +1,13 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum StartVRSettingsEnum + { + START_VR_SETTINGS_ITEM_WIFI=0, + START_VR_SETTINGS_ITEM_BLUETOOT=1, + START_VR_SETTINGS_ITEM_CONTROLLER=2, + START_VR_SETTINGS_ITEM_LAB=3, + START_VR_SETTINGS_ITEM_BRIGHTNESS=4, + START_VR_SETTINGS_ITEM_GENERAL=5, + START_VR_SETTINGS_ITEM_NOTIFICATION=6 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/StartVRSettingsEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/StartVRSettingsEnum.cs.meta new file mode 100644 index 0000000..b6076e9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/StartVRSettingsEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 47b4eb0018f80d5428bed27d2e7f69bf +timeCreated: 1685944404 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SwitchEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SwitchEnum.cs new file mode 100644 index 0000000..b43d8fa --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SwitchEnum.cs @@ -0,0 +1,8 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum SwitchEnum + { + S_ON=0, + S_OFF=1 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SwitchEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SwitchEnum.cs.meta new file mode 100644 index 0000000..bd54909 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SwitchEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ef3b88f2e4c726543b34bbb0f0aca35f +timeCreated: 1685937261 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemFunctionSwitchEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemFunctionSwitchEnum.cs new file mode 100644 index 0000000..5cdc814 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemFunctionSwitchEnum.cs @@ -0,0 +1,66 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum SystemFunctionSwitchEnum + { + SFS_USB=0, + SFS_AUTOSLEEP=1, + SFS_SCREENON_CHARGING=2, + SFS_OTG_CHARGING=3, + SFS_RETURN_MENU_IN_2DMODE=4, + SFS_COMBINATION_KEY=5, + SFS_CALIBRATION_WITH_POWER_ON=6, + SFS_SYSTEM_UPDATE=7, + SFS_CAST_SERVICE=8, + SFS_EYE_PROTECTION=9, + SFS_SECURITY_ZONE_PERMANENTLY=10, + SFS_GLOBAL_CALIBRATION=11, + SFS_Auto_Calibration=12, + SFS_USB_BOOT=13, + SFS_VOLUME_UI=14, + SFS_CONTROLLER_UI=15, + SFS_NAVGATION_SWITCH=16, + SFS_SHORTCUT_SHOW_RECORD_UI=17, + SFS_SHORTCUT_SHOW_FIT_UI=18, + SFS_SHORTCUT_SHOW_CAST_UI=19, + SFS_SHORTCUT_SHOW_CAPTURE_UI=20, + SFS_STOP_MEM_INFO_SERVICE=21, + SFS_START_APP_BOOT_COMPLETED=22, + SFS_USB_FORCE_HOST=23, + SFS_SET_DEFAULT_SAFETY_ZONE=24, + SFS_ALLOW_RESET_BOUNDARY=25, + SFS_BOUNDARY_CONFIRMATION_SCREEN=26, + SFS_LONG_PRESS_HOME_TO_RECENTER=27, + SFS_POWER_CTRL_WIFI_ENABLE=28, + SFS_WIFI_DISABLE=29, + SFS_SIX_DOF_SWITCH=30, + SFS_INVERSE_DISPERSION=31, + SFS_LOGCAT=32, + SFS_PSENSOR=33, + SFS_SYSTEM_UPDATE_OTA=34, + SFS_SYSTEM_UPDATE_APP=35, + SFS_SHORTCUT_SHOW_WLAN_UI=36, + SFS_SHORTCUT_SHOW_BOUNDARY_UI=37, + SFS_SHORTCUT_SHOW_BLUETOOTH_UI=38, + SFS_SHORTCUT_SHOW_CLEAN_TASK_UI=39, + SFS_SHORTCUT_SHOW_IPD_ADJUSTMENT_UI=40, + SFS_SHORTCUT_SHOW_POWER_UI=41, + SFS_SHORTCUT_SHOW_EDIT_UI=42, + SFS_BASIC_SETTING_APP_LIBRARY_UI=43, + SFS_BASIC_SETTING_SHORTCUT_UI=44, + SFS_LED_FLASHING_WHEN_SCREEN_OFF=45, + SFS_BASIC_SETTING_CUSTOMIZE_SETTING_UI=46, + SFS_BASIC_SETTING_SHOW_APP_QUIT_CONFIRM_DIALOG=47, + SFS_BASIC_SETTING_KILL_BACKGROUND_VR_APP=48, + SFS_BASIC_SETTING_SHOW_CAST_NOTIFICATION=49, + SFS_AUTOMATIC_IPD=50, + SFS_QUICK_SEETHROUGH_MODE=51, + SFS_HIGN_REFERSH_MODE=52, + SFS_SEETHROUGH_APP_KEEP_RUNNING=53, + SFS_OUTDOOR_TRACKING_ENHANCEMENT=54, + SFS_AUTOIPD_AUTO_COMFIRM=55, + SFS_LAUNCH_AUTOIPD_IF_GLASSES_WEARED=56, + SFS_GESTURE_RECOGNITION_HOME_ENABLE=57, + SFS_GESTURE_RECOGNITION_RESET_ENABLE=58, + SFS_AUTO_COPY_FILES_FROM_USB_DEVICE=59 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemFunctionSwitchEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemFunctionSwitchEnum.cs.meta new file mode 100644 index 0000000..336f0a7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemFunctionSwitchEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d478586fa3b0236429ce81bab6f48957 +timeCreated: 1685943877 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemInfoEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemInfoEnum.cs new file mode 100644 index 0000000..f1a2275 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemInfoEnum.cs @@ -0,0 +1,20 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum SystemInfoEnum + { + ELECTRIC_QUANTITY=0, + PUI_VERSION=1, + EQUIPMENT_MODEL=2, + EQUIPMENT_SN=3, + CUSTOMER_SN=4, + INTERNAL_STORAGE_SPACE_OF_THE_DEVICE=5, + DEVICE_BLUETOOTH_STATUS=6, + BLUETOOTH_NAME_CONNECTED=7, + BLUETOOTH_MAC_ADDRESS=8, + DEVICE_WIFI_STATUS=9, + WIFI_NAME_CONNECTED=10, + WLAN_MAC_ADDRESS=11, + DEVICE_IP=12, + CHARGING_STATUS=13 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemInfoEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemInfoEnum.cs.meta new file mode 100644 index 0000000..f6390c0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/SystemInfoEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1fb47fac324da0244b89e5cba9b606db +timeCreated: 1685937098 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/USBConfigModeEnum.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/USBConfigModeEnum.cs new file mode 100644 index 0000000..5f8284c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/USBConfigModeEnum.cs @@ -0,0 +1,8 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public enum USBConfigModeEnum + { + MTP=0, + CHARGE=1 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/USBConfigModeEnum.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/USBConfigModeEnum.cs.meta new file mode 100644 index 0000000..70b7e53 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Enums/USBConfigModeEnum.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 83c4de97e8bbda3448a5180986a87c33 +timeCreated: 1685944441 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces.meta new file mode 100644 index 0000000..3a3d17f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c5c24af23d2b3de43bf3444f7edca288 +timeCreated: 1685952511 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BindCallback.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BindCallback.cs new file mode 100644 index 0000000..b22332c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BindCallback.cs @@ -0,0 +1,28 @@ +using System; +using UnityEngine; + +namespace Unity.XR.PICO.TOBSupport +{ + public class BindCallback : AndroidJavaProxy + { + public Action mCallback; + + public BindCallback(Action callback) : base("com.picoxr.tobservice.interfaces.BoolCallback") + { + mCallback = callback; + } + + public void CallBack(bool var1) + { + Debug.Log("ToBService bindCallBack 回调:" + var1); + PXR_EnterprisePlugin.GetServiceBinder(); + PXR_EnterpriseTools.QueueOnMainThread(() => + { + if (mCallback != null) + { + mCallback(var1); + } + }); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BindCallback.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BindCallback.cs.meta new file mode 100644 index 0000000..dcbee72 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BindCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 51a5199660b7a714aae526c9e8ecf42e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BoolCallback.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BoolCallback.cs new file mode 100644 index 0000000..da1fbf2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BoolCallback.cs @@ -0,0 +1,26 @@ +using System; +using UnityEngine; + +namespace Unity.XR.PICO.TOBSupport +{ + public class BoolCallback : AndroidJavaProxy + { + public Action mCallback; + + public BoolCallback(Action callback) : base("com.picoxr.tobservice.interfaces.BoolCallback") + { + mCallback = callback; + } + + public void CallBack(bool var1) + { + PXR_EnterpriseTools.QueueOnMainThread(() => + { + if (mCallback!=null) + { + mCallback(var1); + } + }); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BoolCallback.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BoolCallback.cs.meta new file mode 100644 index 0000000..7dff9e1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/BoolCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4ec069c2f433a8649af361d7ff835006 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/FileCopyCallback.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/FileCopyCallback.cs new file mode 100644 index 0000000..080cccb --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/FileCopyCallback.cs @@ -0,0 +1,50 @@ +using System; +using UnityEngine; + +namespace Unity.XR.PICO.TOBSupport +{ + public class FileCopyCallback: AndroidJavaProxy + { + public Action mOnCopyStart; + public Action mOnCopyProgress; + public Action mOnCopyFinish; + + public FileCopyCallback(Action onCopyStart,Action onCopyProgress,Action onCopyFinish) : base("com.picoxr.tobservice.interfaces.FileCopyCallback") + { + mOnCopyStart = onCopyStart; + mOnCopyProgress = onCopyProgress; + mOnCopyFinish = onCopyFinish; + } + + public void OnCopyStart() + { + PXR_EnterpriseTools.QueueOnMainThread(() => + { + if (mOnCopyStart!=null) + { + mOnCopyStart(); + } + }); + } + public void OnCopyProgress(double var1) + { + PXR_EnterpriseTools.QueueOnMainThread(() => + { + if (mOnCopyProgress!=null) + { + mOnCopyProgress(var1); + } + }); + } + public void OnCopyFinish(int var1) + { + PXR_EnterpriseTools.QueueOnMainThread(() => + { + if (mOnCopyFinish!=null) + { + mOnCopyFinish(var1); + } + }); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/FileCopyCallback.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/FileCopyCallback.cs.meta new file mode 100644 index 0000000..eec7912 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/FileCopyCallback.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3f1ff22a32748af4ebc61fc3e215b7c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/IntCallback.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/IntCallback.cs new file mode 100644 index 0000000..edbf1dc --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/IntCallback.cs @@ -0,0 +1,26 @@ +using System; +using UnityEngine; + +namespace Unity.XR.PICO.TOBSupport +{ + public class IntCallback : AndroidJavaProxy + { + public Action mCallback; + + public IntCallback(Action callback) : base("com.picoxr.tobservice.interfaces.IntCallback") + { + mCallback = callback; + } + + public void CallBack(int var1) + { + PXR_EnterpriseTools.QueueOnMainThread(() => + { + if (mCallback != null) + { + mCallback(var1); + } + }); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/IntCallback.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/IntCallback.cs.meta new file mode 100644 index 0000000..5354dd7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/IntCallback.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 96277bb913de2a84e8f29f38fbdc9f29 +timeCreated: 1685959032 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/LongCallback.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/LongCallback.cs new file mode 100644 index 0000000..2463ec3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/LongCallback.cs @@ -0,0 +1,26 @@ +using System; +using UnityEngine; + +namespace Unity.XR.PICO.TOBSupport +{ + public class LongCallback : AndroidJavaProxy + { + public Action mCallback; + + public LongCallback(Action callback) : base("com.picoxr.tobservice.interfaces.LongCallback") + { + mCallback = callback; + } + + public void CallBack(long var1) + { + PXR_EnterpriseTools.QueueOnMainThread(() => + { + if (mCallback != null) + { + mCallback(var1); + } + }); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/LongCallback.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/LongCallback.cs.meta new file mode 100644 index 0000000..a6e02fa --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/LongCallback.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: be7c175a931c58d43adc4dfd8b4919a2 +timeCreated: 1685959096 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/MarkerInfoCallback.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/MarkerInfoCallback.cs new file mode 100644 index 0000000..f9172b3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/MarkerInfoCallback.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using LitJson; +using UnityEngine; +using UnityEngine.XR; +#if PICO_XR +using Unity.XR.PXR; +#else +using Unity.XR.OpenXR.Features.PICOSupport; +#endif + +namespace Unity.XR.PICO.TOBSupport +{ + public class MarkerInfoCallback : AndroidJavaProxy + { + public Action> mCallback; + private List mlist = new List(); + private TrackingOriginModeFlags TrackingMode; + private float YOffset; + + public MarkerInfoCallback(TrackingOriginModeFlags trackingMode, float cameraYOffset, + Action> callback) : base("com.picoxr.tobservice.interfaces.StringCallback") + { + TrackingMode = trackingMode; + YOffset = cameraYOffset; + mCallback = callback; + mlist.Clear(); +#if PICO_XR +#else + OpenXRExtensions.SetMarkMode(); +#endif + } + + public void CallBack(string var1) + { + Debug.Log("ToBService MarkerInfo Callback 回调:" + var1); + List tmp = JsonToMarkerInfos(var1); + PXR_EnterpriseTools.QueueOnMainThread(() => + { + if (mCallback != null) + { + mCallback(tmp); + } + }); + } + + public List JsonToMarkerInfos(string json) + { + if (string.IsNullOrEmpty(json)) + { + return null; + } + + List ModelList = new List(); + JsonData jsonData = JsonMapper.ToObject(json); + IDictionary dictionary = jsonData as IDictionary; + for (int i = 0; i < dictionary.Count; i++) + { + Debug.Log("TOB TestDemo---- MarkerInfo Callback 回调:1"); + + float OriginHeight = 0; + if (TrackingMode == TrackingOriginModeFlags.Device || TrackingMode == TrackingOriginModeFlags.Floor) + { + +#if PICO_XR + OriginHeight = PXR_Plugin.System.UPxr_GetConfigFloat(ConfigType.ToDelaSensorY); +#else + float trackingorigin_height = PXR_EnterprisePlugin.oxr_get_trackingorigin_height(); + float locationheight = OpenXRExtensions.GetLocationHeight(); + if (TrackingMode == TrackingOriginModeFlags.Floor) + { + YOffset = 0; + OriginHeight = -trackingorigin_height; + } + else + { + // OriginHeight = trackingorigin_height + locationheight; + // OriginHeight = locationheight; + OriginHeight = -trackingorigin_height; + } +#endif + } + else + { + OriginHeight = 0; + YOffset = 0; + } + + Debug.Log("TOB TestDemo---- MarkerInfo Callback 回调:OriginHeight:"+OriginHeight ); + MarkerInfo model = new MarkerInfo(); + model.posX = double.Parse(jsonData[i]["posX"].ToString()); + model.posY = double.Parse(jsonData[i]["posY"].ToString()) + OriginHeight + YOffset; + model.posZ = -double.Parse(jsonData[i]["posZ"].ToString()); + + model.rotationX = -double.Parse(jsonData[i]["rotationX"].ToString()); + model.rotationY = -double.Parse(jsonData[i]["rotationY"].ToString()); + model.rotationZ = double.Parse(jsonData[i]["rotationZ"].ToString()); + model.rotationW = double.Parse(jsonData[i]["rotationW"].ToString()); + + model.validFlag = int.Parse(jsonData[i]["validFlag"].ToString()); + model.markerType = int.Parse(jsonData[i]["markerType"].ToString()); + model.iMarkerId = int.Parse(jsonData[i]["iMarkerId"].ToString()); + model.dTimestamp = double.Parse(jsonData[i]["dTimestamp"].ToString()); + + IDictionary dictionaryReserve = jsonData[i]["reserve"] as IDictionary; + model.reserve = new float[dictionaryReserve.Count]; + for (int j = 0; j < dictionaryReserve.Count; j++) + { + model.reserve[j] = float.Parse(jsonData[i]["reserve"][j].ToString()); + } + + ModelList.Add(model); + } + + return ModelList; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/MarkerInfoCallback.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/MarkerInfoCallback.cs.meta new file mode 100644 index 0000000..e6121a8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/MarkerInfoCallback.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0f3dd52fe57c0fc4490989b3e1841b24 +timeCreated: 1686224891 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/StringCallback.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/StringCallback.cs new file mode 100644 index 0000000..b577e71 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/StringCallback.cs @@ -0,0 +1,26 @@ +using System; +using UnityEngine; + +namespace Unity.XR.PICO.TOBSupport +{ + public class StringCallback : AndroidJavaProxy + { + public Action mCallback; + + public StringCallback(Action callback) : base("com.picoxr.tobservice.interfaces.StringCallback") + { + mCallback = callback; + } + + public void CallBack(string var1) + { + PXR_EnterpriseTools.QueueOnMainThread(() => + { + if (mCallback != null) + { + mCallback(var1); + } + }); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/StringCallback.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/StringCallback.cs.meta new file mode 100644 index 0000000..67a621b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/StringCallback.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0032579f19172484ebd2e85a16a8194d +timeCreated: 1685959143 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/WifiDisplayModelCallback.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/WifiDisplayModelCallback.cs new file mode 100644 index 0000000..57d4e29 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/WifiDisplayModelCallback.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using LitJson; +using UnityEngine; + +namespace Unity.XR.PICO.TOBSupport +{ + public class WifiDisplayModelCallback : AndroidJavaProxy + { + public Action> mCallback; + + public WifiDisplayModelCallback(Action> callback) : base("com.picoxr.tobservice.interfaces.StringCallback") + { + mCallback = callback; + } + + public void CallBack(string var1) + { + Debug.Log("ToBService WifiDisplayModelCallback 回调:" + var1); + List tmp = JsonToWifiDisplayModel(var1); + PXR_EnterpriseTools.QueueOnMainThread(() => + { + if (mCallback != null) + { + mCallback(tmp); + } + }); + } + + public List JsonToWifiDisplayModel(string json) + { + if (string.IsNullOrEmpty(json)) + { + return null; + } + + List ModelList = new List(); + JsonData jsonData = JsonMapper.ToObject(json); + IDictionary dictionary = jsonData as IDictionary; + for (int i = 0; i < dictionary.Count; i++) + { + WifiDisplayModel model = new WifiDisplayModel(); + model.deviceAddress = jsonData[i]["deviceAddress"].ToString(); + model.deviceName = jsonData[i]["deviceName"].ToString(); + model.isAvailable = bool.Parse(jsonData[i]["isAvailable"].ToString()); + model.canConnect = bool.Parse(jsonData[i]["canConnect"].ToString()); + model.isRemembered = bool.Parse(jsonData[i]["isRemembered"].ToString()); + model.statusCode = int.Parse(jsonData[i]["statusCode"].ToString()); + model.status = jsonData[i]["status"].ToString(); + model.description = jsonData[i]["description"].ToString(); + + ModelList.Add(model); + } + + return ModelList; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/WifiDisplayModelCallback.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/WifiDisplayModelCallback.cs.meta new file mode 100644 index 0000000..268cf47 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Interfaces/WifiDisplayModelCallback.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6cf02f2e31d415c41b26dd8e5108dada +timeCreated: 1686050869 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model.meta new file mode 100644 index 0000000..ac5555a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1f65db304235e324c898720b2c3f4ce1 +timeCreated: 1686224723 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/MarkerInfo.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/MarkerInfo.cs new file mode 100644 index 0000000..ef5f6fd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/MarkerInfo.cs @@ -0,0 +1,38 @@ +using System.Linq; + +namespace Unity.XR.PICO.TOBSupport +{ + public class MarkerInfo + { + // position + public double posX; + public double posY; + public double posZ; + + // rotation + public double rotationX; + public double rotationY; + public double rotationZ; + public double rotationW; + + // 标志位:识别无效=0,识别有效=1 + public int validFlag; + + // 类型:静态=1/动态=0 + public int markerType; + + // marker id + public int iMarkerId; + + // 检测图像的时间戳 + public double dTimestamp; + + // 预留标志位 + public float[] reserve; + + public override string ToString() + { + return $"{nameof(posX)}: {posX}, {nameof(posY)}: {posY}, {nameof(posZ)}: {posZ}, {nameof(rotationX)}: {rotationX}, {nameof(rotationY)}: {rotationY}, {nameof(rotationZ)}: {rotationZ}, {nameof(rotationW)}: {rotationW}, {nameof(validFlag)}: {validFlag}, {nameof(markerType)}: {markerType}, {nameof(iMarkerId)}: {iMarkerId}, {nameof(dTimestamp)}: {dTimestamp}, {nameof(reserve)}: {string.Join(" ", reserve)}"; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/MarkerInfo.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/MarkerInfo.cs.meta new file mode 100644 index 0000000..49b0230 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/MarkerInfo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f68848d9c705ba340a11b2713ae79b83 +timeCreated: 1686224373 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/WifiDisplayModel.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/WifiDisplayModel.cs new file mode 100644 index 0000000..50c39f9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/WifiDisplayModel.cs @@ -0,0 +1,23 @@ +namespace Unity.XR.PICO.TOBSupport +{ + public class WifiDisplayModel + { + public static int STATUS_NOT_CONNECT = -1; + public static int STATUS_NONE = 0; + public static int STATUS_SCANNING = 1; + public static int STATUS_CONNECTING = 2; + public static int STATUS_AVAILABLE = 3; + public static int STATUS_NOT_AVAILABLE = 4; + public static int STATUS_IN_USE = 5; + public static int STATUS_CONNECTED = 6; + + public string deviceAddress; + public string deviceName; + public bool isAvailable; + public bool canConnect; + public bool isRemembered; + public int statusCode; + public string status; + public string description; + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/WifiDisplayModel.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/WifiDisplayModel.cs.meta new file mode 100644 index 0000000..9090523 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Model/WifiDisplayModel.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 39f5fd05aee2d0047932945fab6f46a1 +timeCreated: 1686050281 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/PXR_Enterprise.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/PXR_Enterprise.cs new file mode 100644 index 0000000..82eed57 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/PXR_Enterprise.cs @@ -0,0 +1,2012 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Generic; +using UnityEngine.XR; + +namespace Unity.XR.PICO.TOBSupport +{ + /** + * Enterprise APIs are only supported by enterprise devices, including PICO Neo2, Neo2 Eye, Neo3 Pro、Neo3 Pro Eye, G2 4K/4K E/4K Plus (system version 4.0.3 or later), and PICO 4 Enterprise. + * Do not use them on consumer devices. + */ + public class PXR_Enterprise + { + /// + /// Initializes the enterprise service for a specified object. Must be called before calling other enterprise APIs. + /// + /// Whether the enterprise service has been initialized: + /// * `true`: success + /// * `false`: failure + /// @note OpenXR does not support the returns. The returns belong to EasyAR initialization. + public static bool InitEnterpriseService() + { + PXR_EnterpriseTools.Instance.StartUp(); + bool result = PXR_EnterprisePlugin.UPxr_InitEnterpriseService(); + return result; + } + + /// + /// Binds the enterprise service. Must be called before calling other system related functions. + /// + /// + /// Service-binding result callback that allows for bool values: + /// * `true`: success + /// * `false`: failure + /// If no callback is specified, the parameter will default to null. + /// + public static void BindEnterpriseService(Action callback=null) + { + PXR_EnterprisePlugin.UPxr_BindEnterpriseService(callback); + } + + /// + /// Unbinds the enterprise service. + /// + public static void UnBindEnterpriseService() + { + PXR_EnterprisePlugin.UPxr_UnBindEnterpriseService(); + } + + /// + /// Gets the specified type of device information. + /// + /// The target information type. Enumerations: + /// * `ELECTRIC_QUANTITY`: battery + /// * `PUI_VERSION`: system version + /// * `EQUIPMENT_MODEL`: device model + /// * `EQUIPMENT_SN`: device SN code + /// * `CUSTOMER_SN`: customer SN code + /// * `INTERNAL_STORAGE_SPACE_OF_THE_DEVICE`: device storage + /// * `DEVICE_BLUETOOTH_STATUS`: bluetooth status + /// * `BLUETOOTH_NAME_CONNECTED`: bluetooth name + /// * `BLUETOOTH_MAC_ADDRESS`: bluetooth MAC address + /// * `DEVICE_WIFI_STATUS`: Wi-Fi connection status + /// * `WIFI_NAME_CONNECTED`: connected Wi-Fi name + /// * `WLAN_MAC_ADDRESS`: WLAN MAC address + /// * `DEVICE_IP`: device IP address + /// * `CHARGING_STATUS`: device charging status + /// + /// The specified type of device information. For `CHARGING_STATUS`, an int value will be returned: `2`-charging; `3`-not charging. + public static string StateGetDeviceInfo(SystemInfoEnum type) + { + return PXR_EnterprisePlugin.UPxr_StateGetDeviceInfo(type); + } + + /// + /// Shuts down or reboots the device. + /// @note This is a protected API. You need to add `` + /// to the app's AndroidManifest.xml file for calling this API, after which the app is unable to be published on the PICO Store. + /// + /// Device action. Enumerations: + /// * `DEVICE_CONTROL_REBOOT` + /// * `DEVICE_CONTROL_SHUTDOWN` + /// + /// Callback: + /// * `1`: failed to shut down or reboot the device + /// * `2`: no permission to perform this operation + /// + public static void ControlSetDeviceAction(DeviceControlEnum deviceControl, Action callback) + { + PXR_EnterprisePlugin.UPxr_ControlSetDeviceAction(deviceControl, callback); + } + + /// + /// Installs or uninstalls app silently. + /// @note This is a protected API. You need to add `` + /// to the app's AndroidManifest.xml file for calling this API, after which the app is unable to be published on the PICO Store. + /// + /// The action. Enumerations: + /// * `PACKAGE_SILENCE_INSTALL`: silent installation + /// * `PACKAGE_SILENCE_UNINSTALL`: silent uninstallation + /// + /// The path to the app package for silent installation or the name of the app package for silent uninstallation. + /// Callback: + /// * `0`: success + /// * `1`: failure + /// * `2`: no permission to perform this operation + /// + public static void ControlAPPManager(PackageControlEnum packageControl, string path, Action callback) + { + PXR_EnterprisePlugin.UPxr_ControlAPPManager(packageControl, path, callback); + } + + /// + /// Sets a Wi-Fi that the device is automatically connected to. + /// + /// Wi-Fi name. + /// Wi-Fi password. + /// Callback: + /// * `true`: connected + /// * `false`: failed to connect + /// + public static void ControlSetAutoConnectWIFI(string ssid, string pwd, Action callback) + { + PXR_EnterprisePlugin.UPxr_ControlSetAutoConnectWIFI(ssid, pwd, callback); + } + + /// + /// Removes the Wi-Fi that the device is automatically connected to. + /// + /// Callback: + /// * `true`: removed + /// * `false`: failed to remove + /// + public static void ControlClearAutoConnectWIFI(Action callback) + { + PXR_EnterprisePlugin.UPxr_ControlClearAutoConnectWIFI(callback); + } + + /// + /// Sets the Home button event. + /// + /// Target event. Enumerations: + /// * `SINGLE_CLICK`: single-click + /// * `DOUBLE_CLICK`: double-click + /// * `LONG_PRESS`: long press + /// * `SINGLE_CLICK_RIGHT_CTL`: single-click on the right controller's Home button + /// * `DOUBLE_CLICK_RIGHT_CTL`: double-click on the right controller's Home button + /// * `LONG_PRESS_RIGHT_CTL`: long press on the right controller's Home button + /// * `SINGLE_CLICK_LEFT_CTL`: single-click on the left controller's Home button + /// * `DOUBLE_CLICK_LEFT_CTL`: double-click on the left controller's Home button + /// * `LONG_PRESS_LEFT_CTL`: long press on the left controller's Home button + /// * `SINGLE_CLICK_HMD`: single-click on the HMD's Home button + /// * `DOUBLE_CLICK_HMD`: double-click on the HMD's Home button + /// * `LONG_PRESS_HMD`: long press on the HMD's Home button + /// + /// The function of the event. Enumerations: + /// * `VALUE_HOME_GO_TO_SETTING`: go to Settings + /// * `VALUE_HOME_BACK`: back (only supported by PICO G2 4K) + /// * `VALUE_HOME_RECENTER`: recenter the screen + /// * `VALUE_HOME_OPEN_APP`: open a specified app + /// * `VALUE_HOME_DISABLE`: disable the Home button + /// * `VALUE_HOME_GO_TO_HOME`: open the launcher + /// * `VALUE_HOME_SEND_BROADCAST`: send Home-button-click broadcast + /// * `VALUE_HOME_CLEAN_MEMORY`: clear background apps + /// * `VALUE_HOME_QUICK_SETTING`: enable quick settings + /// * `VALUE_HOME_SCREEN_CAP`: enable screen capture + /// * `VALUE_HOME_SCREEN_RECORD`: enable screen recording + /// + /// Callback: + /// * `true`: success + /// * `false`: failure + /// + public static void PropertySetHomeKey(HomeEventEnum eventEnum, HomeFunctionEnum function, Action callback) + { + PXR_EnterprisePlugin.UPxr_PropertySetHomeKey(eventEnum, function, callback); + } + + /// + /// Sets extended settings for the Home button. + /// + /// Target event. Enumerations: + /// * `SINGLE_CLICK_RIGHT_CTL`: single-click on the right controller's Home button + /// * `DOUBLE_CLICK_RIGHT_CTL`: double-click on the right controller's Home button + /// * `LONG_PRESS_RIGHT_CTL`: long press on the right controller's Home button + /// * `SINGLE_CLICK_LEFT_CTL`: single-click on the left controller's Home button + /// * `DOUBLE_CLICK_LEFT_CTL`: double-click on the left controller's Home button + /// * `LONG_PRESS_LEFT_CTL`: long press on the left controller's Home button + /// * `SINGLE_CLICK_HMD`: single-click on the HMD's Home button + /// * `DOUBLE_CLICK_HMD`: double-click on the HMD's Home button + /// * `LONG_PRESS_HMD`: long press on the HMD's Home button + /// + /// The function of the event. Enumerations: + /// * `VALUE_HOME_GO_TO_SETTING`: go to Settings + /// * `VALUE_HOME_BACK`: back (only supported by PICO G2 4K) + /// * `VALUE_HOME_RECENTER`: recenter the screen + /// * `VALUE_HOME_OPEN_APP`: open a specified app + /// * `VALUE_HOME_DISABLE`: disable the Home button + /// * `VALUE_HOME_GO_TO_HOME`: open the launcher + /// * `VALUE_HOME_SEND_BROADCAST`: send Home-key-click broadcast + /// * `VALUE_HOME_CLEAN_MEMORY`: clear background apps + /// * `VALUE_HOME_QUICK_SETTING`: enable quick settings + /// * `VALUE_HOME_SCREEN_CAP`: enable screen capture + /// * `VALUE_HOME_SCREEN_RECORD`: enable screen recording + /// + /// The interval of key pressing is set only if there is the double click event or long pressing event. When shortly pressing the Home button, pass `0`. + /// Pass `null`. + /// Pass `null`. + /// Callback: + /// * `true`: set + /// * `false`: failed to set + /// + public static void PropertySetHomeKeyAll(HomeEventEnum eventEnum, HomeFunctionEnum function, int timesetup, string pkg, string className, Action callback) + { + PXR_EnterprisePlugin.UPxr_PropertySetHomeKeyAll(eventEnum, function, timesetup, pkg, className, callback); + } + + /// + /// Sets the Power button's event. + /// + /// Whether it is a single click event: + /// * `true`: single-click event + /// * `false`: long-press event + /// + /// Enable or disable the Power button: + /// * `true`: enable + /// * `false`: disable + /// + /// Callback: + /// * `0`: set + /// * `1`: failed to set + /// + public static void PropertyDisablePowerKey(bool isSingleTap, bool enable, Action callback) + { + PXR_EnterprisePlugin.UPxr_PropertyDisablePowerKey(isSingleTap, enable, callback); + } + + /// + /// Sets the time the screen turns off when the device is not in use. + /// + /// Screen off timeout. Enumerations: + /// * `Never`: never off + /// * `THREE`: 3s (only supported by PICO G2 4K) + /// * `TEN`: 10s (only supported by PICO G2 4K) + /// * `THIRTY`: 30s + /// * `SIXTY`: 60s + /// * `THREE_HUNDRED`: 5 mins + /// * `SIX_HUNDRED`: 10 mins + /// + /// Callback: + /// * `0`: set + /// * `1`: failed to set + /// * `10`: the screen off timeout should not be longer than the system sleep timeout + /// + public static void PropertySetScreenOffDelay(ScreenOffDelayTimeEnum timeEnum, Action callback) + { + PXR_EnterprisePlugin.UPxr_PropertySetScreenOffDelay(timeEnum, callback); + } + + /// + /// Sets the time the system sleeps when the device is not in use. + /// + /// System sleep timeout. Enumerations: + /// * `Never`: never sleep + /// * `FIFTEEN`: 15s (only supported by PICO G2 4K) + /// * `THIRTY`: 30s (only supported by PICO G2 4K) + /// * `SIXTY`: 60s (only supported by PICO G2 4K) + /// * `THREE_HUNDRED`: 5 mins + /// * `SIX_HUNDRED`: 10 mins + /// * `ONE_THOUSAND_AND_EIGHT_HUNDRED`: 30 mins + /// + public static void PropertySetSleepDelay(SleepDelayTimeEnum timeEnum) + { + PXR_EnterprisePlugin.UPxr_PropertySetSleepDelay(timeEnum); + } + + /// + /// Switches specified system function on/off. + /// + /// Function name. Enumerations: + /// * `SFS_USB`: USB debugging + /// * `SFS_AUTOSLEEP`: auto sleep + /// * `SFS_SCREENON_CHARGING`: screen-on charging + /// * `SFS_OTG_CHARGING`: OTG charging (supported by G2 devices) + /// * `SFS_RETURN_MENU_IN_2DMODE`: display the Return icon on the 2D screen + /// * `SFS_COMBINATION_KEY`: combination key + /// * `SFS_CALIBRATION_WITH_POWER_ON`: calibration with power on + /// * `SFS_SYSTEM_UPDATE`: system update (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_CAST_SERVICE`: phone casting service + /// * `SFS_EYE_PROTECTION`: eye-protection mode + /// * `SFS_SECURITY_ZONE_PERMANENTLY`: permanently disable the 6DoF play area (supported by PICO Neo2 devices) + /// * `SFS_GLOBAL_CALIBRATION`: global calibration (supported by PICO G2 devices) + /// * `SFS_Auto_Calibration`: auto calibration + /// * `SFS_USB_BOOT`: USB plug-in boot + /// * `SFS_VOLUME_UI`: global volume UI (need to restart the device to make the setting take effect) + /// * `SFS_CONTROLLER_UI`: global controller connected UI + /// * `SFS_NAVGATION_SWITCH`: navigation bar + /// * `SFS_SHORTCUT_SHOW_RECORD_UI`: screen recording button UI + /// * `SFS_SHORTCUT_SHOW_FIT_UI`: PICO fit UI + /// * `SFS_SHORTCUT_SHOW_CAST_UI`: screencast button UI + /// * `SFS_SHORTCUT_SHOW_CAPTURE_UI`: screenshot button UI + /// * `SFS_USB_FORCE_HOST`: set the Neo3 Pro/Pro Eye device as the host device + /// * `SFS_SET_DEFAULT_SAFETY_ZONE`: set a default play area for PICO Neo3 and PICO 4 series devices + /// * `SFS_ALLOW_RESET_BOUNDARY`: allow to reset customized boundary for PICO Neo3 series devices + /// * `SFS_BOUNDARY_CONFIRMATION_SCREEN`: whether to display the boundary confirmation screen for PICO Neo3 and PICO 4 series devices + /// * `SFS_LONG_PRESS_HOME_TO_RECENTER`: long press the Home button to recenter for PICO Neo3 and PICO 4 series devices + /// * `SFS_POWER_CTRL_WIFI_ENABLE`: stay connected to the network when the device sleeps/turns off (supported by PICO Neo3 Pro with system version 4.8.0 or later and PICO 4 Enterprise with system version OTA-5.2.8 or later) + /// * `SFS_WIFI_DISABLE`: disable Wi-Fi (supported by PICO Neo3 Pro with system version 4.8.0 or later and PICO 4 Enterprise with system version OTA-5.2.8 or later) + /// * `SFS_SIX_DOF_SWITCH`: 6DoF position tracking for PICO Neo3 and PICO 4 series devices + /// * `SFS_INVERSE_DISPERSION`: anti-dispersion (supported by PICO Neo3 Pro with system version 4.8.0 or later and PICO 4 Enterprise with system version OTA0-5.2.8 or later) + /// * `SFS_LOGCAT`: system log switch (/data/logs) (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_PSENSOR`: PSensor switch (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SYSTEM_UPDATE_OTA`: OTA upgrade (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SYSTEM_UPDATE_APP`: app upgrade and update (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_WLAN_UI`: quickly set whether to show the WLAN button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_BOUNDARY_UI`: quickly set whether to show the boundary button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_BLUETOOTH_UI`: quickly set whether to show the bluetooth button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_CLEAN_TASK_UI`: quickly set whether to show the one-click clear button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_IPD_ADJUSTMENT_UI`: quickly set whether to show the IPD adjustment button (supported by PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_POWER_UI`: quickly set whether to show the power button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_EDIT_UI`: quickly set whether to show the edit button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_BASIC_SETTING_APP_LIBRARY_UI`: the button for customizing the app library (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_BASIC_SETTING_SHORTCUT_UI`: the button for customizing quick settings (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_LED_FLASHING_WHEN_SCREEN_OFF`: whether to keep the LED indicator light on when the device's screen is off and the battery is below 20% (supported by PICO G3 devices) + /// * `SFS_BASIC_SETTING_CUSTOMIZE_SETTING_UI`: customize settings item to show or hide in basic settings + /// * `SFS_BASIC_SETTING_SHOW_APP_QUIT_CONFIRM_DIALOG`: whether to show the app-quit dialog box when switching to a new app + /// * `SFS_BASIC_SETTING_KILL_BACKGROUND_VR_APP`: whether to kill background VR apps (`1`: kill, and this is the default setting; `2`: do not kill) + /// * `SFS_BASIC_SETTING_SHOW_CAST_NOTIFICATION`: whether to show a blue icon when casting the screen. The icon is displayed by default, and you can set the value to `0` to hide it. + /// * `SFS_AUTOMATIC_IPD`: auto IPD switch (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.7.0 or later) + /// * `SFS_QUICK_SEETHROUGH_MODE`: quick seethrough mode switch (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.7.0 or later) + /// * `SFS_HIGN_REFERSH_MODE`: high refresh mode switch (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.7.0 or later) + /// * `SFS_SEETHROUGH_APP_KEEP_RUNNING`: set whether to keep the app running under the seethrough mode (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_OUTDOOR_TRACKING_ENHANCEMENT`: enhance outdoor position tracking (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_AUTOIPD_AUTO_COMFIRM`: quick auto-IPD (supported by PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_LAUNCH_AUTOIPD_IF_GLASSES_WEARED`: set whether to launch auto-IPD after wearing the headset (supported by PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_GESTURE_RECOGNITION_HOME_ENABLE`: Home gesture switch (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_GESTURE_RECOGNITION_RESET_ENABLE`: enable/disable the Reset gesture (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_AUTO_COPY_FILES_FROM_USB_DEVICE`: automatically import OTG resources (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.8.0 or later) + /// + /// Whether to switch the function on/off: + /// * `S_ON`: switch on + /// * `S_OFF`: switch off + /// + public static void SwitchSystemFunction(SystemFunctionSwitchEnum systemFunction, SwitchEnum switchEnum) + { + PXR_EnterprisePlugin.UPxr_SwitchSystemFunction(systemFunction, switchEnum); + } + + /// + /// Sets the USB configuration mode. + /// + /// USB configuration mode. Enumerations: + /// * `MTP`: MTP mode + /// * `CHARGE`: charging mode + /// + public static void SwitchSetUsbConfigurationOption(USBConfigModeEnum uSBConfigModeEnum) + { + PXR_EnterprisePlugin.UPxr_SwitchSetUsbConfigurationOption(uSBConfigModeEnum); + } + + /// + /// Sets the duration after which the controllers enter the pairing mode. + /// @note Supported by PICO Neo3 Pro (system version 5.4.0 or later) and PICO 4 Enterprise (system version 5.2.8 or later) + /// + /// Duration enumerations: + /// * `SIX`: 6 seconds + /// * `FIFTEEN`: 15 seconds + /// * `SIXTY`: 60 seconds + /// * `ONE_HUNDRED_AND_TWENTY`: 120 seconds (2 minutes) + /// * `SIX_HUNDRED`: 600 seconds (5 minutes) + /// * `NEVER`: never enter the pairing mode + /// + /// Returns the result: + /// * `0`: failure + /// * `1`: success + /// + public static void SetControllerPairTime(ControllerPairTimeEnum timeEnum, Action callback) + { + PXR_EnterprisePlugin.UPxr_SetControllerPairTime(timeEnum, callback); + } + + /// + /// Gets the duration after which the controllers enter the pairing mode. + /// @note Supported by PICO Neo3 Pro (system version 5.4.0 or later) and PICO 4 Enterprise (system version 5.2.8 or later) + /// + /// Returns a duration enumeration from the following: + /// * `SIX`: 6 seconds + /// * `FIFTEEN`: 15 seconds + /// * `SIXTY`: 60 seconds + /// * `ONE_HUNDRED_AND_TWENTY`: 120 seconds (2 minutes) + /// * `SIX_HUNDRED`: 600 seconds (5 minutes) + /// * `NEVER`: never enter the pairing mode + /// + public static void GetControllerPairTime(Action callback) + { + PXR_EnterprisePlugin.UPxr_GetControllerPairTime(callback); + } + + /// + /// Turns the screen on. + /// @note This is a protected API. You need to add `` + /// to the app's AndroidManifest.xml file for calling this API, after which the app is unable to be published on the PICO Store. + /// + public static void ScreenOn() + { + PXR_EnterprisePlugin.UPxr_ScreenOn(); + } + + /// + /// Turns the screen off. + /// @note This is a protected API. You need to add `` + /// to the app's AndroidManifest.xml file for calling this API, after which the app is unable to be published on the PICO Store. + /// + public static void ScreenOff() + { + PXR_EnterprisePlugin.UPxr_ScreenOff(); + } + + /// + /// Acquires the wake lock. + /// + public static void AcquireWakeLock() + { + PXR_EnterprisePlugin.UPxr_AcquireWakeLock(); + } + + /// + /// Releases the wake lock. + /// + public static void ReleaseWakeLock() + { + PXR_EnterprisePlugin.UPxr_ReleaseWakeLock(); + } + + /// + /// Enables the Confirm button. + /// + public static void EnableEnterKey() + { + PXR_EnterprisePlugin.UPxr_EnableEnterKey(); + } + + /// + /// Disables the Confirm button. + /// + public static void DisableEnterKey() + { + PXR_EnterprisePlugin.UPxr_DisableEnterKey(); + } + + /// + /// Enables the Volume button. + /// + public static void EnableVolumeKey() + { + PXR_EnterprisePlugin.UPxr_EnableVolumeKey(); + } + + /// + /// Disables the Volume button. + /// + public static void DisableVolumeKey() + { + PXR_EnterprisePlugin.UPxr_DisableVolumeKey(); + } + + /// + /// Enables the Back button. + /// + public static void EnableBackKey() + { + PXR_EnterprisePlugin.UPxr_EnableBackKey(); + } + + /// + /// Disables the Back button. + /// + public static void DisableBackKey() + { + PXR_EnterprisePlugin.UPxr_DisableBackKey(); + } + + + /// + /// Resets all buttons to default configuration. + /// + /// Whether all keys have been successfully reset to default configuration: + /// * `true`: reset + /// * `false`: failed to reset + /// + public static void ResetAllKeyToDefault(Action callback) + { + PXR_EnterprisePlugin.UPxr_ResetAllKeyToDefault(callback); + } + + /// + /// Sets an app as the launcher app. Need to restart the device to make the setting work. + /// + /// (deprecated) + /// The app's package name. + public static void SetAPPAsHome(SwitchEnum switchEnum, string packageName) + { + PXR_EnterprisePlugin.UPxr_SetAPPAsHome(switchEnum, packageName); + } + + /// + /// Force quits app(s) by passing app PID or package name. + /// @note This is a protected API. You need to add `` + /// to the app's AndroidManifest.xml file for calling this API, after which the app is unable to be published on the PICO Store. + /// + /// An array of app PID(s). + /// An array of package name(s). + public static void KillAppsByPidOrPackageName(int[] pids, string[] packageNames) + { + PXR_EnterprisePlugin.UPxr_KillAppsByPidOrPackageName(pids, packageNames); + } + + /// + /// Force quits background app(s) expect those in the allowlist. + /// @note This is a protected API. You need to add `` + /// to the app's AndroidManifest.xml file for calling this API, after which the app is unable to be published on the PICO Store. + /// + /// An array of package name(s) to be added to the allowlist. The corresponding app(s) in the allowlist will not be force quit. + public static void KillBackgroundAppsWithWhiteList(string[] packageNames) + { + PXR_EnterprisePlugin.UPxr_KillBackgroundAppsWithWhiteList(packageNames); + } + + /// + /// Freezes the screen to the front. The screen will turn around with the HMD. + /// @note Supported by G2 4K and Neo2 devices. + /// + /// Whether to freeze the screen: + /// * `true`: freeze + /// * `false`: stop freezing + /// + public static void FreezeScreen(bool freeze) + { + PXR_EnterprisePlugin.UPxr_FreezeScreen(freeze); + } + + /// + /// Turns on the screencast function. + /// + public static void OpenMiracast() + { + PXR_EnterprisePlugin.UPxr_OpenMiracast(); + } + + /// + /// Gets the status of the screencast function. + /// + /// The status of the screencast function: + /// * `true`: on + /// * `false`: off + /// + public static bool IsMiracastOn() + { + return PXR_EnterprisePlugin.UPxr_IsMiracastOn(); + } + + /// + /// Turns off the screencast function. + /// + public static void CloseMiracast() + { + PXR_EnterprisePlugin.UPxr_CloseMiracast(); + } + + /// + /// Starts looking for devices that can be used for screen casting. + /// + public static void StartScan() + { + PXR_EnterprisePlugin.UPxr_StartScan(); + } + + /// + /// Stops looking for devices that can be used for screen casting. + /// + public static void StopScan() + { + PXR_EnterprisePlugin.UPxr_StopScan(); + } + + /// + /// Casts the screen to the specified device. + /// + /// A modelJson structure containing the following fields: + /// * `deviceAddress` + /// * `deviceName` + /// * `isAvailable` (`true`-device available; `false`-device not available) + /// + public static void ConnectWifiDisplay(string modelJson) + { + PXR_EnterprisePlugin.UPxr_ConnectWifiDisplay(modelJson); + } + + /// + /// Stops casting the screen to the current device. + /// + public static void DisConnectWifiDisplay() + { + PXR_EnterprisePlugin.UPxr_DisConnectWifiDisplay(); + } + + /// + /// Forgets the device that have been connected for screencast. + /// + /// Device address. + public static void ForgetWifiDisplay(string address) + { + PXR_EnterprisePlugin.UPxr_ForgetWifiDisplay(address); + } + + /// + /// Renames the device connected for screencast. The name is only for local storage. + /// + /// The MAC address of the device. + /// The new device name. + public static void RenameWifiDisplay(string address, string newName) + { + PXR_EnterprisePlugin.UPxr_RenameWifiDisplay(address, newName); + } + + /// + /// Sets the callback for the scanning result, which returns `List` that contains the devices previously connected for screencast and the devices currently found for screencast. + /// + /// + /// Returns `List` that contains the currently scanned device. + /// + public static void SetWDModelsCallback(Action> models) + { + PXR_EnterprisePlugin.UPxr_SetWDModelsCallback(models); + } + + /// + /// Sets the callback for the scanning result, which returns the JSON string that contains the devices previously connected for screencast and the devices currently found for screencast. + /// + /// + /// Returns a JSON string that contains the currently scanned device. + /// + public static void SetWDJsonCallback(Action callback) + { + PXR_EnterprisePlugin.UPxr_SetWDJsonCallback(callback); + } + + /// + /// Manually updates the list of devices for screencast. + /// + public static void UpdateWifiDisplays() + { + PXR_EnterprisePlugin.UPxr_UpdateWifiDisplays(); + } + + /// + /// Gets the information of the currently connected device. + /// + /// The information of the currently connected device. + public static string GetConnectedWD() + { + return PXR_EnterprisePlugin.UPxr_GetConnectedWD(); + } + + /// + /// Switches the large space scene on. + /// @note Supported by 6Dof devices. + /// + /// Whether to switch the large space scene on: + /// * `true`: switch on + /// * `false`: not to switch on + /// + /// Callback: + /// * `true`: success + /// * `false`: failure + /// + public static void SwitchLargeSpaceScene(bool open, Action callback) + { + PXR_EnterprisePlugin.UPxr_SwitchLargeSpaceScene(open, callback); + } + + /// + /// Gets the status of the large space scene. + /// @note Supported by 6Dof devices. + /// + /// Returns the status of large space: + /// * `0`: switched off + /// * `1`: switched on + /// + public static void GetSwitchLargeSpaceStatus(Action callback) + { + PXR_EnterprisePlugin.UPxr_GetSwitchLargeSpaceStatus(callback); + } + + /// + /// Saves the large space map. + /// @note Supported by 6Dof devices. + /// + /// Whether the large space map has been saved: + /// * `true`: saved + /// * `false`: failed to save + /// + public static bool SaveLargeSpaceMaps() + { + return PXR_EnterprisePlugin.UPxr_SaveLargeSpaceMaps(); + } + + /// + /// Exports maps. The exported maps are stored in the /maps/export file. + /// @note Supported by 6Dof devices. + /// + /// Returns the result: + /// * `true`: exported + /// * `false`: failed to export + /// + public static void ExportMaps(Action callback) + { + PXR_EnterprisePlugin.UPxr_ExportMaps(callback); + } + + /// + /// Imports maps. Need to copy maps to the /maps folder. + /// @note Supported by 6Dof devices. + /// + /// Returns the result: + /// * `true`: imported + /// * `false`: failed to import + /// + public static void ImportMaps(Action callback) + { + PXR_EnterprisePlugin.UPxr_ImportMaps(callback); + } + + /// + /// Gets each CPU's utilization for the current device. + /// + /// An array of CPU utilization info. + public static float[] GetCpuUsages() + { + return PXR_EnterprisePlugin.UPxr_GetCpuUsages(); + } + + /// + /// Gets device temperature in Celsius. + /// + /// The requested type of device temperature: + /// * `DEVICE_TEMPERATURE_CPU`: CPU temperature + /// * `DEVICE_TEMPERATURE_GPU`: GPU temperature + /// * `DEVICE_TEMPERATURE_BATTERY`: battery temperature + /// * `DEVICE_TEMPERATURE_SKIN`: surface temperature + /// + /// The requested source of device temperature: + /// * `TEMPERATURE_CURRENT`: current temperature + /// * `TEMPERATURE_THROTTLING`: temperature threshold for throttling + /// * `TEMPERATURE_SHUTDOWN`: temperature threshold for shutdown + /// * `TEMPERATURE_THROTTLING_BELOW_VR_MIN`: temperature threshold for throttling. If the actual temperature is higher than the threshold, the lowest clock frequency for VR mode will not be met + /// + /// An array of requested float device temperatures in Celsius. + public static float[] GetDeviceTemperatures(int type, int source) + { + return PXR_EnterprisePlugin.UPxr_GetDeviceTemperatures(type, source); + } + + /// + /// Captures the current screen. + /// @note Not supported by G2 4K devices. + /// + public static void Capture() + { + PXR_EnterprisePlugin.UPxr_Capture(); + } + + /// + /// Records the screen. Call this function again to stop recording. + /// @note Not supported by G2 4K devices. + /// + public static void Record() + { + PXR_EnterprisePlugin.UPxr_Record(); + } + + /// + /// Connects the device to a specified Wi-Fi. + /// + /// Wi-Fi name. + /// Wi-Fi password. + /// Reserved parameter, pass `0` by default. + /// The callback for indicating whether the Wi-Fi connection is successful: + /// * `0`: connected + /// * `1`: password error + /// * `2`: unknown error + /// + public static void ControlSetAutoConnectWIFIWithErrorCodeCallback(String ssid, String pwd, int ext, Action callback) + { + PXR_EnterprisePlugin.UPxr_ControlSetAutoConnectWIFIWithErrorCodeCallback(ssid, pwd, ext, callback); + } + + /// + /// Keeps an app active. In other words, improves the priority of an app, thereby making the system not to force quit the app. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA-5.2.8 or later). + /// + /// App package name. + /// Whether to keep the app active (i.e., whether to enhance the priority of the app): + /// * `true`: keep + /// * `false`: not keep + /// + /// Reserved parameter, pass `0`. + public static void AppKeepAlive(String appPackageName, bool keepAlive, int ext) + { + PXR_EnterprisePlugin.UPxr_AppKeepAlive(appPackageName, keepAlive, ext); + } + + /// + /// Schedules auto startup for the device. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA-5.2.8 or later). + /// + /// Year, for example, `2022`. + /// Month, for example, `2`. + /// Day, for example, `22`. + /// Hour, for example, `22`. + /// Minute, for example, `22`. + /// Whether to enable scheduled auto startup for the device: + /// * `true`: enable + /// * `false`: disable + /// + public static void TimingStartup(int year, int month, int day, int hour, int minute, bool open) + { + PXR_EnterprisePlugin.UPxr_TimingStartup(year, month, day, hour, minute, open); + } + + /// + /// Schedules auto shutdown for the device. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version 5.4.0 or later). + /// + /// Year, for example, `2022`. + /// Month, for example, `2`. + /// Day, for example, `22`. + /// Hour, for example, `22`. + /// Minute, for example, `22`. + /// Whether to enable scheduled auto shutdown for the device: + /// * `true`: enable + /// * `false`: disable + /// + public static void TimingShutdown(int year, int month, int day, int hour, int minute, bool open) + { + PXR_EnterprisePlugin.UPxr_TimingShutdown(year, month, day, hour, minute, open); + } + + /// + /// Displays a specified settings screen. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA-5.2.8 or later). + /// + /// The enumerations of settings screen: + /// * `START_VR_SETTINGS_ITEM_WIFI`: the Wi-Fi settings screen; + /// * `START_VR_SETTINGS_ITEM_BLUETOOTH`: the bluetooth settings screen; + /// * `START_VR_SETTINGS_ITEM_CONTROLLER`: the controller settings screen; + /// * `START_VR_SETTINGS_ITEM_LAB`: the lab settings screen; + /// * `START_VR_SETTINGS_ITEM_BRIGHTNESS`: the brightness settings screen; + /// * `START_VR_SETTINGS_ITEM_GENERAL)`: the general settings screen; + /// * `START_VR_SETTINGS_ITEM_NOTIFICATION`: the notification settings screen. + /// + /// Whether to display the selected settings screen: + /// * `true`: display + /// * `false`: hide + /// + /// Reserved parameter, pass `0`. + public static void StartVrSettingsItem(StartVRSettingsEnum settingsEnum, bool hideOtherItem, int ext) + { + PXR_EnterprisePlugin.UPxr_StartVrSettingsItem(settingsEnum, hideOtherItem, ext); + } + + /// + /// Changes the Volume button's function to that of the Home and Enter button's, or restores the volume adjustment function to the Volume button. + /// @note Supported by PICO 4 Enterprise with system version OTA-5.2.8 or later. + /// + /// Whether to change the Volume button's function: + /// * `S_ON`: change + /// * `S_OFF`: do not change + /// + /// Reserved parameter, pass `0`. + public static void SwitchVolumeToHomeAndEnter(SwitchEnum switchEnum, int ext) + { + PXR_EnterprisePlugin.UPxr_SwitchVolumeToHomeAndEnter(switchEnum, ext); + } + + /// + /// Gets whether the Volume button's function has been changed to that of the Home and Enter button's. + /// @note Supported by PICO 4 Enterprise with system version OTA-5.2.8 or later. + /// + /// + /// * `S_ON`: changed + /// * `S_OFF`: not changed + /// + public static SwitchEnum IsVolumeChangeToHomeAndEnter() + { + return PXR_EnterprisePlugin.UPxr_IsVolumeChangeToHomeAndEnter(); + } + + /// + /// Upgrades the OTA. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA0-5.2.8 or later). + /// + /// The location of the OTA package. + /// + /// * `0`: success + /// * `1`: failure + /// * `21`: OTA package version too low + /// + public static int InstallOTAPackage(String otaPackagePath) + { + return PXR_EnterprisePlugin.UPxr_InstallOTAPackage(otaPackagePath); + } + + /// + /// Gets the configuration of the Wi-Fi network that the device automatically connects to. + /// + /// The SSID and password of the Wi-Fi network. + public static string GetAutoConnectWiFiConfig() + { + return PXR_EnterprisePlugin.UPxr_GetAutoConnectWiFiConfig(); + } + + /// + /// Gets the scheduled auto startup settings for the device. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA-5.2.8 or later). + /// + /// + /// * `open`: the status of scheduled auto startup: + /// * `true`: enabled + /// * `false`: disabled + /// * `time`: the time when the device auto starts up, for example, `1658980380000`. Returned when `open` is `true`. + /// + public static string GetTimingStartupStatus() + { + return PXR_EnterprisePlugin.UPxr_GetTimingStartupStatus(); + } + + /// + /// Gets the scheduled auto shutdown settings for the device. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA-5.2.8 or later). + /// + /// + /// * `open`: the status of scheduled auto shutdown: + /// * `true`: enabled + /// * `false`: disabled + /// * `time`: the time when the device auto shuts down, for example, `1658980380000`. Returned when `open` is `true`. + /// + public static string GetTimingShutdownStatus() + { + return PXR_EnterprisePlugin.UPxr_GetTimingShutdownStatus(); + } + + /// + /// Gets the status of a specified controller button. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA0-5.2.8 or later). + /// + /// The enumerations of controller button: + /// * `CONTROLLER_KEY_JOYSTICK` + /// * `CONTROLLER_KEY_MENU` + /// * `CONTROLLER_KEY_TRIGGER` + /// * `CONTROLLER_KEY_RIGHT_A` + /// * `CONTROLLER_KEY_RIGHT_B` + /// * `CONTROLLER_KEY_LEFT_X` + /// * `CONTROLLER_KEY_LEFT_Y` + /// * `CONTROLLER_KEY_LEFT_GRIP` + /// * `CONTROLLER_KEY_RIGHT_GRIP` + /// + /// The button's status: + /// * `0`: disabled + /// * `1`: enabled + /// + public static int GetControllerKeyState(ControllerKeyEnum pxrControllerKey) + { + return PXR_EnterprisePlugin.UPxr_GetControllerKeyState(pxrControllerKey); + } + + /// + /// Enables or disables a specified controller button. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA-5.2.8 or later). + /// + /// The enumerations of controller button: + /// * `CONTROLLER_KEY_JOYSTICK` + /// * `CONTROLLER_KEY_MENU` + /// * `CONTROLLER_KEY_TRIGGER` + /// * `CONTROLLER_KEY_RIGHT_A` + /// * `CONTROLLER_KEY_RIGHT_B` + /// * `CONTROLLER_KEY_LEFT_X` + /// * `CONTROLLER_KEY_LEFT_Y` + /// * `CONTROLLER_KEY_LEFT_GRIP` + /// * `CONTROLLER_KEY_RIGHT_GRIP` + /// + /// Whether to enable or disable the button: + /// * `S_ON`: enable + /// * `S_OFF`: disable + /// + /// + /// `0` indicates success, other values indicate failure. + /// + public static int SetControllerKeyState(ControllerKeyEnum pxrControllerKey, SwitchEnum status) + { + return PXR_EnterprisePlugin.UPxr_SetControllerKeyState(pxrControllerKey, status); + } + + /// + /// Gets the status of the switch which is for powering off the USB cable when the device is shut down. + /// + /// The switch's status: + /// * `S_ON`: on + /// * `S_OFF`: off + /// + public static SwitchEnum GetPowerOffWithUSBCable() + { + return PXR_EnterprisePlugin.UPxr_ControlGetPowerOffWithUSBCable(); + } + + /// + /// Gets the screen timeout setting for the device. + /// + /// `PBS_ScreenOffDelayTimeEnum`: the enumerations of screen timeout. + public static ScreenOffDelayTimeEnum GetScreenOffDelay() + { + return PXR_EnterprisePlugin.UPxr_PropertyGetScreenOffDelay(); + } + + /// + /// Gets the sleep timeout settings for the device. + /// + /// `PBS_SleepDelayTimeEnum`: the enumeration of sleep timeout. + public static SleepDelayTimeEnum GetSleepDelay() + { + return PXR_EnterprisePlugin.UPxr_PropertyGetSleepDelay(); + } + + /// + /// Gets the current settings for the Power button. + /// + /// + /// * `null`: not set + /// * `singleTap`: whether a single-tap event has been set + /// * `longTap`: whether a long-press event has been set + /// * `longPressTime`: the time after which the long-press event takes place. Returned when `longTap` is `true`. + /// + public static string GetPowerKeyStatus() + { + return PXR_EnterprisePlugin.UPxr_PropertyGetPowerKeyStatus(); + } + + /// + /// Get the Enter button's status. + /// + /// + /// * `0`: disabled + /// * `1`: enabled + /// + public static int GetEnterKeyStatus() + { + return PXR_EnterprisePlugin.UPxr_GetEnterKeyStatus(); + } + + /// + /// Get the Volume button's status. + /// + /// + /// * `0`: disabled + /// * `1`: enabled + /// + public static int GetVolumeKeyStatus() + { + return PXR_EnterprisePlugin.UPxr_GetVolumeKeyStatus(); + } + + /// + /// Get the Back button's status. + /// + /// + /// * `0`: disabled + /// * `1`: enabled + /// + public static int GetBackKeyStatus() + { + return PXR_EnterprisePlugin.UPxr_GetBackKeyStatus(); + } + + /// + /// Gets the event settings for the Home button. + /// + /// The enumerations of event type: + /// * `SINGLE_CLICK`: single-click event + /// * `DOUBLE_CLICK`: double-click event + /// * `LONG_PRESS`: long-press event + /// + /// + /// * For `SINGLE_CLICK` and `DOUBLE_CLICK`, the event(s) you set will be returned. + /// * For `LONG_PRESS`, the time and event you set will be returned. If you have not set a time for a long-press event, time will be `null`. + /// + /// * If you have not set any event for the event type you pass in the request, the response will return `null`. + /// * For event enumerations, see `PropertySetHomeKey` or `PropertySetHomeKeyAll`. + /// + public static string GetHomeKeyStatus(HomeEventEnum homeEvent) + { + return PXR_EnterprisePlugin.UPxr_PropertyGetHomeKeyStatus(homeEvent); + } + + /// + /// Gets the status of a specified system function switch. + /// + /// The enumerations of system function switch: + /// * `SFS_USB`: USB debugging + /// * `SFS_AUTOSLEEP`: auto sleep + /// * `SFS_SCREENON_CHARGING`: screen-on charging + /// * `SFS_OTG_CHARGING`: OTG charging (supported by G2 devices) + /// * `SFS_RETURN_MENU_IN_2DMODE`: display the Return icon on the 2D screen + /// * `SFS_COMBINATION_KEY`: combination key + /// * `SFS_CALIBRATION_WITH_POWER_ON`: calibration with power on + /// * `SFS_SYSTEM_UPDATE`: system update (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_CAST_SERVICE`: phone casting service + /// * `SFS_EYE_PROTECTION`: eye-protection mode + /// * `SFS_SECURITY_ZONE_PERMANENTLY`: permanently disable the 6DoF play area (supported by PICO Neo2 devices) + /// * `SFS_GLOBAL_CALIBRATION`: global calibration (supported by PICO G2 devices) + /// * `SFS_Auto_Calibration`: auto calibration + /// * `SFS_USB_BOOT`: USB plug-in boot + /// * `SFS_VOLUME_UI`: global volume UI (need to restart the device to make the setting take effect) + /// * `SFS_CONTROLLER_UI`: global controller connected UI + /// * `SFS_NAVGATION_SWITCH`: navigation bar + /// * `SFS_SHORTCUT_SHOW_RECORD_UI`: screen recording button UI + /// * `SFS_SHORTCUT_SHOW_FIT_UI`: PICO fit UI + /// * `SFS_SHORTCUT_SHOW_CAST_UI`: screencast button UI + /// * `SFS_SHORTCUT_SHOW_CAPTURE_UI`: screenshot button UI + /// * `SFS_USB_FORCE_HOST`: set the Neo3 Pro/Pro Eye device as the host device + /// * `SFS_SET_DEFAULT_SAFETY_ZONE`: set a default play area for PICO Neo3 and PICO 4 series devices + /// * `SFS_ALLOW_RESET_BOUNDARY`: allow to reset customized boundary for PICO Neo3 series devices + /// * `SFS_BOUNDARY_CONFIRMATION_SCREEN`: whether to display the boundary confirmation screen for PICO Neo3 and PICO 4 series devices + /// * `SFS_LONG_PRESS_HOME_TO_RECENTER`: long press the Home button to recenter for PICO Neo3 and PICO 4 series devices + /// * `SFS_POWER_CTRL_WIFI_ENABLE`: stay connected to the network when the device sleeps/turns off (supported by PICO Neo3 Pro with system version 4.8.0 or later and PICO 4 Enterprise with system version OTA-5.2.8 or later) + /// * `SFS_WIFI_DISABLE`: disable Wi-Fi (supported by PICO Neo3 Pro with system version 4.8.0 or later and PICO 4 Enterprise with system version OTA-5.2.8 or later) + /// * `SFS_SIX_DOF_SWITCH`: 6DoF position tracking for PICO Neo3 and PICO 4 series devices + /// * `SFS_INVERSE_DISPERSION`: anti-dispersion (supported by PICO Neo3 Pro with system version 4.8.0 or later and PICO 4 Enterprise with system version OTA0-5.2.8 or later) + /// * `SFS_LOGCAT`: system log switch (/data/logs) (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_PSENSOR`: PSensor switch (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SYSTEM_UPDATE_OTA`: OTA upgrade (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SYSTEM_UPDATE_APP`: app upgrade and update (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_WLAN_UI`: quickly set whether to show the WLAN button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_BOUNDARY_UI`: quickly set whether to show the boundary button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_BLUETOOTH_UI`: quickly set whether to show the bluetooth button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_CLEAN_TASK_UI`: quickly set whether to show the one-click clear button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_IPD_ADJUSTMENT_UI`: quickly set whether to show the IPD adjustment button (supported by PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_POWER_UI`: quickly set whether to show the power button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_SHORTCUT_SHOW_EDIT_UI`: quickly set whether to show the edit button (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_BASIC_SETTING_APP_LIBRARY_UI`: the button for customizing the app library (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_BASIC_SETTING_SHORTCUT_UI`: the button for customizing quick settings (supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later) + /// * `SFS_LED_FLASHING_WHEN_SCREEN_OFF`: whether to keep the LED indicator light on when the device's screen is off and the battery is below 20% (supported by PICO G3 devices) + /// * `SFS_BASIC_SETTING_CUSTOMIZE_SETTING_UI`: customize settings item to show or hide in basic settings + /// * `SFS_BASIC_SETTING_SHOW_APP_QUIT_CONFIRM_DIALOG`: whether to show the app-quit dialog box when switching to a new app + /// * `SFS_BASIC_SETTING_KILL_BACKGROUND_VR_APP`: whether to kill background VR apps (`1`: kill, and this is the default setting; `2`: do not kill) + /// * `SFS_BASIC_SETTING_SHOW_CAST_NOTIFICATION`: whether to show a blue icon when casting the screen. The icon is displayed by default, and you can set the value to `0` to hide it. + /// * `SFS_AUTOMATIC_IPD`: auto IPD switch (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.7.0 or later) + /// * `SFS_QUICK_SEETHROUGH_MODE`: quick seethrough mode switch (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.7.0 or later) + /// * `SFS_HIGN_REFERSH_MODE`: high refresh mode switch (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.7.0 or later) + /// * `SFS_SEETHROUGH_APP_KEEP_RUNNING`: set whether to keep the app running under the seethrough mode (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_OUTDOOR_TRACKING_ENHANCEMENT`: enhance outdoor position tracking (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_AUTOIPD_AUTO_COMFIRM`: quick auto-IPD (supported by PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_LAUNCH_AUTOIPD_IF_GLASSES_WEARED`: set whether to launch auto-IPD after wearing the headset (supported by PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_GESTURE_RECOGNITION_HOME_ENABLE`: Home gesture switch (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_GESTURE_RECOGNITION_RESET_ENABLE`: enable/disable the Reset gesture (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.8.0 or later) + /// * `SFS_AUTO_COPY_FILES_FROM_USB_DEVICE`: automatically import OTG resources (supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.8.0 or later) + /// + /// The callback that returns the switch's status: + /// * `0`: off + /// * `1`: on + /// * `2`: not supported by device + /// For `SFS_SYSTEM_UPDATE`, the returns are as follows: + /// * `0`: off + /// * `1`: OTA upgrade on + /// * `2`: app upgrade on + /// * `3`: OTA and app upgrade on + /// + public static void GetSwitchSystemFunctionStatus(SystemFunctionSwitchEnum systemFunction, Action callback) + { + PXR_EnterprisePlugin.UPxr_GetSwitchSystemFunctionStatus(systemFunction, callback); + } + + /// + /// Gets the configured USB mode. + /// + /// + /// * `MTP`: MTP mode + /// * `CHARGE`: charging mode + /// + public static string GetUsbConfigurationOption() + { + return PXR_EnterprisePlugin.UPxr_SwitchGetUsbConfigurationOption(); + } + + /// + /// Gets the current launcher. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA0-5.2.8 or later). + /// + /// The package name or class name of the launcher. + public static string GetCurrentLauncher() + { + return PXR_EnterprisePlugin.UPxr_GetCurrentLauncher(); + } + + /// + /// Initializes the screencast service. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA0-5.2.8 or later). + /// + /// The callback: + /// * `0`: disconnect + /// * `1`: connect + /// * `2`: no microphone permission + /// + /// + /// * `0`: failure + /// * `1`: success + /// Returns `0` when there is no microphone permission. + /// + public static int PICOCastInit(Action callback) + { + return PXR_EnterprisePlugin.UPxr_PICOCastInit(callback); + } + + /// + /// Sets whether to show the screencast authorization window. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA0-5.2.8 or later). + /// + /// + /// * `0`: ask every time (default) + /// * `1`: always allow + /// * `2`: not accepted + /// + /// + /// * `0`: failure + /// * `1`: success + /// + public static int PICOCastSetShowAuthorization(int authZ) + { + return PXR_EnterprisePlugin.UPxr_PICOCastSetShowAuthorization(authZ); + } + + /// + /// Gets the setting of whether to show the screencast authorization window. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA0-5.2.8 or later). + /// + /// + /// * `0`: ask every time (default) + /// * `1`: always allow + /// * `2`: not accepted + /// + public static int PICOCastGetShowAuthorization() + { + return PXR_EnterprisePlugin.UPxr_PICOCastGetShowAuthorization(); + } + + /// + /// Gets the URL for screencast. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA0-5.2.8 or later). + /// + /// The enumerations of URL type: + /// * `NormalURL`: Normal URL. The screencast authorization window will show if it is not set. + /// * `NoConfirmURL`: Non-confirm URL. The screencast authorization window will not show in the browser. Screencast will start once you enter the URL. + /// * `RtmpURL`: Returns the RTMP live streaming URL. The screencast authorization window will not appear on the VR headset's screen. + /// + /// The URL for screencast. + public static string PICOCastGetUrl(PICOCastUrlTypeEnum urlType) + { + return PXR_EnterprisePlugin.UPxr_PICOCastGetUrl(urlType); + } + + /// + /// Stops screencast. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA0-5.2.8 or later). + /// + /// + /// * `0`: failure + /// * `1`: success + /// + public static int PICOCastStopCast() + { + return PXR_EnterprisePlugin.UPxr_PICOCastStopCast(); + } + + /// + /// sets screencast options. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA0-5.2.8 or later). + /// + /// The enumerations of the property to set: + /// * `OPTION_RESOLUTION_LEVEL`: resolution level + /// * `OPTION_BITRATE_LEVEL`: bitrate level + /// * `OPTION_AUDIO_ENABLE`: whether to enable the audio + /// + /// The values that can be set for each property: + /// * For `OPTION_RESOLUTION_LEVEL`: + /// * `OPTION_VALUE_RESOLUTION_HIGH` + /// * `OPTION_VALUE_RESOLUTION_MIDDLE` + /// * `OPTION_VALUE_RESOLUTION_AUTO` + /// * `OPTION_VALUE_RESOLUTION_HIGH_2K` + /// * `OPTION_VALUE_RESOLUTION_HIGH_4K` + /// * For `OPTION_BITRATE_LEVEL`: + /// * `OPTION_VALUE_BITRATE_HIGH` + /// * `OPTION_VALUE_BITRATE_MIDDLE` + /// * `OPTION_VALUE_BITRATE_LOW` + /// * For `OPTION_AUDIO_ENABLE`: + /// * `OPTION_VALUE_AUDIO_ON` + /// * `OPTION_VALUE_AUDIO_OFF` + /// + /// + /// * `0`: failure + /// * `1`: success + /// + public static int PICOCastSetOption(PICOCastOptionOrStatusEnum castOptionOrStatus, PICOCastOptionValueEnum castOptionValue) + { + return PXR_EnterprisePlugin.UPxr_PICOCastSetOption(castOptionOrStatus, castOptionValue); + } + + /// + /// Gets the screencast settings for the current device. + /// @note Supported by PICO Neo3 Pro (system version 4.8.0 or later) and PICO 4 Enterprise (system version OTA0-5.2.8 or later). + /// + /// The enumerations of the screencast property to get setting for: + /// * `OPTION_RESOLUTION_LEVEL`: resolution level + /// * `OPTION_BITRATE_LEVEL`: bitrate level + /// * `OPTION_AUDIO_ENABLE`: whether the audio is enabled + /// * `PICOCAST_STATUS`: returns the current screencast status + /// + /// The setting of the selected property: + /// * For `OPTION_RESOLUTION_LEVEL`: + /// * `OPTION_VALUE_RESOLUTION_HIGH` + /// * `OPTION_VALUE_RESOLUTION_MIDDLE` + /// * `OPTION_VALUE_RESOLUTION_AUTO` + /// * `OPTION_VALUE_RESOLUTION_HIGH_2K` + /// * `OPTION_VALUE_RESOLUTION_HIGH_4K` + /// * For `OPTION_BITRATE_LEVEL`: + /// * `OPTION_VALUE_BITRATE_HIGH` + /// * `OPTION_VALUE_BITRATE_MIDDLE` + /// * `OPTION_VALUE_BITRATE_LOW` + /// * For `OPTION_AUDIO_ENABLE`: + /// * `OPTION_VALUE_AUDIO_ON` + /// * `OPTION_VALUE_AUDIO_OFF` + /// * `PICOCAST_STATUS` : + /// * `STATUS_VALUE_STATE_STARTED` + /// * `STATUS_VALUE_STATE_STOPPED` + /// * `STATUS_VALUE_ERROR` + /// + public static PICOCastOptionValueEnum PICOCastGetOptionOrStatus(PICOCastOptionOrStatusEnum castOptionOrStatus) + { + return PXR_EnterprisePlugin.UPxr_PICOCastGetOptionOrStatus(castOptionOrStatus); + } + + /// Sets the system language for the device. + /// For a language that is spoken in different countries/regions, the system language is then co-set by the language code and the device's country/region code. + /// For example, if the language code is set to `en` and the device's country/region code is `US`, the system language will be set to English (United States). + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// Supported language codes: + /// * `cs`: Czech + /// * `da`: Danish + /// * `de`: German + /// * `el`: Greek + /// * `en`: English (United States / United Kingdom) + /// * `es`: Spanish + /// * `fi`: Finnish + /// * `fr`: French + /// * `it`: Italian + /// * `ja`: Japanese + /// * `ko`: Korean + /// * `ms`: Malay + /// * `nb`: Norwegian + /// * `nl`: Dutch + /// * `pl`: Polish + /// * `pt`: Portuguese (Brazil / Portugal) + /// * `ro`: Romanian + /// * `ru`: Russian + /// * `sv`: Swedish + /// * `th`: Thai + /// * `tr`: Turkish + /// * `zh`: Chinese (Simplified) / Chinese (Hong Kong SAR of China) / Chinese (Traditional) + /// For devices in Mainland China / Taiwan, China / Hong Kong SAR of China / Macao SAR of China, the country/region code has been defined in factory settings. + /// + /// + /// * `0`: success + /// * `1`: failure + /// * `22`: invalid language + /// + public static int SetSystemLanguage(String language) + { + return PXR_EnterprisePlugin.UPxr_SetSystemLanguage(language); + } + + /// Gets the device's system language. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// The system language set for the device. For details, refer to the + /// parameter description for `SetSystemLanguage`. + public static String GetSystemLanguage() + { + return PXR_EnterprisePlugin.UPxr_GetSystemLanguage(); + } + + /// Sets a default Wi-Fi network for the device. Once set, the device will automatically connect to the Wi-Fi network if accessible. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// The SSID (name) of the Wi-Fi network. + /// The password of the Wi-Fi network. + /// + /// * `0`: success + /// * `1`: failure + /// + public static int ConfigWifi(String ssid, String pwd) + { + return PXR_EnterprisePlugin.UPxr_ConfigWifi(ssid, pwd); + } + + /// Gets the device's default Wi-Fi network. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// The SSID (name) of the Wi-Fi network. + public static String[] GetConfiguredWifi() + { + return PXR_EnterprisePlugin.UPxr_GetConfiguredWifi(); + } + + /// Sets a country/region for the device. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// The country/region code co-determines the device's system language with the language code you set via `SetSystemLanguage`. + /// Below are supported country/region codes: + /// * `AD`: Andorra + /// * `AT`: Austria + /// * `AU`: Australia + /// * `BE`: Belgium + /// * `BG`: Bulgaria + /// * `CA`: Canada + /// * `CH`: Switzerland + /// * `CZ`: Czech Republic + /// * `DE`: Germany + /// * `DK`: Denmark + /// * `EE`: Estonia + /// * `ES`: Spain + /// * `FI`: Finland + /// * `FR`: France + /// * `GB`: the Great Britain + /// * `GR`: Greece + /// * `HR`: Croatia + /// * `HU`: Hungary + /// * `IE`: Ireland + /// * `IL`: Israel + /// * `IS`: Iceland + /// * `IT`: Italy + /// * `JP`: Japan + /// * `KR`: Korea + /// * `LI`: Liechtenstein + /// * `LT`: Lithuania + /// * `LU`: Luxembourg + /// * `LV`: Latvia + /// * `MC`: Monaco + /// * `MT`: Malta + /// * `MY`: Malaysia + /// * `NL`: Netherlands + /// * `NO`: Norway + /// * `NZ`: New Zealand + /// * `PL`: Poland + /// * `PT`: Portugal + /// * `RO`: Romania + /// * `SE`: Sweden + /// * `SG`: Singapore + /// * `SI`: Slovenia + /// * `SK`: Slovakia + /// * `SM`: San Marino + /// * `TR`: Turkey + /// * `US`: the United States + /// * `VA`: Vatican + /// + /// Set the callback to get the result: + /// * `0`: success + /// * `1`: failure + /// + public static int SetSystemCountryCode(String countryCode, Action callback) + { + return PXR_EnterprisePlugin.UPxr_SetSystemCountryCode(countryCode, callback); + } + + /// Gets the device's country/region code. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// A string value that indicates the device's current country/region code. + /// For supported country/region codes, see the parameter description in `SetSystemCountryCode`. + public static string GetSystemCountryCode() + { + return PXR_EnterprisePlugin.UPxr_GetSystemCountryCode(); + } + + /// Sets the page to skip in initialization settings. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// Set the flag. + /// The first 6 bits are valid, the 7th to 32rd bits are reserved. For each bit, `0` indicates showing and `1` indicates hiding. + /// * `Constants#INIT_SETTING_HANDLE_CONNECTION_TEACHING`: the controller connection tutorial page + /// * `Constants#INIT_SETTING_TRIGGER_KEY_TEACHING`: the Trigger button tutorial page + /// * `Constants#INIT_SETTING_SELECT_LANGUAGE`: the language selection page + /// * `Constants#INIT_SETTING_SELECT_COUNTRY`: the country/region selection page. Only available for devices in non-Mainland China countries/regions. + /// * `Constants#INIT_SETTING_WIFI_SETTING`: the Wi-Fi settings page + /// * `Constants#INIT_SETTING_QUICK_SETTING`: the quick settings page + /// + /// Below is an example implementation: + /// ```csharp + /// int flag = Constants.INIT_SETTING_HANDLE_CONNECTION_TEACHING | Constants.INIT_SETTING_TRIGGER_KEY_TEACHING; + /// int result = serviceBinder.pbsSetSkipInitSettingPage(flag,0); + /// ``` + /// + /// * `0`: success + /// * `1`: failure + /// + public static int SetSkipInitSettingPage(int flag) + { + return PXR_EnterprisePlugin.UPxr_SetSkipInitSettingPage(flag); + } + + /// Gets the page to skip in initialization settings. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// Returns the flag set in `SetSkipInitSettingPage`. + public static int GetSkipInitSettingPage() + { + return PXR_EnterprisePlugin.UPxr_GetSkipInitSettingPage(); + } + + /// Gets whether the initialization settings have been complete. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// + /// * `0`: not complete + /// * `1`: complete + /// + public static int IsInitSettingComplete() + { + return PXR_EnterprisePlugin.UPxr_IsInitSettingComplete(); + } + + /// Starts an activity in another app. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// (Optional) The app's package name. + /// (Optional) The app's class name. + /// (Optional) The action to be performed. + /// The basic types of standard fields that can be used as extra data. + /// Standard categories that can be used to further clarify an Intent. Add a new category to the intent. + /// Add additional flags to the intent. + /// + /// * `0`: success + /// * `1`: failure + /// + public static int StartActivity(String packageName, String className, String action, String extra, String[] categories, int[] flags) + { + return PXR_EnterprisePlugin.UPxr_StartActivity(packageName, className, action, extra, categories, flags); + } + + /// Shows/hides specified app(s) in the library. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// Package name(s). If there are multiple names, use commas (,) to separate them. + /// Specifies to show/hide the app(s), enums: + /// * `S_ON`: show + /// * `S_OFF`: hide + /// + /// + /// * `0`: success + /// * `1`: failure + /// + public static int CustomizeAppLibrary(String[] packageNames, SwitchEnum switchEnum) + { + return PXR_EnterprisePlugin.UPxr_CustomizeAppLibrary(packageNames, switchEnum); + } + + /// + /// Gets the controller's battery level. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// Returns the following information: + /// * array[0]: the left controller's battery level + /// * array[1]: the right controller's battery level + /// * an integer from 1 to 5, which indicates the battery level, the bigger the integer, the higher the battery level + /// + public static int[] GetControllerBattery() + { + return PXR_EnterprisePlugin.UPxr_GetControllerBattery(); + } + + /// + /// Gets the controller's connection status. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// + /// * `0`: both controllers are disconnected + /// * `1`: the left controller is connected + /// * `2`: the right controller is connected + /// * `3`: both controllers are connected + /// + public static int GetControllerConnectState() + { + return PXR_EnterprisePlugin.UPxr_GetControllerConnectState(); + } + + /// + /// Gets the apps that are hidden in the library. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.4.0 or later. + /// + /// The packages names of hidden apps. Multiple names are separated by commas (,). + public static string GetAppLibraryHideList() + { + return PXR_EnterprisePlugin.UPxr_GetAppLibraryHideList(); + } + + /// + /// Sets the device that outputs audio during screen casting. + /// @note + /// - Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.5.0 or later. + /// - This API is only for miracast. + /// + /// Specifies the device that outputs audio. Enumerations: + /// * `AUDIO_SINK`: the HMD + /// * `AUDIO_TARGET`: the receiver + /// * `AUDIO_SINK_TARGET`: both the HMD and the receiver + /// + /// + /// * `0`: success + /// * `1`: failure + /// + public static int SetScreenCastAudioOutput(ScreencastAudioOutputEnum screencastAudioOutput) + { + return PXR_EnterprisePlugin.UPxr_SetScreenCastAudioOutput(screencastAudioOutput); + } + + /// + /// Gets the device that outputs audio during screen casting. + /// @note + /// - Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.5.0 or later. + /// - This API is only for miracast. + /// + /// + /// Enumerations: + /// * `AUDIO_SINK`: the HMD + /// * `AUDIO_TARGET`: the receiver + /// * `AUDIO_SINK_TARGET`: both the HMD and the receiver + /// + public static ScreencastAudioOutputEnum GetScreenCastAudioOutput() + { + return PXR_EnterprisePlugin.UPxr_GetScreenCastAudioOutput(); + } + + /// + /// Displays or hides the specified tab or option on the Settings pane. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.5.0 or later. + /// + /// Specifies the tab or option to display or hide. Enumerations: + /// * `CUSTOMIZE_SETTINGS_TAB_WLAN`: the "WLAN" tab + /// * `CUSTOMIZE_SETTINGS_TAB_CONTROLLER`: the "Controller" tab + /// * `CUSTOMIZE_SETTINGS_TAB_BLUETOOTH`: the "Bluetooth" tab + /// * `CUSTOMIZE_SETTINGS_TAB_DISPLAY`: the "Display" tab + /// * `CUSTOMIZE_SETTINGS_TAB_LAB`: the "LAB" tab + /// * `CUSTOMIZE_SETTINGS_TAB_GENERAL_FACTORY_RESET`: the "Factory Reset" option on the "General" tab + /// * `CUSTOMIZE_SETTINGS_TAB_GENERAL_LOCKSCREEN`: the "Lock Screen" option on the "General" tab + /// + /// Sets to display or hide the specified tab or option: + /// * `S_ON`: display + /// * `S_OFF`: hide + /// + /// + /// * `0`: success + /// * `1`: failure + /// + public static int UPxr_CustomizeSettingsTabStatus(CustomizeSettingsTabEnum customizeSettingsTabEnum, SwitchEnum switchEnum) + { + return PXR_EnterprisePlugin.UPxr_CustomizeSettingsTabStatus(customizeSettingsTabEnum, switchEnum); + } + + /// + /// Gets the status set for the specified tab or option on the Settings pane. + /// @note Supported by PICO Neo3 Pro and PICO 4 Enterprise with system version 5.5.0 or later. + /// + /// Specifies the tab or option to get status for. Enumerations: + /// * `CUSTOMIZE_SETTINGS_TAB_WLAN`: the "WLAN" tab + /// * `CUSTOMIZE_SETTINGS_TAB_CONTROLLER`: the "Controller" tab + /// * `CUSTOMIZE_SETTINGS_TAB_BLUETOOTH`: the "Bluetooth" tab + /// * `CUSTOMIZE_SETTINGS_TAB_DISPLAY`: the "Display" tab + /// * `CUSTOMIZE_SETTINGS_TAB_LAB`: the "LAB" tab + /// * `CUSTOMIZE_SETTINGS_TAB_GENERAL_FACTORY_RESET`: the "Factory Reset" option on the "General" tab + /// * `CUSTOMIZE_SETTINGS_TAB_GENERAL_LOCKSCREEN`: the "Lock Screen" option on the "General" tab + /// + /// + /// The status of the specified tab or option: + /// * `S_ON`: displayed + /// * `S_OFF`: hidden + /// + public static SwitchEnum UPxr_GetCustomizeSettingsTabStatus(CustomizeSettingsTabEnum customizeSettingsTabEnum) + { + return PXR_EnterprisePlugin.UPxr_GetCustomizeSettingsTabStatus(customizeSettingsTabEnum); + } + + /// + /// Shuts down the PICO device when the USB plug is unplugged or the plug runs out of power. + /// + /// Determines whether to enable/disable this function: + /// * `S_ON`: enable + /// * `S_OFF`: disable + /// + public static void SetPowerOffWithUSBCable(SwitchEnum switchEnum) + { + PXR_EnterprisePlugin.UPxr_SetPowerOffWithUSBCable(switchEnum); + } + /// + /// Removes a specific Home key event setting, which restores the event to its default setting. + /// + /// Specify a Home key event from the following: + /// `PBS_HomeEventEnum. SINGLE_CLICK`: single-click event + /// `PBS_HomeEventEnum. DOUBLE_CLICK`: double-click event + /// `PBS_HomeEventEnum. LONG_PRESS`: long press event + /// `PBS_HomeEventEnum. SINGLE_CLICK_RIGHT_CTL`: single-click on the right controller's Home button + /// `PBS_HomeEventEnum. DOUBLE_CLICK_RIGHT_CTL`: double-click on the right controller's Home button + /// `PBS_HomeEventEnum. LONG_PRESS_RIGHT_CTL`: long press on the right controller's Home button + /// `PBS_HomeEventEnum. SINGLE_CLICK_LEFT_CTL`: single-click on the left controller's Home button + /// `PBS_HomeEventEnum. DOUBLE_CLICK_LEFT_CTL`: double-click on the left controller's Home button + /// `PBS_HomeEventEnum. LONG_PRESS_LEFT_CTL`: long press on the left controller's Home button + /// `PBS_HomeEventEnum. SINGLE_CLICK_HMD`: single-click on the HMD's Home button + /// `PBS_HomeEventEnum. DOUBLE_CLICK_HMD`: double-click on the HMD's Home button + /// `PBS_HomeEventEnum. LONG_PRESS_HMD`: long press on the HMD's Home button + /// + public static void RemoveControllerHomeKey(HomeEventEnum EventEnum) + { + PXR_EnterprisePlugin.UPxr_RemoveControllerHomeKey(EventEnum); + } + + /// + /// Sets the power on logo or the power on/off animation. + /// + /// Specify a setting from the following: + /// * `PBS_PowerOnOffLogoEnum. PLPowerOnLogo`: sets a logo for the first frame after powering on the device + /// * `PBS_PowerOnOffLogoEnum. PLPowerOnAnimation`: sets the power on animation + /// * `PBS_PowerOnOffLogoEnum. PLPowerOffAnimation`: sets the power off animation + /// + /// + /// * For setting a logo for the first frame after powering on the device, pass the path where the .img file is stored, for example, `/sdcard/bootlogo.img`. + /// * For setting the power on/off animation, pass the folder where the pictures composing the animation is stored. + /// + /// Result callback: + /// * `true`: success + /// * `false`: failure + /// + public static void SetPowerOnOffLogo(PowerOnOffLogoEnum powerOnOffLogoEnum, String path, Action callback) + { + PXR_EnterprisePlugin.UPxr_SetPowerOnOffLogo(powerOnOffLogoEnum,path,callback); + } + /// + /// Sets an interpupillary distance (IPD). + /// @note Supported by PICO 4 Enterprise with system version 5.7.0 or later. + /// + /// + /// The IPD to set. Valid value range: [62,72]. Unit: millimeters. + /// + /// Result callback: + /// * `0`: success + /// * `1`: failure + /// * `23`: the `ipd` value is out of the valid range + /// + public static void SetIPD(float ipd, Action callback) + { + PXR_EnterprisePlugin.UPxr_SetIPD(ipd,callback); + } + + /// + /// Gets the device configured for miracast. + /// + /// + /// The name of the device. + /// + public static string GetAutoMiracastConfig() + { + return PXR_EnterprisePlugin.UPxr_GetAutoMiracastConfig(); + } + + /// + /// Sets screencast-related parameters. + /// @note Supported by PICO Neo3 series and PICO 4 Enterprise with system version 5.7.0 or later. + /// + /// + /// The mediaFormat object to set. Currently, only support settings the bitrate. + /// + /// + /// * `0`: success + /// * `1`: failure + /// + public static int SetPicoCastMediaFormat(PicoCastMediaFormat mediaFormat) + { + return PXR_EnterprisePlugin.UPxr_SetPicoCastMediaFormat(mediaFormat); + } + + /// + /// Gets the pose and ID of the marker. + /// @note Supported by 6Dof devices. + /// + /// Specify a tracking origin mode from the following: + /// * `TrackingOriginModeFlags.Device`: Device mode. The system sets the device's initial position as the origin. The device's height from the floor is not calculated. + /// * `TrackingOriginModeFlags.Floor`: Floor mode. The system sets an origin based on the device's original position and the device's height from the floor. + /// @note The PICO Unity OpenXR SDK only supports the `TrackingOriginModeFlags.Device` mode. + /// + /// + /// Set the offset added to the camera's Y direction, which is for simulating a user's height and is only applicable if you select the 'Device' mode. + /// + /// + /// The callback function for returning marker information. + /// + /// + /// * `0`: success + /// * `1`: failure + /// + public static int SetMarkerInfoCallback(TrackingOriginModeFlags trackingMode,float cameraYOffset,Action> markerInfos) + { + return PXR_EnterprisePlugin.UPxr_setMarkerInfoCallback(trackingMode,cameraYOffset,markerInfos); + } + + /// + /// Open RGB camera. + /// @note The PICO Unity OpenXR SDK does not support this API. + /// + /// Whether the RGB camera has been opened: + /// * `true`: success + /// * `false`: failure + /// + public static bool OpenVSTCamera() + { + return PXR_EnterprisePlugin.UPxr_OpenVSTCamera(); + } + + /// + /// Close RGB camera. + /// @note The PICO Unity OpenXR SDK does not support this API. + /// + /// Whether the RGB camera has been closed: + /// * `true`: success + /// * `false`: failure + /// + public static bool CloseVSTCamera() + { + return PXR_EnterprisePlugin.UPxr_CloseVSTCamera(); + } + + /// + /// Get camera parameters(including intrinsics & extrinsics). + /// @note The PICO Unity OpenXR SDK does not support this API. + /// + /// RGBCameraParams including intrinsics and extrinsics. + /// + public static RGBCameraParams GetCameraParameters() + { + return PXR_EnterprisePlugin.UPxr_GetCameraParameters(); + } + + /// + /// Get current head tracking confidence. + /// @note The PICO Unity OpenXR SDK does not support this API. + /// + /// + /// * `0`: bad + /// * `1`: good + /// + public static int GetHeadTrackingConfidence() + { + return PXR_EnterprisePlugin.UPxr_GetHeadTrackingConfidence(); + } + + /// + /// Acquire RGB camera frame,distortion + /// @note The PICO Unity OpenXR SDK does not support this API. + /// + /// [out]frame frame info + /// + /// * `0`: success + /// * other: failure + /// + public static int AcquireVSTCameraFrame(out Frame frame) + { + return PXR_EnterprisePlugin.UPxr_AcquireVSTCameraFrame(out frame); + } + + /// + /// Acquire RGB camera frame,anti-distortion + /// @note The PICO Unity OpenXR SDK does not support this API. + /// + /// [in]width desired frame width,should be less equal than 2328 + /// [in]height desired frame height, should be less equal than 1748 + /// [out]frame frame info + /// + /// * `0`: success + /// * other: failure + /// + public static int AcquireVSTCameraFrameAntiDistortion(int width, int height, out Frame frame) + { + return PXR_EnterprisePlugin.UPxr_AcquireVSTCameraFrameAntiDistortion(width, height, out frame); + } + + /// + /// Gets the predicted display time. + /// @note The PICO Unity OpenXR SDK does not support this API. + /// The predicted display time. + public static double GetPredictedDisplayTime() + { + return PXR_EnterprisePlugin.UPxr_GetPredictedDisplayTime(); + } + + /// + /// Gets the predicted status of the sensor. + /// @note The PICO Unity OpenXR SDK does not support this API. + /// + /// predict time. + /// The predicted status of the sensor. + public static SensorState GetPredictedMainSensorState(double predictTime) + { + return PXR_EnterprisePlugin.UPxr_GetPredictedMainSensorState(predictTime); + } + + /// + /// Directs the user to the floor-height-adjustment app to adjust the floor's height. + /// @note Supported by PICO Neo3 Pro, general PICO Neo3 devices activated as enterprise devices, and PICO 4 Enterprise. + /// + /// + /// * `0`: success + /// * `1`: failure + /// + public static int GotoSeeThroughFloorSetting() + { + return PXR_EnterprisePlugin.UPxr_gotoSeeThroughFloorSetting(); + } + + /// + /// Copies a file or a folder from the source path to the destination path. + /// @note Supported by PICO Neo3 Pro, general PICO Neo3 devices activated as enterprise devices, and PICO 4 Enterprise. + /// + /// + /// The source path of the file or folder. + /// * For mobile storage devices, the prefix of the path is 'udisk://'. For example, the path of the Movie folder under the root directory should be passed as 'udisk://Movie'. + /// * For internal storage paths, directly specify the path under the root directory. For example, the path of the Picture folder under the root directory should be passed as 'Picture'. + /// + /// + /// The destination path that the file or folder is copied to. + /// * For mobile storage devices, the prefix of the path is 'udisk://'. For example, the path of the Movie folder under the root directory should be passed as 'udisk://Movie'. + /// * For internal storage paths, directly write the path under the root directory. For example, the path of the Picture folder under the root directory should be passed as 'Picture'. + /// + /// The result callback: + /// * `onCopyStart`: copy start callback + /// * `onCopyProgress(double process)`: copy progress callback, value range:[0.00, 1.00] + /// * `onCopyFinish(int errorCode)`: `0` (copy succeeded); `101` (USB flash disk is not connected); `103` (insufficient storage space in the target device); `104` (copy failed) + /// + /// + /// * `0`: API call succeeded, wait for copy to start + /// * `101`: USB flash drive is not connected + /// * `102`: source file/folder does not exist + /// * `106`: null parameter + /// + public static int FileCopy(String srcPath, String dstPath, FileCopyCallback callback) + { + return PXR_EnterprisePlugin.UPxr_fileCopy(srcPath, dstPath, callback); + } + + /// + /// Checks whether a map is being used. + /// @note Supported by PICO Neo3 Pro, general PICO Neo3 devices activated as enterprise devices, and PICO 4 Enterprise. + /// + /// The path of the map's zip file. + /// The result callback: + /// * `0`: success + /// * `1`: failure + /// * `101`: file does not exist + /// * `102`: failed to unzip the file + /// * `103`: file corruption + /// * `104`: position tracking is disabled + /// * `106`: failed to get the current map's information + /// * `107`: `path` parameter is null + /// + public static void IsMapInEffect(String path, Action callback) + { + PXR_EnterprisePlugin.UPxr_IsMapInEffect(path, callback); + } + + /// + /// Imports a map. + /// @note Supported by PICO Neo3 Pro, general PICO Neo3 devices activated as enterprise devices, and PICO 4 Enterprise. + /// + /// The path of the map's zip file. + /// The result callback: + /// * `0`: success + /// * `1`: failure + /// * `101`: file does not exist + /// * `102`: failed to unzip the file + /// * `103`: file corruption + /// * `104`: position tracking is disabled + /// * `107`: `path` parameter is null + /// + public static void ImportMapByPath(String path, Action callback) + { + PXR_EnterprisePlugin.UPxr_ImportMapByPath(path, callback); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/PXR_Enterprise.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/PXR_Enterprise.cs.meta new file mode 100644 index 0000000..bbd0fdc --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/PXR_Enterprise.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0ec549f2e9b5b3d48bab5cb6bcf28a7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin.meta new file mode 100644 index 0000000..a3d3817 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b696a6381610a1f46b9bb9ca74202107 +timeCreated: 1685947774 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterprisePlugin.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterprisePlugin.cs new file mode 100644 index 0000000..0464345 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterprisePlugin.cs @@ -0,0 +1,1715 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ +#if (UNITY_ANDROID && !UNITY_EDITOR) +#define PICO_PLATFORM +#endif +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +#if PICO_XR +using Unity.XR.PXR; +#else +using Unity.XR.OpenXR.Features.PICOSupport; +#endif +using UnityEngine; +using UnityEngine.XR; + +namespace Unity.XR.PICO.TOBSupport +{ + public partial class PXR_EnterprisePlugin + { + private const string TAG = "[PXR_EnterprisePlugin]"; + public const int MAX_SIZE = 12208032; + + public static string token; + private static int curSize = 0; + private static bool camOpenned = false; + + private static FrameItemExt antiDistortionFrameItemExt; + private static FrameItemExt distortionFrameItemExt; + private static bool initDistortionFrame; + + [DllImport("libpxr_xrsdk_native", CallingConvention = CallingConvention.Cdecl)] + public static extern int getHeadTrackingConfidence(); + + [DllImport("libpxr_xrsdk_native", CallingConvention = CallingConvention.Cdecl)] + public static extern int openVSTCamera(); + + [DllImport("libpxr_xrsdk_native", CallingConvention = CallingConvention.Cdecl)] + public static extern int closeVSTCamera(); + + [DllImport("libpxr_xrsdk_native", CallingConvention = CallingConvention.Cdecl)] + public static extern int getHeadTrackingData(Int64 predictTime, ref SixDof data, int type); + + [DllImport("libpxr_xrsdk_native", CallingConvention = CallingConvention.Cdecl)] + public static extern int acquireVSTCameraFrame(ref FrameItemExt frame); + + [DllImport("libpxr_xrsdk_native", CallingConvention = CallingConvention.Cdecl)] + public static extern int acquireVSTCameraFrameAntiDistortion(string token, Int32 width, Int32 height, ref FrameItemExt frame); + + [DllImport("libpxr_xrsdk_native", CallingConvention = CallingConvention.Cdecl)] + public static extern int getCameraParameters(string token, out RGBCameraParams rgb_Camera_Params); + +#if PICO_XR + [DllImport("pxr_api", CallingConvention = CallingConvention.Cdecl)] +#else + [DllImport("openxr_pico", EntryPoint = "PICO_GetPredictedDisplayTime", + CallingConvention = CallingConvention.Cdecl)] +#endif + public static extern int Pxr_GetPredictedDisplayTime(ref double predictedDisplayTime); + +#if PICO_XR + [DllImport("pxr_api", CallingConvention = CallingConvention.Cdecl)] +#else + [DllImport("openxr_pico", EntryPoint = "PICO_GetPredictedMainSensorState2", + CallingConvention = CallingConvention.Cdecl)] +#endif + public static extern int Pxr_GetPredictedMainSensorState2(double predictTimeMs, ref PxrSensorState2 sensorState, ref int sensorFrameIndex); + +#if PICO_PLATFORM + private static AndroidJavaClass unityPlayer; + private static AndroidJavaObject currentActivity; + private static AndroidJavaObject tobHelper; + private static AndroidJavaClass tobHelperClass; + private static AndroidJavaObject IToBService; + private static AndroidJavaClass BAuthLib; +#endif + + public static Action BoolCallback; + public static Action IntCallback; + public static Action LongCallback; + public static Action StringCallback; + + private static AndroidJavaObject GetEnumType(Enum enumType) + { + AndroidJavaClass enumjs = + new AndroidJavaClass("com.pvr.tobservice.enums" + enumType.GetType().ToString().Replace("Unity.XR.PICO.TOBSupport.", ".PBS_")); + AndroidJavaObject enumjo = enumjs.GetStatic(enumType.ToString()); + return enumjo; + } + + public static bool UPxr_InitEnterpriseService() + { +#if PICO_PLATFORM + tobHelperClass = new AndroidJavaClass("com.picoxr.tobservice.ToBServiceUtils"); + tobHelper = tobHelperClass.CallStatic("getInstance"); + unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); + currentActivity = unityPlayer.GetStatic("currentActivity"); + BAuthLib = new AndroidJavaClass("com.pvr.tobauthlib.AuthCheckServer"); +#endif + return UPxr_GetToken(); + } + + public static void UPxr_SetBindCallBack(BindCallback mBoolCallback) + { +#if PICO_PLATFORM + tobHelper.Call("setBindCallBack", mBoolCallback); +#endif + } + + public static void UPxr_BindEnterpriseService(Action callback = null) + { +#if PICO_PLATFORM + + UPxr_SetBindCallBack(new BindCallback(callback)); + tobHelper.Call("bindTobService", currentActivity); +#endif + } + + public static void UPxr_UnBindEnterpriseService() + { +#if PICO_PLATFORM + tobHelper.Call("unBindTobService"); +#endif + } + + public static void GetServiceBinder() + { +#if PICO_PLATFORM + IToBService = tobHelper.Call("getServiceBinder"); +#endif + } + + public static string UPxr_StateGetDeviceInfo(SystemInfoEnum type) + { + string result = ""; +#if PICO_PLATFORM + if (IToBService == null) + { + return result; + } + result = IToBService.Call("pbsStateGetDeviceInfo", GetEnumType(type), 0); +#endif + return result; + } + + public static void UPxr_ControlSetDeviceAction(DeviceControlEnum deviceControl, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsControlSetDeviceAction", GetEnumType(deviceControl), new IntCallback(callback)); +#endif + } + + public static void UPxr_ControlAPPManager(PackageControlEnum packageControl, string path, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsControlAPPManger", GetEnumType(packageControl), path, 0, new IntCallback(callback)); +#endif + } + + public static void UPxr_ControlSetAutoConnectWIFI(string ssid, string pwd, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsControlSetAutoConnectWIFI", ssid, pwd, 0, new BoolCallback(callback)); +#endif + } + + public static void UPxr_ControlClearAutoConnectWIFI(Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsControlClearAutoConnectWIFI", new BoolCallback(callback)); +#endif + } + + public static void UPxr_PropertySetHomeKey(HomeEventEnum eventEnum, HomeFunctionEnum function, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsPropertySetHomeKey", GetEnumType(eventEnum), GetEnumType(function), new BoolCallback(callback)); +#endif + } + + public static void UPxr_PropertySetHomeKeyAll(HomeEventEnum eventEnum, HomeFunctionEnum function, int timesetup, string pkg, string className, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsPropertySetHomeKeyAll", GetEnumType(eventEnum), GetEnumType(function), timesetup, pkg, + className, new BoolCallback(callback)); +#endif + } + + public static void UPxr_PropertyDisablePowerKey(bool isSingleTap, bool enable, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsPropertyDisablePowerKey", isSingleTap, enable, new IntCallback(callback)); +#endif + } + + public static void UPxr_PropertySetScreenOffDelay(ScreenOffDelayTimeEnum timeEnum, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsPropertySetScreenOffDelay", GetEnumType(timeEnum), new IntCallback(callback)); +#endif + } + + public static void UPxr_PropertySetSleepDelay(SleepDelayTimeEnum timeEnum) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + + IToBService.Call("pbsPropertySetSleepDelay", GetEnumType(timeEnum)); +#endif + } + + public static void UPxr_SwitchSystemFunction(SystemFunctionSwitchEnum systemFunction, SwitchEnum switchEnum) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsSwitchSystemFunction", GetEnumType(systemFunction), GetEnumType(switchEnum), 0); +#endif + } + + public static void UPxr_SwitchSetUsbConfigurationOption(USBConfigModeEnum uSBConfigModeEnum) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsSwitchSetUsbConfigurationOption", GetEnumType(uSBConfigModeEnum), 0); +#endif + } + + public static void UPxr_SetControllerPairTime(ControllerPairTimeEnum timeEnum, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsSetControllerPairTime", GetEnumType(timeEnum),new IntCallback(callback), 0); +#endif + } + + public static void UPxr_GetControllerPairTime(Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsGetControllerPairTime",new IntCallback(callback), 0); +#endif + } + + public static void UPxr_ScreenOn() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsScreenOn"); +#endif + } + + public static void UPxr_ScreenOff() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsScreenOff"); +#endif + } + + public static void UPxr_AcquireWakeLock() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsAcquireWakeLock"); +#endif + } + + public static void UPxr_ReleaseWakeLock() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsReleaseWakeLock"); +#endif + } + + public static void UPxr_EnableEnterKey() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsEnableEnterKey"); +#endif + } + + public static void UPxr_DisableEnterKey() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsDisableEnterKey"); +#endif + } + + public static void UPxr_EnableVolumeKey() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsEnableVolumeKey"); +#endif + } + + public static void UPxr_DisableVolumeKey() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsDisableVolumeKey"); +#endif + } + + public static void UPxr_EnableBackKey() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsEnableBackKey"); +#endif + } + + public static void UPxr_DisableBackKey() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsDisableBackKey"); +#endif + } + + + public static void UPxr_ResetAllKeyToDefault(Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsResetAllKeyToDefault", new BoolCallback(callback)); +#endif + } + + public static void UPxr_SetAPPAsHome(SwitchEnum switchEnum, string packageName) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsAppSetAPPAsHomeTwo", GetEnumType(switchEnum), packageName); +#endif + } + + public static void UPxr_KillAppsByPidOrPackageName(int[] pids, string[] packageNames) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsKillAppsByPidOrPackageName", pids, packageNames, 0); +#endif + } + + public static void UPxr_KillBackgroundAppsWithWhiteList(string[] packageNames) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsKillBackgroundAppsWithWhiteList",packageNames, 0); +#endif + } + + public static void UPxr_FreezeScreen(bool freeze) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsFreezeScreen", freeze); +#endif + } + + public static void UPxr_OpenMiracast() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsOpenMiracast"); +#endif + } + + public static bool UPxr_IsMiracastOn() + { + bool value = false; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsIsMiracastOn"); +#endif + return value; + } + + public static void UPxr_CloseMiracast() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsCloseMiracast"); +#endif + } + + public static void UPxr_StartScan() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsStartScan"); +#endif + } + + public static void UPxr_StopScan() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsStopScan"); +#endif + } + + public static void UPxr_ConnectWifiDisplay(string modelJson) + { +#if PICO_PLATFORM + tobHelper.Call("pbsConnectWifiDisplay", modelJson); +#endif + } + + public static void UPxr_DisConnectWifiDisplay() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsDisConnectWifiDisplay"); +#endif + } + + public static void UPxr_ForgetWifiDisplay(string address) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsForgetWifiDisplay", address); +#endif + } + + public static void UPxr_RenameWifiDisplay(string address, string newName) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsRenameWifiDisplay", address, newName); +#endif + } + + public static void UPxr_SetWDModelsCallback(Action> callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsSetWDModelsCallback", new WifiDisplayModelCallback(callback)); +#endif + } + + public static void UPxr_SetWDJsonCallback(Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsSetWDJsonCallback", new StringCallback(callback)); +#endif + } + + public static void UPxr_UpdateWifiDisplays() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return; + } + IToBService.Call("pbsUpdateWifiDisplays"); +#endif + } + + public static string UPxr_GetConnectedWD() + { + string result = ""; +#if PICO_PLATFORM + result = tobHelper.Call("pbsGetConnectedWD"); +#endif + return result; + } + + public static void UPxr_SwitchLargeSpaceScene(bool open, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsSwitchLargeSpaceScene", new BoolCallback(callback), open, 0); +#endif + } + + public static void UPxr_GetSwitchLargeSpaceStatus(Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsGetSwitchLargeSpaceStatus",new StringCallback(callback), 0); +#endif + } + + public static bool UPxr_SaveLargeSpaceMaps() + { + bool value = false; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + value = IToBService.Call("pbsSaveLargeSpaceMaps", 0); +#endif + return value; + } + + public static void UPxr_ExportMaps(Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsExportMaps", new BoolCallback(callback), 0); +#endif + } + + public static void UPxr_ImportMaps(Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsImportMaps", new BoolCallback(callback), 0); +#endif + } + + public static float[] UPxr_GetCpuUsages() + { + float[] data = null; +#if PICO_PLATFORM + data = tobHelper.Call("pbsGetCpuUsages"); +#endif + return data; + } + + public static float[] UPxr_GetDeviceTemperatures(int type, int source) + { + float[] data = null; +#if PICO_PLATFORM + if (IToBService == null) + { + return null; + } + + data = IToBService.Call("pbsGetDeviceTemperatures", type, source); +#endif + + return data; + } + + public static void UPxr_Capture() + { +#if PICO_PLATFORM + IToBService.Call("pbsCapture"); +#endif + } + + public static void UPxr_Record() + { +#if PICO_PLATFORM + IToBService.Call("pbsRecord"); +#endif + } + + public static void UPxr_ControlSetAutoConnectWIFIWithErrorCodeCallback(String ssid, String pwd, int ext, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsControlSetAutoConnectWIFIWithErrorCodeCallback",ssid,pwd,ext,new IntCallback(callback)); +#endif + } + + public static void UPxr_AppKeepAlive(String appPackageName, bool keepAlive, int ext) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return ; + } + IToBService.Call("pbsAppKeepAlive",appPackageName,keepAlive,ext); +#endif + } + + public static void UPxr_TimingStartup(int year, int month, int day, int hour, int minute, bool open) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return ; + } + IToBService.Call("pbsTimingStartup", year, month, day, hour, minute, open); +#endif + } + + public static void UPxr_TimingShutdown(int year, int month, int day, int hour, int minute, bool open) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return ; + } + IToBService.Call("pbsTimingShutdown", year, month, day, hour, minute, open); +#endif + } + + public static void UPxr_StartVrSettingsItem(StartVRSettingsEnum settingsEnum, bool hideOtherItem, int ext) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return ; + } + IToBService.Call("pbsStartVrSettingsItem", GetEnumType(settingsEnum), hideOtherItem, ext); +#endif + } + + public static void UPxr_SwitchVolumeToHomeAndEnter(SwitchEnum switchEnum, int ext) + { +#if PICO_PLATFORM + if (IToBService == null) + { + return ; + } + IToBService.Call("pbsSwitchVolumeToHomeAndEnter", GetEnumType(switchEnum), ext); +#endif + } + + public static SwitchEnum UPxr_IsVolumeChangeToHomeAndEnter() + { + SwitchEnum switchEnum = SwitchEnum.S_OFF; +#if PICO_PLATFORM + int num = 0; + num = tobHelper.Call("pbsIsVolumeChangeToHomeAndEnter"); + if (num == 0) + { + switchEnum = SwitchEnum.S_ON; + } + else if (num == 1) { + switchEnum = SwitchEnum.S_OFF; + } +#endif + return switchEnum; + } + + public static int UPxr_InstallOTAPackage(String otaPackagePath) + { + int value = 0; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsInstallOTAPackage",otaPackagePath, 0); +#endif + return value; + } + + public static string UPxr_GetAutoConnectWiFiConfig() + { + string value= ""; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsGetAutoConnectWiFiConfig", 0); +#endif + return value; + } + + public static string UPxr_GetTimingStartupStatus() + { + string value = ""; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsGetTimingStartupStatus", 0); +#endif + return value; + } + + public static string UPxr_GetTimingShutdownStatus() + { + string value = ""; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsGetTimingShutdownStatus", 0); +#endif + return value; + } + + public static int UPxr_GetControllerKeyState(ControllerKeyEnum pxrControllerKey) + { + int value = 1; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsGetControllerKeyState", GetEnumType(pxrControllerKey),0); +#endif + return value; + } + + public static int UPxr_SetControllerKeyState(ControllerKeyEnum controllerKeyEnum, SwitchEnum status) + { + int value = 1; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsSetControllerKeyState", GetEnumType(controllerKeyEnum),GetEnumType(status),0); +#endif + return value; + } + + public static SwitchEnum UPxr_ControlGetPowerOffWithUSBCable() + { + SwitchEnum switchEnum = SwitchEnum.S_OFF; +#if PICO_PLATFORM + int num = 0; + num = tobHelper.Call("pbsControlGetPowerOffWithUSBCable",0); + if (num == 0) + { + switchEnum = SwitchEnum.S_ON; + } + else if (num == 1) { + switchEnum = SwitchEnum.S_OFF; + } +#endif + return switchEnum; + } + + public static ScreenOffDelayTimeEnum UPxr_PropertyGetScreenOffDelay() + { + ScreenOffDelayTimeEnum screenOffDelayTimeEnum = ScreenOffDelayTimeEnum.NEVER; +#if PICO_PLATFORM + int num = 0; + num = tobHelper.Call("pbsPropertyGetScreenOffDelay", 0); + switch (num) { + case 0: + screenOffDelayTimeEnum = ScreenOffDelayTimeEnum.THREE; + break; + case 1: + screenOffDelayTimeEnum = ScreenOffDelayTimeEnum.TEN; + break; + case 2: + screenOffDelayTimeEnum = ScreenOffDelayTimeEnum.THIRTY; + break; + case 3: + screenOffDelayTimeEnum = ScreenOffDelayTimeEnum.SIXTY; + break; + case 4: + screenOffDelayTimeEnum = ScreenOffDelayTimeEnum.THREE_HUNDRED; + break; + case 5: + screenOffDelayTimeEnum = ScreenOffDelayTimeEnum.SIX_HUNDRED; + break; + case 6: + screenOffDelayTimeEnum = ScreenOffDelayTimeEnum.NEVER; + break; + } +#endif + return screenOffDelayTimeEnum; + } + + public static SleepDelayTimeEnum UPxr_PropertyGetSleepDelay() + { + SleepDelayTimeEnum sleepDelayTime = SleepDelayTimeEnum.NEVER; +#if PICO_PLATFORM + int num = 0; + num = tobHelper.Call("pbsPropertyGetSleepDelay", 0); + switch (num) + { + case 0: + sleepDelayTime = SleepDelayTimeEnum.FIFTEEN; + break; + case 1: + sleepDelayTime = SleepDelayTimeEnum.THIRTY; + break; + case 2: + sleepDelayTime = SleepDelayTimeEnum.SIXTY; + break; + case 3: + sleepDelayTime = SleepDelayTimeEnum.THREE_HUNDRED; + break; + case 4: + sleepDelayTime = SleepDelayTimeEnum.SIX_HUNDRED; + break; + case 5: + sleepDelayTime = SleepDelayTimeEnum.ONE_THOUSAND_AND_EIGHT_HUNDRED; + break; + case 6: + sleepDelayTime = SleepDelayTimeEnum.NEVER; + break; + } +#endif + return sleepDelayTime; + } + + public static string UPxr_PropertyGetPowerKeyStatus() + { + string value = ""; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsPropertyGetPowerKeyStatus", 0); +#endif + return value; + } + + public static int UPxr_GetEnterKeyStatus() + { + int value = 1; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsGetEnterKeyStatus",0); +#endif + return value; + } + + public static int UPxr_GetVolumeKeyStatus() + { + int value = 1; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsGetVolumeKeyStatus",0); +#endif + return value; + } + + public static int UPxr_GetBackKeyStatus() + { + int value = 1; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsGetBackKeyStatus",0); +#endif + return value; + } + + public static string UPxr_PropertyGetHomeKeyStatus(HomeEventEnum homeEvent) + { + string value = ""; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsPropertyGetHomKeyStatus", GetEnumType(homeEvent),0); +#endif + return value; + } + + public static void UPxr_GetSwitchSystemFunctionStatus(SystemFunctionSwitchEnum systemFunction, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsGetSwitchSystemFunctionStatus", GetEnumType(systemFunction), new IntCallback(callback), + 0); +#endif + } + + public static string UPxr_SwitchGetUsbConfigurationOption() + { + string value = ""; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsSwitchGetUsbConfigurationOption", 0); +#endif + return value; + } + + public static string UPxr_GetCurrentLauncher() + { + string value = ""; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsGetCurrentLauncher", 0); +#endif + return value; + } + + public static int UPxr_PICOCastInit(Action callback) + { + int value = 0; +#if PICO_PLATFORM + value = tobHelper.Call("pbsPicoCastInit", new IntCallback(callback), 0); +#endif + return value; + } + + public static int UPxr_PICOCastSetShowAuthorization(int authZ) + { + int value = 0; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsPicoCastSetShowAuthorization",authZ,0); +#endif + return value; + } + + public static int UPxr_PICOCastGetShowAuthorization() + { + int value = 0; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + value = IToBService.Call("pbsPicoCastGetShowAuthorization",0); +#endif + return value; + } + + public static string UPxr_PICOCastGetUrl(PICOCastUrlTypeEnum urlType) + { + string value = ""; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + value = IToBService.Call("pbsPicoCastGetUrl",GetEnumType(urlType), 0); +#endif + return value; + } + + public static int UPxr_PICOCastStopCast() + { + int value = 0; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + value = IToBService.Call("pbsPicoCastStopCast",0); +#endif + return value; + } + + public static int UPxr_PICOCastSetOption(PICOCastOptionOrStatusEnum castOptionOrStatus, PICOCastOptionValueEnum castOptionValue) + { + int value = 0; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + value = IToBService.Call("pbsPicoCastSetOption",GetEnumType(castOptionOrStatus),GetEnumType(castOptionValue),0); +#endif + return value; + } + + public static PICOCastOptionValueEnum UPxr_PICOCastGetOptionOrStatus(PICOCastOptionOrStatusEnum castOptionOrStatus) + { + PICOCastOptionValueEnum value = PICOCastOptionValueEnum.STATUS_VALUE_ERROR; +#if PICO_PLATFORM + int num = 0; + if (tobHelper == null) + { + return value; + } + num = tobHelper.Call("pbsPicoCastGetOptionOrStatus", GetEnumType(castOptionOrStatus), 0); + switch (num) + { + case 0: + value = PICOCastOptionValueEnum.OPTION_VALUE_RESOLUTION_HIGH; + break; + case 1: + value = PICOCastOptionValueEnum.OPTION_VALUE_RESOLUTION_MIDDLE; + break; + case 2: + value = PICOCastOptionValueEnum.OPTION_VALUE_RESOLUTION_AUTO; + break; + case 3: + value = PICOCastOptionValueEnum.OPTION_VALUE_RESOLUTION_HIGH_2K; + break; + case 4: + value = PICOCastOptionValueEnum.OPTION_VALUE_RESOLUTION_HIGH_4K; + break; + case 5: + value = PICOCastOptionValueEnum.OPTION_VALUE_BITRATE_HIGH; + break; + case 6: + value = PICOCastOptionValueEnum.OPTION_VALUE_BITRATE_MIDDLE; + break; + case 7: + value = PICOCastOptionValueEnum.OPTION_VALUE_BITRATE_LOW; + break; + case 8: + value = PICOCastOptionValueEnum.OPTION_VALUE_AUDIO_ON; + break; + case 9: + value = PICOCastOptionValueEnum.OPTION_VALUE_AUDIO_OFF; + break; + case 10: + value = PICOCastOptionValueEnum.STATUS_VALUE_STATE_STARTED; + break; + case 11: + value = PICOCastOptionValueEnum.STATUS_VALUE_STATE_STOPPED; + break; + case 12: + value = PICOCastOptionValueEnum.STATUS_VALUE_ERROR; + break; + } +#endif + return value; + } + + public static int UPxr_SetSystemLanguage(String language) + { + int num = 0; +#if PICO_PLATFORM + num = IToBService.Call("pbsSetSystemLanguage", language, 0); +#endif + return num; + } + + public static String UPxr_GetSystemLanguage() + { + string value = ""; +#if PICO_PLATFORM + value = IToBService.Call("pbsGetSystemLanguage", 0); +#endif + return value; + } + + public static int UPxr_ConfigWifi(String ssid, String pwd) + { + int num = 0; +#if PICO_PLATFORM + num = IToBService.Call("pbsConfigWifi",ssid,pwd, 0); +#endif + return num; + } + + public static String[] UPxr_GetConfiguredWifi() + { +#if PICO_PLATFORM + return IToBService.Call("pbsGetConfiguredWifi",0); +#endif + return null; + } + + public static int UPxr_SetSystemCountryCode(String countryCode, Action callback) + { + int num = 0; +#if PICO_PLATFORM + num = tobHelper.Call("pbsSetSystemCountryCode",countryCode,new IntCallback(callback),0); +#endif + return num; + } + + public static string UPxr_GetSystemCountryCode() + { + string value = ""; +#if PICO_PLATFORM + value = IToBService.Call("pbsGetSystemCountryCode",0); +#endif + return value; + } + + public static int UPxr_SetSkipInitSettingPage(int flag) + { + int num = 0; +#if PICO_PLATFORM + num = IToBService.Call("pbsSetSkipInitSettingPage",flag,0); +#endif + return num; + } + + public static int UPxr_GetSkipInitSettingPage() + { + int num = 0; +#if PICO_PLATFORM + num = IToBService.Call("pbsGetSkipInitSettingPage",0); +#endif + return num; + } + + public static int UPxr_IsInitSettingComplete() + { + int num = 0; +#if PICO_PLATFORM + num = IToBService.Call("pbsIsInitSettingComplete",0); +#endif + return num; + } + + public static int UPxr_StartActivity(String packageName, String className, String action, String extra, String[] categories, int[] flags) + { + int num = 0; +#if PICO_PLATFORM + num = IToBService.Call("pbsStartActivity", packageName, className, action, extra, categories, flags, 0); +#endif + + return num; + } + + public static int UPxr_CustomizeAppLibrary(String[] packageNames, SwitchEnum switchEnum) + { + int num = 0; +#if PICO_PLATFORM + if (IToBService == null) + { + return num; + } + num = IToBService.Call("pbsCustomizeAppLibrary", packageNames,GetEnumType(switchEnum), 0); +#endif + return num; + } + + public static int[] UPxr_GetControllerBattery() + { +#if PICO_PLATFORM + if (IToBService == null) + { + return null; + } + return IToBService.Call("pbsGetControllerBattery", 0); +#endif + return null; + } + + public static int UPxr_GetControllerConnectState() + { + int num = 0; +#if PICO_PLATFORM + if (IToBService == null) + { + return num; + } + num = IToBService.Call("pbsGetControllerConnectState",0); +#endif + return num; + } + + public static string UPxr_GetAppLibraryHideList() + { + string value = " "; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsGetAppLibraryHideList",0); +#endif + return value; + } + + public static int UPxr_SetScreenCastAudioOutput(ScreencastAudioOutputEnum screencastAudioOutput) + { + int value = 0; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsSetScreenCastAudioOutput",GetEnumType(screencastAudioOutput),0); +#endif + return value; + } + + public static ScreencastAudioOutputEnum UPxr_GetScreenCastAudioOutput() + { + ScreencastAudioOutputEnum value = ScreencastAudioOutputEnum.AUDIO_ERROR; +#if PICO_PLATFORM + int num = 0; + num = tobHelper.Call("pbsGetScreenCastAudioOutput",0); + switch (num) + { + case 0: + value = ScreencastAudioOutputEnum.AUDIO_SINK; + break; + case 1: + value = ScreencastAudioOutputEnum.AUDIO_TARGET; + break; + case 2: + value = ScreencastAudioOutputEnum.AUDIO_SINK_TARGET; + break; + } +#endif + return value; + } + + public static int UPxr_CustomizeSettingsTabStatus(CustomizeSettingsTabEnum customizeSettingsTabEnum, SwitchEnum switchEnum) + { + int value = 0; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + + value = IToBService.Call("pbsCustomizeSettingsTabStatus", GetEnumType(customizeSettingsTabEnum), GetEnumType(switchEnum), 0); +#endif + return value; + } + + public static SwitchEnum UPxr_GetCustomizeSettingsTabStatus(CustomizeSettingsTabEnum customizeSettingsTabEnum) + { + SwitchEnum switchEnum = SwitchEnum.S_OFF; +#if PICO_PLATFORM + int num = 0; + num = tobHelper.Call("pbsGetCustomizeSettingsTabStatus",GetEnumType(customizeSettingsTabEnum),0); + if (num == 0) + { + switchEnum = SwitchEnum.S_ON; + } + else if (num == 1) { + switchEnum = SwitchEnum.S_OFF; + } +#endif + return switchEnum; + } + + public static void UPxr_SetPowerOffWithUSBCable(SwitchEnum switchEnum) + { + +#if PICO_PLATFORM + if (IToBService==null) + { + return; + } + IToBService.Call("pbsControlSetPowerOffwithUSBCable", GetEnumType(switchEnum),0); +#endif + } + public static void UPxr_RemoveControllerHomeKey(HomeEventEnum EventEnum) + { +#if PICO_PLATFORM + if (IToBService==null) + { + return; + } + IToBService.Call("pbsRemoveControllerHomeKey", GetEnumType(EventEnum)); +#endif + } + public static void UPxr_SetPowerOnOffLogo(PowerOnOffLogoEnum powerOnOffLogoEnum, String path, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsPropertySetPowerOnOffLogo",GetEnumType(powerOnOffLogoEnum),path,0, new BoolCallback(callback)); +#endif + } + public static void UPxr_SetIPD(float ipd, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("pbsSetIPD",ipd, new IntCallback(callback)); +#endif + } + + public static string UPxr_GetAutoMiracastConfig() + { + string value = " "; +#if PICO_PLATFORM + if (IToBService == null) + { + return value; + } + value = IToBService.Call("pbsGetAutoMiracastConfig",0); +#endif + return value; + } + public static int UPxr_SetPicoCastMediaFormat(PicoCastMediaFormat mediaFormat) + { + int value = -1; +#if PICO_PLATFORM + value = tobHelper.Call("setPicoCastMediaFormat",mediaFormat.bitrate,0); +#endif + return value; + } + + public static int UPxr_setMarkerInfoCallback(TrackingOriginModeFlags trackingMode,float cameraYOffset,Action> mediaFormat) + { + int value = -1; + +#if PICO_PLATFORM + value = tobHelper.Call("setMarkerInfoCallback",new MarkerInfoCallback(trackingMode,cameraYOffset,mediaFormat)); +#endif + return value; + } + + + private static bool UPxr_GetToken() + { + PLog.i(TAG, "GetToken Start"); +#if PICO_PLATFORM + token = BAuthLib.CallStatic("featureAuthByToken", currentActivity, "getCameraInfo"); +#endif + if (string.IsNullOrEmpty(token)) + { + PLog.e(TAG, "Failed to obtain token, camera data cannot be obtained!"); + return false; + } + PLog.i(TAG, "GetToken End token :" + token); + return true; + } + + public static int UPxr_GetHeadTrackingConfidence() + { + PLog.d(TAG, "GetHeadTrackingConfidence Start"); + int result = -1; +#if PICO_PLATFORM + result = getHeadTrackingConfidence(); +#endif + PLog.d(TAG, "GetToken End result :" + result); + + return result; + } + + public static bool UPxr_OpenVSTCamera() + { + PLog.d(TAG, "OpenVSTCamera Start"); + if (camOpenned) + { + PLog.d(TAG, "Camera has Openned!"); + return true; + } + + int result = -1; +#if PICO_PLATFORM + result = openVSTCamera(); +#endif + camOpenned = result == 0; + PLog.d(TAG, "OpenVSTCamera End result :" + result + ", camOpenned : " + camOpenned); + return result == 0; + } + + public static bool UPxr_CloseVSTCamera() + { + PLog.d(TAG, "CloseVSTCamera Start"); + if (!camOpenned) + { + PLog.d(TAG, "Camera has Closed!"); + return true; + } + + int result = -1; +#if PICO_PLATFORM + result = closeVSTCamera(); +#endif + camOpenned = !(result == 0); + PLog.d(TAG, "CloseVSTCamera End result :" + result + ", camOpenned : " + camOpenned); + return result == 0; + } + + public static int UPxr_GetHeadTrackingData(Int64 predictTime, ref SixDof data, int type) + { + PLog.d(TAG, "GetHeadTrackingData Start"); + int result = -1; +#if PICO_PLATFORM + result = getHeadTrackingData(predictTime, ref data, type); +#endif + PLog.d(TAG, "GetHeadTrackingData End result :" + result); + + return result; + } + + public static int UPxr_AcquireVSTCameraFrame(out Frame frame) + { + PLog.d(TAG, "AcquireVSTCameraFrame Start"); + frame = new Frame(); + if (string.IsNullOrEmpty(token)) + { + PLog.e(TAG, "Failed to obtain token, camera data cannot be obtained!"); + return -1; + } + + if (!camOpenned) + { + PLog.e(TAG, "Failed to obtain data due to camera not being turned on!"); + return -1; + } + + InitDistortionFrame(); + int result = -1; +#if PICO_PLATFORM + result = acquireVSTCameraFrame(ref distortionFrameItemExt); +#endif + frame.width = distortionFrameItemExt.frame.width; + frame.height = distortionFrameItemExt.frame.height; + frame.timestamp = distortionFrameItemExt.frame.timestamp; + frame.datasize = distortionFrameItemExt.frame.datasize; + frame.data = distortionFrameItemExt.frame.data; + + if (frame.pose != null) + { + frame.pose.position.x = (float)distortionFrameItemExt.six_dof_pose.pose.x; + frame.pose.position.y = (float)distortionFrameItemExt.six_dof_pose.pose.y; + frame.pose.position.z = (float)distortionFrameItemExt.six_dof_pose.pose.z; + frame.pose.rotation.w = (float)distortionFrameItemExt.six_dof_pose.pose.rw; + frame.pose.rotation.x = (float)distortionFrameItemExt.six_dof_pose.pose.rx; + frame.pose.rotation.y = (float)distortionFrameItemExt.six_dof_pose.pose.ry; + frame.pose.rotation.z = (float)distortionFrameItemExt.six_dof_pose.pose.rz; + } + frame.status = distortionFrameItemExt.six_dof_pose.pose.confidence; + + PLog.d(TAG, "AcquireVSTCameraFrame End result :" + result); + return result; + } + + public static int UPxr_AcquireVSTCameraFrameAntiDistortion(int width, int height, out Frame frame) + { + PLog.d(TAG, "AcquireVSTCameraFrameAntiDistortion Start width:" + width + ", height:" + height); + frame = new Frame(); + if (string.IsNullOrEmpty(token)) + { + PLog.e(TAG, "Failed to obtain token, camera data cannot be obtained!"); + return -1; + } + + if (!camOpenned) + { + PLog.e(TAG, "Failed to obtain data due to camera not being turned on!"); + return -1; + } + + int size = width * height * 3; + InitAntiDistortionFrame(size); + int result = -1; +#if PICO_PLATFORM + result = acquireVSTCameraFrameAntiDistortion(token, width, height, ref antiDistortionFrameItemExt); +#endif + PLog.d(TAG, "AcquireVSTCameraFrameAntiDistortion End result :" + result + + ", width : " + antiDistortionFrameItemExt.frame.width + + ", height : " + antiDistortionFrameItemExt.frame.height + + ", datasize : " + antiDistortionFrameItemExt.frame.datasize + + ", data : " + antiDistortionFrameItemExt.frame.data + + ", confidence : " + antiDistortionFrameItemExt.six_dof_pose.pose.confidence); + + frame.width = antiDistortionFrameItemExt.frame.width; + frame.height = antiDistortionFrameItemExt.frame.height; + frame.timestamp = antiDistortionFrameItemExt.frame.timestamp; + frame.datasize = antiDistortionFrameItemExt.frame.datasize; + frame.data = antiDistortionFrameItemExt.frame.data; + + if (frame.pose != null) + { + frame.pose.position.x = (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.x; + frame.pose.position.y = (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.y; + frame.pose.position.z = (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.z; + frame.pose.rotation.w = (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.rw; + frame.pose.rotation.x = (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.rx; + frame.pose.rotation.y = (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.ry; + frame.pose.rotation.z = (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.rz; + } + frame.status = antiDistortionFrameItemExt.six_dof_pose.relocation_pose.confidence; + + PLog.d(TAG, "zzzzzz relocation_pose.x=" + (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.x + + ", relocation_pose.y=" + (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.y + + ", relocation_pose.z=: " + (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.z + + ", relocation_pose.rw=: " + (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.rw + + ", relocation_pose.rx = " + (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.rx + + ", relocation_pose.ry = " + (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.ry + + ", relocation_pose.rz = " + (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.rz); + PLog.d(TAG, "zzzzzz pose.x=" + (float)antiDistortionFrameItemExt.six_dof_pose.relocation_pose.x + + ", pose.y=" + (float)antiDistortionFrameItemExt.six_dof_pose.pose.y + + ", relocation_pose.z=: " + (float)antiDistortionFrameItemExt.six_dof_pose.pose.z + + ", pose.rw=: " + (float)antiDistortionFrameItemExt.six_dof_pose.pose.rw + + ", pose.rx = " + (float)antiDistortionFrameItemExt.six_dof_pose.pose.rx + + ", pose.ry = " + (float)antiDistortionFrameItemExt.six_dof_pose.pose.ry + + ", pose.rz = " + (float)antiDistortionFrameItemExt.six_dof_pose.pose.rz); + return result; + } + + public static UnityEngine.Pose ToUnityPose(UnityEngine.Pose poseR) + { + UnityEngine.Pose poseL; + poseL.position.x = poseR.position.x; + poseL.position.y = poseR.position.y; + poseL.position.z = -poseR.position.z; + poseL.rotation.x = poseR.rotation.x; + poseL.rotation.y = poseR.rotation.y; + poseL.rotation.z = -poseR.rotation.z; + poseL.rotation.w = -poseR.rotation.w; + return poseL; + } + + // RGB Camera pose (Left-handed coordinate system: X right, Y up, Z out) + public static UnityEngine.Pose ToRGBCameraPose(RGBCameraParams cameraParams, UnityEngine.Pose headPose) + { + Vector3 headToCameraPos = new Vector3((float)cameraParams.x, (float)cameraParams.y, (float)cameraParams.z); + Quaternion headToCameraRot = new Quaternion((float)cameraParams.rx, (float)cameraParams.ry, (float)cameraParams.rz, (float)cameraParams.rw); + + Matrix4x4 headMx = Matrix4x4.TRS(headPose.position, headPose.rotation, Vector3.one); + Matrix4x4 cameraMx = Matrix4x4.TRS(headToCameraPos, headToCameraRot, Vector3.one); + Matrix4x4 rgbMx = headMx * cameraMx; + Matrix4x4 rotX180 = Matrix4x4.Rotate(Quaternion.Euler(180f, 0f, 0f)); + rgbMx *= rotX180; +#if UNITY_2021_2_OR_NEWER + UnityEngine.Pose rgbCameraPose = ToUnityPose(new UnityEngine.Pose(rgbMx.GetPosition(), rgbMx.rotation)); +#else + UnityEngine.Pose rgbCameraPose = ToUnityPose(new UnityEngine.Pose(new Vector3(rgbMx.m03, rgbMx.m13, rgbMx.m23), rgbMx.rotation)); +#endif + return rgbCameraPose; + } + + private static void InitDistortionFrame() + { + if (initDistortionFrame) + { + return; + } + distortionFrameItemExt = new FrameItemExt(); + initDistortionFrame = true; + } + + private static void InitAntiDistortionFrame(int size) + { + if (curSize == size) + { + return; + } + Debug.LogFormat("InitAntiDistortionFrame curSize={0}, size={1}", curSize, size); + antiDistortionFrameItemExt = new FrameItemExt(); + if (antiDistortionFrameItemExt.frame.data != IntPtr.Zero) + { + Marshal.FreeHGlobal(antiDistortionFrameItemExt.frame.data); + antiDistortionFrameItemExt.frame.data = IntPtr.Zero; + } + antiDistortionFrameItemExt.frame.data = Marshal.AllocHGlobal(size); + curSize = size; + } + + public static RGBCameraParams UPxr_GetCameraParameters() + { + PLog.d(TAG, "GetCameraParameters Start"); + RGBCameraParams rgbCameraParams = new RGBCameraParams(); + if (string.IsNullOrEmpty(token)) + { + PLog.e(TAG, "Failed to obtain token, camera data cannot be obtained!"); + return rgbCameraParams; + } + int result = getCameraParameters(token, out rgbCameraParams); + PLog.d(TAG, "GetCameraParameters End result :" + result); + + return rgbCameraParams; + } + + public static double UPxr_GetPredictedDisplayTime() + { + PLog.d(TAG, "UPxr_GetPredictedDisplayTime()"); + double predictedDisplayTime = 0; +#if PICO_PLATFORM + Pxr_GetPredictedDisplayTime(ref predictedDisplayTime); +#endif + PLog.d(TAG, "UPxr_GetPredictedDisplayTime() predictedDisplayTime:" + predictedDisplayTime); + return predictedDisplayTime; + } + + public static SensorState UPxr_GetPredictedMainSensorState(double predictTime) + { + SensorState sensorState = new SensorState(); + PxrSensorState2 sensorState2 = new PxrSensorState2(); + int sensorFrameIndex = 0; +#if PICO_PLATFORM + Pxr_GetPredictedMainSensorState2(predictTime, ref sensorState2, ref sensorFrameIndex); +#endif + sensorState.status = sensorState2.status == 3 ? 1 : 0; + sensorState.pose.position.x = sensorState2.pose.position.x; + sensorState.pose.position.y = sensorState2.pose.position.y; + sensorState.pose.position.z = sensorState2.pose.position.z; + sensorState.pose.rotation.x = sensorState2.pose.orientation.x; + sensorState.pose.rotation.y = sensorState2.pose.orientation.y; + sensorState.pose.rotation.z = sensorState2.pose.orientation.z; + sensorState.pose.rotation.w = sensorState2.pose.orientation.w; + return sensorState; + } + + public static int UPxr_gotoSeeThroughFloorSetting() + { + int value = -1; + +#if PICO_PLATFORM + value = IToBService.Call("gotoSeeThroughFloorSetting",0); +#endif + return value; + } + public static int UPxr_fileCopy(String srcPath, String dstPath, FileCopyCallback callback) + { + int value = -1; +#if PICO_PLATFORM + value = tobHelper.Call("FileCopy",srcPath,dstPath,callback); +#endif + return value; + } + public static void UPxr_IsMapInEffect(String path, Action callback) + { + +#if PICO_PLATFORM + tobHelper.Call("isMapInEffect",path,new IntCallback(callback),0); +#endif + } + public static void UPxr_ImportMapByPath(String path, Action callback) + { +#if PICO_PLATFORM + tobHelper.Call("importMapByPath",path,new IntCallback(callback),0); +#endif + } + + + private const string LibraryName = "PICO_TOBAPI"; + + [DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)] + public static extern float oxr_get_trackingorigin_height(); + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterprisePlugin.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterprisePlugin.cs.meta new file mode 100644 index 0000000..b313e21 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterprisePlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aa2c6dd6feb090341b43b2f825f99a7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterpriseTools.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterpriseTools.cs new file mode 100644 index 0000000..460899d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterpriseTools.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace Unity.XR.PICO.TOBSupport +{ + public class PXR_EnterpriseTools : MonoBehaviour + { + public struct NoDelayedQueueItem + { + public Action action; + } + + private List _actions = new List(); + List _currentActions = new List(); + private static PXR_EnterpriseTools instance; + + public void StartUp() + { + Debug.Log("ToBService PXR_EnterpriseTools StartUp"); + } + public static PXR_EnterpriseTools Instance + { + get + { + if (instance == null) + { + instance = FindObjectOfType(); + } + + if (instance == null) + { + GameObject obj = new GameObject("PXR_EnterpriseTools"); + instance = obj.AddComponent(); + DontDestroyOnLoad(obj); + } + + return instance; + } + } + + + public static void QueueOnMainThread(Action taction) + { + lock (instance._actions) + { + instance._actions.Add(new NoDelayedQueueItem { action = taction }); + } + } + + void Update() + { + if (_actions.Count > 0) + { + lock (_actions) + { + _currentActions.Clear(); + _currentActions.AddRange(_actions); + _actions.Clear(); + } + + for (int i = 0; i < _currentActions.Count; i++) + { + _currentActions[i].action.Invoke(); + } + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterpriseTools.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterpriseTools.cs.meta new file mode 100644 index 0000000..bcf23a4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Plugin/PXR_EnterpriseTools.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fba0173074665504b9adf96a28713621 +timeCreated: 1686053214 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct.meta new file mode 100644 index 0000000..0e21a2c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: daa051af13219a1469fa16186d42f6fa +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct/RGBCameraStruct.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct/RGBCameraStruct.cs new file mode 100644 index 0000000..abaf0ec --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct/RGBCameraStruct.cs @@ -0,0 +1,105 @@ +using System; +using System.Runtime.InteropServices; + +namespace Unity.XR.PICO.TOBSupport +{ + // pico slam results + [StructLayout(LayoutKind.Sequential)] + public struct SixDof + { + public Int64 timestamp; // nanoseconds + public double x; // position X + public double y; // position Y + public double z; // position Z + public double rw; // rotation W + public double rx; // rotation X + public double ry; // rotation Y + public double rz; // rotation Z + public byte type; //1:6DOF 0:3DOF + public byte confidence; //1:good 0:bad + public PoseErrorType error; + public double plane_height; + public byte plane_status; + public byte relocation_status; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)] + public byte[] reserved; + } + + [StructLayout(LayoutKind.Sequential)] + public struct AlgoResult + { + public SixDof pose; + public SixDof relocation_pose; + public double vx, vy, vz; // linear velocity + public double ax, ay, az; // linear acceleration + public double wx, wy, wz; // angular velocity + public double w_ax, w_ay, w_az; // angular acceleration + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)] + public byte[] reserved; + } + + [StructLayout(LayoutKind.Sequential)] + public struct FrameItem + { + public byte camera_id; + public UInt32 width; // width + public UInt32 height; // height + public UInt32 format; // format - rgb24 + public UInt32 exposure_duration; // exposure duration:ns + public UInt64 timestamp; // start of exposure time:ns (BOOTTIME) + public UInt64 qtimer_timestamp; // nanoseconds in qtimer + public UInt64 framenumber; // frame number + public UInt32 datasize; // datasize + public IntPtr data; // image data. + } + + [StructLayout(LayoutKind.Sequential)] + public struct FrameItemExt + { + public FrameItem frame; + public bool is_rgb; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public double[] rgb_tsw_matrix; + public bool is_anti_distortion; + public AlgoResult six_dof_pose; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] + public byte[] reserved; + } + + [StructLayout(LayoutKind.Sequential)] + public struct Frame + { + public UInt32 width; // width + public UInt32 height; // height + public UInt64 timestamp; // start of exposure time:ns (BOOTTIME) + public UInt32 datasize; // datasize + public IntPtr data; // image data + public UnityEngine.Pose pose; // The head Pose at the time of image production.(Right-handed coordinate system: X right, Y up, Z in) + public int status; // sensor status(1:good 0:bad) + } + + [StructLayout(LayoutKind.Sequential)] + public struct SensorState + { + public UnityEngine.Pose pose; // Predict the head Pose at the screen up time.(Right-handed coordinate system: X right, Y up, Z in) + public int status; // sensor status(1:good 0:bad) + } + + [StructLayout(LayoutKind.Sequential)] + public struct RGBCameraParams + { + // Intrinsics + public double fx; + public double fy; + public double cx; + public double cy; + // Extrinsics + public double x; + public double y; + public double z; + public double rw; + public double rx; + public double ry; + public double rz; + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct/RGBCameraStruct.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct/RGBCameraStruct.cs.meta new file mode 100644 index 0000000..d37eb82 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/Scripts/Struct/RGBCameraStruct.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4c86b575368aebb4f8e9f6075741d50b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android.meta new file mode 100644 index 0000000..26e4fdc --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ec2fbac267f467b4f99f2f8519e05746 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/BAuthLib-1.0.0.aar b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/BAuthLib-1.0.0.aar new file mode 100644 index 0000000000000000000000000000000000000000..b9c38367f6764965c1f36f9fbeaa1beb462b7865 GIT binary patch literal 45903 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�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

NPvJQqFaj9kq8j7UkW@ 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 literal 0 HcmV?d00001 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/gson-2.10.1.jar.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/gson-2.10.1.jar.meta new file mode 100644 index 0000000..0a90874 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/gson-2.10.1.jar.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: 5defbfa2eaac8d54bb97145f9a7e0779 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tob_api-release.aar b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tob_api-release.aar new file mode 100644 index 0000000000000000000000000000000000000000..254a6834d2bb98d4d2acb1435b8c759cbc153f3a GIT binary patch literal 38646 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 literal 0 HcmV?d00001 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tob_api-release.aar.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tob_api-release.aar.meta new file mode 100644 index 0000000..e87b5e5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tob_api-release.aar.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: 9d8a4b2acf17c1347ae880d5e54af76f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 1 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tobservicelib-release.aar b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Enterprise/android/tobservicelib-release.aar new file mode 100644 index 0000000000000000000000000000000000000000..db7bc6de89cee26126871cfe6dc3c68f81336440 GIT binary patch literal 192415 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

rm)} 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

+ public class Gs + { + public static string productName + { + get { return PlayerSettings.productName; } + set { PlayerSettings.productName = value; } + } + + public static string packageName + { + get { return PlayerSettings.GetApplicationIdentifier(EditorUserBuildSettings.selectedBuildTargetGroup); } + set { PlayerSettings.SetApplicationIdentifier(EditorUserBuildSettings.selectedBuildTargetGroup, value); } + } + + public static BuildTargetGroup buildTargetGroup + { + get { return EditorUserBuildSettings.selectedBuildTargetGroup; } + set + { + EditorUserBuildSettings.selectedBuildTargetGroup = value; + if (value == BuildTargetGroup.Android) + { + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Android, BuildTarget.Android); + } + } + } + + public static BuildTarget buildTarget + { + get { return EditorUserBuildSettings.activeBuildTarget; } + } + + public static BuildTarget selectedStandaloneTarget + { + get { return EditorUserBuildSettings.selectedStandaloneTarget; } + set + { + EditorUserBuildSettings.selectedStandaloneTarget = value; + EditorUserBuildSettings.SwitchActiveBuildTarget(BuildTargetGroup.Standalone, value); + } + } + + public static AndroidSdkVersions minimumApiLevel + { + get { return PlayerSettings.Android.minSdkVersion; } + set { PlayerSettings.Android.minSdkVersion = value; } + } + + public static AndroidSdkVersions targetSdkVersion + { + get { return PlayerSettings.Android.targetSdkVersion; } + set { PlayerSettings.Android.targetSdkVersion = value; } + } + + + public static string bundleVersion + { + get { return PlayerSettings.bundleVersion; } + set { PlayerSettings.bundleVersion = value; } + } + + public static int bundleVersionCode + { + get { return PlayerSettings.Android.bundleVersionCode; } + set { PlayerSettings.Android.bundleVersionCode = value; } + } + + public static string keystoreName + { + get { return PlayerSettings.Android.keystoreName; } + set { PlayerSettings.Android.keystoreName = value; } + } + + + public static string keystorePass + { + get { return PlayerSettings.Android.keystorePass; } + set { PlayerSettings.Android.keystorePass = value; } + } + + public static string keyaliasName + { + get { return PlayerSettings.Android.keyaliasName; } + set { PlayerSettings.Android.keyaliasName = value; } + } + + public static string keyaliasPass + { + get { return PlayerSettings.Android.keyaliasPass; } + set { PlayerSettings.Android.keyaliasPass = value; } + } + + public static bool useCustomKeystore + { + get { return PlayerSettings.Android.useCustomKeystore; } + set { PlayerSettings.Android.useCustomKeystore = value; } + } + + public static ScriptingImplementation scriptBackend + { + get { return PlayerSettings.GetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup); } + set + { + PlayerSettings.SetScriptingBackend(EditorUserBuildSettings.selectedBuildTargetGroup, value); + if (value == ScriptingImplementation.Mono2x) + { + //mono only support armv7 + targetArchitectures = AndroidArchitecture.ARMv7; + } + else if (value == ScriptingImplementation.IL2CPP) + { + //il2cpp use a reasonable default value + if (targetArchitectures != AndroidArchitecture.ARMv7 && targetArchitectures != AndroidArchitecture.ARM64) + { + targetArchitectures = AndroidArchitecture.ARM64; + } + } + } + } + + public static AndroidArchitecture targetArchitectures + { + get { return PlayerSettings.Android.targetArchitectures; } + set { PlayerSettings.Android.targetArchitectures = value; } + } + + public static AndroidBuildType androidBuildType + { + get { return EditorUserBuildSettings.androidBuildType; } + set { EditorUserBuildSettings.androidBuildType = value; } + } + + public static UIOrientation UIOrientation + { + get { return PlayerSettings.defaultInterfaceOrientation; } + set { PlayerSettings.defaultInterfaceOrientation = value; } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Gs.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Gs.cs.meta new file mode 100644 index 0000000..c1eeac8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Gs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3273a382b4f040e1b701c1db754ee588 +timeCreated: 1672406702 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Menu.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Menu.cs new file mode 100644 index 0000000..093e555 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Menu.cs @@ -0,0 +1,37 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using UnityEditor; +using UnityEngine; + +namespace Pico.Platform.Editor +{ + public class Menu + { + [MenuItem("PXR_SDK/Platform Settings")] + public static void ShowNewConfig() + { + PicoSettings window = ScriptableObject.CreateInstance(typeof(PicoSettings)) as PicoSettings; + window.minSize = new Vector2(400, 450); + window.maxSize = new Vector2(400, 450); + window.ShowUtility(); + } + + [MenuItem("PXR_SDK/PC Debug Settings")] + public static void EditPcConfig() + { + var obj = PcConfigEditor.load(); + obj.name = "PC Debug Configuration"; + Selection.activeObject = obj; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Menu.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Menu.cs.meta new file mode 100644 index 0000000..516315f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/Menu.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6dfff384357648919df83f7328a03901 +timeCreated: 1666014061 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PICO.Platform.Editor.asmdef b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PICO.Platform.Editor.asmdef new file mode 100644 index 0000000..224e608 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PICO.Platform.Editor.asmdef @@ -0,0 +1,29 @@ +{ + "name": "PICO.Platform.Editor", + "references": [ + "Unity.XR.PICO.Editor", + "Unity.XR.PICO", + "Unity.XR.Management", + "Unity.XR.Management.Editor", + "PICO.Platform", + "Unity.XR.OpenXR.Features.PICOSupport" + ], + "optionalUnityReferences": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "versionDefines": [ + { + "name": "com.unity.xr.management", + "expression": "", + "define": "USING_XR_MANAGEMENT" + }, + { + "name": "com.unity.xr.pico", + "expression": "", + "define": "USING_XR_SDK_PICO" + } + ] +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PICO.Platform.Editor.asmdef.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PICO.Platform.Editor.asmdef.meta new file mode 100644 index 0000000..9989d8f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PICO.Platform.Editor.asmdef.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0714fd8cd186449494c96cfeaa72dc67 +timeCreated: 1666088788 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PXR_PlatformSettingEditor.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PXR_PlatformSettingEditor.cs new file mode 100644 index 0000000..603116f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PXR_PlatformSettingEditor.cs @@ -0,0 +1,97 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using Unity.XR.PXR; +using UnityEditor; +using UnityEngine; + +namespace Pico.Platform.Editor +{ + [CustomEditor(typeof(PXR_PlatformSetting))] + public class PXR_PlatformSettingEditor : UnityEditor.Editor + { + private SerializedProperty deviceSNList; + + private void OnEnable() + { + deviceSNList = serializedObject.FindProperty("deviceSN"); + } + + public override void OnInspectorGUI() + { + var startEntitleCheckTip = "If selected, you will need to enter the APPID that is obtained from" + + " PICO Developer Platform after uploading the app for an entitlement check upon the app launch."; + var startEntitleCheckLabel = new GUIContent("User Entitlement Check[?]", startEntitleCheckTip); + + PXR_PlatformSetting.Instance.startTimeEntitlementCheck = + EditorGUILayout.Toggle(startEntitleCheckLabel, PXR_PlatformSetting.Instance.startTimeEntitlementCheck); + if (PXR_PlatformSetting.Instance.startTimeEntitlementCheck) + { + serializedObject.Update(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Label("App ID ", GUILayout.Width(100)); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + PXR_PlatformSetting.Instance.appID = + EditorGUILayout.TextField(PXR_PlatformSetting.Instance.appID, GUILayout.Width(350.0f)); + EditorGUILayout.EndHorizontal(); + + if (PXR_PlatformSetting.Instance.appID == "") + { + EditorGUILayout.BeginHorizontal(GUILayout.Width(300)); + EditorGUILayout.HelpBox("APPID is required for Entitlement Check", UnityEditor.MessageType.Error, true); + EditorGUILayout.EndHorizontal(); + } + + EditorGUILayout.BeginHorizontal(); + GUILayout.Label("The APPID is required to run an Entitlement Check. Create / Find your APPID Here:", GUILayout.Width(500)); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + GUIStyle style = new GUIStyle(); + style.normal.textColor = new Color(0, 122f / 255f, 204f / 255f); + if (GUILayout.Button("" + "https://developer.pico-interactive.com/developer/overview", style, + GUILayout.Width(200))) + { + Application.OpenURL("https://developer.pico-interactive.com/developer/overview"); + } + + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + GUILayout.Label("If you do not need user Entitlement Check, please uncheck it.", GUILayout.Width(500)); + EditorGUILayout.EndHorizontal(); + serializedObject.ApplyModifiedProperties(); + + var simulationTip = "If true,Development devices will simulate Entitlement Check," + + "you should enter a valid device SN codes list." + + "The SN code can be obtain in Settings-General-Device serial number or input \"adb devices\" in cmd"; + var simulationLabel = new GUIContent("Entitlement Check Simulation [?]", simulationTip); + + PXR_PlatformSetting.Instance.entitlementCheckSimulation = EditorGUILayout.Toggle(simulationLabel, PXR_PlatformSetting.Instance.entitlementCheckSimulation); + if (PXR_PlatformSetting.Instance.entitlementCheckSimulation) + { + serializedObject.Update(); + EditorGUILayout.PropertyField(deviceSNList, true); + serializedObject.ApplyModifiedProperties(); + } + + if (GUI.changed) + { + EditorUtility.SetDirty(PXR_PlatformSetting.Instance); + GUI.changed = false; + } + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PXR_PlatformSettingEditor.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PXR_PlatformSettingEditor.cs.meta new file mode 100644 index 0000000..19a7134 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PXR_PlatformSettingEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d0f9ccd124aeb74489816ba2b80ba94 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PcConfig.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PcConfig.cs new file mode 100644 index 0000000..20c4f4f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PcConfig.cs @@ -0,0 +1,122 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.IO; +using LitJson; +using UnityEditor; +using UnityEngine; + +namespace Pico.Platform.Editor +{ + /// + /// Unity Setting Getter and Setter + /// + public enum Region + { + cn = 0, + i18n = 1, + } + + public class PcConfig : ScriptableObject + { + public Region region = Region.cn; + public string accessToken = ""; + internal bool hasError = false; + } + + [CustomEditor(typeof(PcConfig))] + public class PcConfigEditor : UnityEditor.Editor + { + static string filepath = "Assets/Resources/PicoSdkPCConfig.json"; + private static string i18nLink = "https://developer-global.pico-interactive.com/document/unity/pc-end-debugging-tool"; + private static string cnLink = "https://developer-cn.pico-interactive.com/document/unity/pc-end-debugging-tool"; + + public override void OnInspectorGUI() + { + var x = Selection.activeObject as PcConfig; + if (x.hasError) + { + EditorGUILayout.LabelField("Config file error,please check the file"); + return; + } + + base.OnInspectorGUI(); + + //Read the document + { + GUILayout.Space(5); + var referenceStyle = new GUIStyle(EditorStyles.label); + referenceStyle.normal.textColor = new Color(0, 122f / 255f, 204f / 255f); + referenceStyle.focused.textColor = new Color(0, 122f / 255f, 204f / 255f); + referenceStyle.hover.textColor = new Color(0, 122f / 255f, 204f / 255f); + if (GUILayout.Button("Read the document", referenceStyle)) + { + var link = i18nLink; + if (Application.systemLanguage == SystemLanguage.Chinese || Application.systemLanguage == SystemLanguage.ChineseSimplified || Application.systemLanguage == SystemLanguage.ChineseTraditional) + { + link = cnLink; + } + + Application.OpenURL(link); + } + } + this.save(); + } + + public static PcConfig load() + { + var obj = CreateInstance(); + obj.hasError = false; + try + { + if (File.Exists(filepath)) + { + var jsonContent = File.ReadAllText(filepath); + var jsonConf = JsonMapper.ToObject(jsonContent); + obj.accessToken = jsonConf["account"]["access_token"].ToString(); + if (!Region.TryParse(jsonConf["general"]["region"].ToString() ?? "", out obj.region)) + { + obj.region = Region.cn; + } + } + } + catch (Exception e) + { + Debug.LogError(e); + obj.hasError = true; + } + + return obj; + } + + public void save() + { + var obj = Selection.activeObject as PcConfig; + if (obj.hasError) + { + return; + } + + var conf = new JsonData(); + conf["general"] = new JsonData(); + conf["account"] = new JsonData(); + conf["package"] = new JsonData(); + conf["general"]["region"] = obj.region.ToString(); + conf["account"]["access_token"] = obj.accessToken.Trim(); + conf["package"]["package_name"] = Gs.packageName.Trim(); + conf["package"]["package_version_code"] = Gs.bundleVersionCode; + conf["package"]["package_version_name"] = Gs.bundleVersion; + File.WriteAllText(filepath, JsonMapper.ToJson(conf)); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PcConfig.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PcConfig.cs.meta new file mode 100644 index 0000000..c3c8623 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PcConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2de2dab76a48474c904742a232922902 +timeCreated: 1665473073 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PicoGs.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PicoGs.cs new file mode 100644 index 0000000..45b4f25 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PicoGs.cs @@ -0,0 +1,118 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System.Collections.Generic; +using Unity.XR.PXR; +using UnityEditor; +using UnityEditor.XR.Management; +using UnityEditor.XR.Management.Metadata; +using UnityEngine; +using UnityEngine.XR.Management; + +namespace Pico.Platform.Editor +{ + public class PicoGs + { + public static string appId + { + get { return PXR_PlatformSetting.Instance.appID; } + set + { + PXR_PlatformSetting.Instance.appID = value; + EditorUtility.SetDirty(PXR_PlatformSetting.Instance); + } + } + + public static bool useHighlight + { + get { return PXR_PlatformSetting.Instance.useHighlight; } + set + { + PXR_PlatformSetting.Instance.useHighlight = value; + EditorUtility.SetDirty(PXR_PlatformSetting.Instance); + } + } + + public static bool enableEntitlementCheck + { + get { return PXR_PlatformSetting.Instance.entitlementCheckSimulation; } + set + { + PXR_PlatformSetting.Instance.entitlementCheckSimulation = value; + EditorUtility.SetDirty(PXR_PlatformSetting.Instance); + } + } + + public static List entitlementCheckDeviceList + { + get { return PXR_PlatformSetting.Instance.deviceSN; } + set { PXR_PlatformSetting.Instance.deviceSN = value; } + } + +#if USING_XR_SDK_PICO + static XRManagerSettings GetXrSettings() + { + XRGeneralSettings generalSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(BuildTargetGroup.Android); + if (generalSettings == null) return null; + var assignedSettings = generalSettings.AssignedSettings; + return assignedSettings; + } + + static PXR_Loader GetPxrLoader() + { + var x = GetXrSettings(); + if (x == null) return null; + foreach (var i in x.activeLoaders) + { + if (i is PXR_Loader) + { + return i as PXR_Loader; + } + } + + return null; + } + + public static bool UsePicoXr + { + get { return GetPxrLoader() != null; } + set + { + var x = GetXrSettings(); + if (x == null) return; + var loader = GetPxrLoader(); + if (value == false) + { + if (loader == null) + { + } + else + { + x.TryRemoveLoader(loader); + } + } + else + { + if (loader == null) + { + var res = XRPackageMetadataStore.AssignLoader(x, nameof(PXR_Loader), BuildTargetGroup.Android); + Debug.Log($"设置XR{res} {value}"); + } + else + { + } + } + } + } +#endif + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PicoGs.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PicoGs.cs.meta new file mode 100644 index 0000000..65ff79a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PicoGs.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b67c9049a1bc4e1c90c2c7b99918f856 +timeCreated: 1673612884 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformConfig.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformConfig.cs new file mode 100644 index 0000000..5ded058 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformConfig.cs @@ -0,0 +1,381 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using Unity.XR.PXR; +using UnityEditor; +using UnityEngine; + +namespace Pico.Platform.Editor +{ + public class PicoSettings : EditorWindow + { + enum Language + { + English = 0, + Chinese = 1, + } + + private SerializedObject serObj; + private SerializedProperty gosPty; + static Language language = Language.English; + + static string[] strAppIdText = {"Paste your App ID here", "请粘贴你的AppID"}; + static string[] strAppIdHelpText = {"App ID is the unique identification ID of the PICO Application. Without AppID, you will not be able to use PICO platform feature.", "APP ID 是应用的唯一标识"}; + static string[] strBuildSettingText = {"Recommend Settings [?]", "推荐设置"}; + static string[] strBuildSettingHelpText = {"Recommended project settings for PXR SDK", "推荐项目设置"}; + static string[] strPlatformBuildText = {"Set Platform To Android", "设置目标平台为Android"}; + static string[] strUnityVersionLimit = {$"Unity Editor Version ≥ {EditorConf.minEditorVersion}", $"Unity Editor版本不小于{EditorConf.minEditorVersion}"}; + static string[] strOrientationBuildText = {"Set Orientation To LandscapeLeft", "设置屏幕方向为水平"}; + static string[] strMinApiLevel = {$"Android Min API Level ≥ {EditorConf.minSdkLevel}", $"Android最小API不低于{EditorConf.minSdkLevel}"}; + static string[] strIgnoreButtonText = {"Ask me later", "稍后询问"}; + static string[] strApplyButtonText = {"Apply", "应用"}; + static string[] strHighlightText = {"Use Highlight", "开启高光时刻"}; + + private class Res + { + public readonly Texture PicoDeveloper; + public string Correct = "✔️"; + public string Wrong = "×"; + public GUIStyle correctStyle; + public GUIStyle wrongStyle; + + public Res() + { + this.PicoDeveloper = Resources.Load("PICODeveloper"); + correctStyle = new GUIStyle(GUI.skin.label); + correctStyle.normal.textColor = Color.green; + wrongStyle = new GUIStyle(); + wrongStyle.normal.textColor = Color.red; + wrongStyle.fontStyle = FontStyle.Bold; + } + } + + private Res _R; + + private Res R + { + get + { + if (_R != null) return _R; + _R = new Res(); + return _R; + } + } + + internal enum ConfigStatus + { + Correct, + Wrong, + Fix, + Hide, + } + + internal abstract class ConfigField + { + public bool value = true; + public abstract string[] GetText(); + public abstract ConfigStatus GetStatus(); + public abstract void Fix(); + } + + internal class ConfigIsAndroid : ConfigField + { + public override string[] GetText() + { + return strPlatformBuildText; + } + + public override ConfigStatus GetStatus() + { + return Gs.buildTargetGroup == BuildTargetGroup.Android ? ConfigStatus.Correct : ConfigStatus.Fix; + } + + public override void Fix() + { + Gs.buildTargetGroup = BuildTargetGroup.Android; + } + } + + internal class ConfigIsLandscapeLeft : ConfigField + { + public override string[] GetText() + { + return strOrientationBuildText; + } + + public override ConfigStatus GetStatus() + { + return Gs.UIOrientation == UIOrientation.LandscapeLeft ? ConfigStatus.Correct : ConfigStatus.Fix; + } + + public override void Fix() + { + Gs.UIOrientation = UIOrientation.LandscapeLeft; + } + } + + internal class ConfigMinApiLevel : ConfigField + { + public override string[] GetText() + { + return strMinApiLevel; + } + + public override ConfigStatus GetStatus() + { + return Gs.minimumApiLevel >= (AndroidSdkVersions) EditorConf.minSdkLevel ? ConfigStatus.Correct : ConfigStatus.Fix; + } + + public override void Fix() + { + Gs.minimumApiLevel = (AndroidSdkVersions) EditorConf.minSdkLevel; + } + } + + internal class ConfigUnityVersion : ConfigField + { + public override string[] GetText() + { + return strUnityVersionLimit; + } + + public override ConfigStatus GetStatus() + { + return String.Compare(Application.unityVersion, EditorConf.minEditorVersion, StringComparison.Ordinal) >= 0 ? ConfigStatus.Hide : ConfigStatus.Wrong; + } + + public override void Fix() + { + throw new NotImplementedException(); + } + } + + public static string appId + { + get { return PicoGs.appId; } + set { PicoGs.appId = value; } + } + + public static bool useHighlight + { + get { return PicoGs.useHighlight; } + set { PicoGs.useHighlight = value; } + } + + bool enableEC + { + get { return PicoGs.enableEntitlementCheck; } + set { PicoGs.enableEntitlementCheck = value; } + } + + private ConfigField[] configFields; + + private void OnEnable() + { + configFields = new ConfigField[] + { + new ConfigUnityVersion(), + new ConfigIsAndroid(), + new ConfigIsLandscapeLeft(), + new ConfigMinApiLevel(), + }; + this.titleContent = new GUIContent("PICO Platform Settings"); + language = Language.English; + if (Application.systemLanguage == SystemLanguage.Chinese || Application.systemLanguage == SystemLanguage.ChineseSimplified || Application.systemLanguage == SystemLanguage.ChineseTraditional) + { + language = Language.Chinese; + } + + serObj = new SerializedObject(PXR_PlatformSetting.Instance); + gosPty = serObj.FindProperty(nameof(PXR_PlatformSetting.deviceSN)); + } + + + Vector2 scrollPos; + + void OnGUI() + { + var frameWidth = 380; + //顶部图片 + { + GUIStyle style = new GUIStyle(); + style.stretchWidth = true; + style.fixedWidth = 400; + GUILayout.Label(R.PicoDeveloper, style); + } + + + //顶部中英文选择 + { + GUIStyle activeStyle = new GUIStyle(); + activeStyle.alignment = TextAnchor.MiddleCenter; + activeStyle.normal.textColor = new Color(0, 122f / 255f, 204f / 255f); + GUIStyle normalStyle = new GUIStyle(); + normalStyle.alignment = TextAnchor.MiddleCenter; + normalStyle.normal.textColor = new Color(0.8f, 0.8f, 0.8f); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("ENGLISH", language == Language.English ? activeStyle : normalStyle, GUILayout.Width(80))) + { + language = Language.English; + } + + GUILayout.Label("|", normalStyle, GUILayout.Width(5)); + if (GUILayout.Button("中文", language == Language.Chinese ? activeStyle : normalStyle, GUILayout.Width(80))) + { + language = Language.Chinese; + } + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + } + { + GUIStyle style = new GUIStyle(); + style.margin = new RectOffset(5, 5, 5, 5); + GUILayout.BeginVertical(style, GUILayout.Width(360)); + } + //AppID设置 + { + GUILayout.Space(15); + GUILayout.Label(strAppIdText[(int) language]); + appId = EditorGUILayout.TextField(appId, GUILayout.Width(frameWidth)); + if (string.IsNullOrWhiteSpace(appId)) + { + EditorGUILayout.HelpBox(strAppIdHelpText[(int) language], UnityEditor.MessageType.Warning); + } + + GUILayout.Space(20); + if (appId == "") + { + GUI.enabled = false; + enableEC = false; + } + else + { + GUI.enabled = true; + } + } + //Highlight设置 + { + EditorGUILayout.BeginHorizontal(); + GUILayout.Label(strHighlightText[(int) language]); + useHighlight = EditorGUILayout.Toggle(useHighlight, GUILayout.Width(frameWidth)); + EditorGUILayout.EndHorizontal(); + } + //Recommend Settings + { + GUILayout.Space(5); + GUILayout.Label(new GUIContent(strBuildSettingText[(int) language], strBuildSettingHelpText[(int) language])); + + GUIStyle style = "frameBox"; + style.fixedWidth = frameWidth; + EditorGUILayout.BeginVertical(style); + + foreach (var field in configFields) + { + var txt = field.GetText()[(int) language]; + switch (field.GetStatus()) + { + case ConfigStatus.Correct: + { + EditorGUILayout.BeginHorizontal(GUILayout.Width(frameWidth)); + EditorGUILayout.LabelField(txt); + EditorGUILayout.LabelField(R.Correct, R.correctStyle); + GUI.enabled = true; + EditorGUILayout.EndHorizontal(); + break; + } + case ConfigStatus.Wrong: + { + EditorGUILayout.BeginHorizontal(GUILayout.Width(frameWidth)); + EditorGUILayout.LabelField(txt); + EditorGUILayout.LabelField(R.Wrong, R.wrongStyle); + EditorGUILayout.EndHorizontal(); + break; + } + case ConfigStatus.Hide: + { + break; + } + case ConfigStatus.Fix: + { + EditorGUILayout.BeginHorizontal(GUILayout.Width(frameWidth)); + EditorGUILayout.LabelField(txt); + float originalValue = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 250; + field.value = EditorGUILayout.Toggle(field.value); + EditorGUIUtility.labelWidth = originalValue; + EditorGUILayout.EndHorizontal(); + break; + } + default: + { + Debug.LogWarning($"unhandled ConfigStatus {txt} {field.GetStatus()}"); + break; + } + } + } + + EditorGUILayout.EndVertical(); + } + //按钮区域 + { + var hasSomethingToFix = false; + foreach (var field in configFields) + { + if (field.GetStatus() == ConfigStatus.Fix && field.value) + { + hasSomethingToFix = true; + break; + } + } + + if (hasSomethingToFix) + { + GUILayout.Space(10); + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button(strIgnoreButtonText[(int) language], GUILayout.Width(130))) + { + this.Close(); + } + + GUI.enabled = hasSomethingToFix; + if (GUILayout.Button(strApplyButtonText[(int) language], GUILayout.Width(130))) + { + this.ApplyRecommendConfig(); + } + + GUI.enabled = true; + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUILayout.FlexibleSpace(); + } + } + + GUILayout.EndVertical(); + } + + private void ApplyRecommendConfig() + { + foreach (var field in configFields) + { + if (field.GetStatus() == ConfigStatus.Fix && field.value) + { + field.Fix(); + } + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformConfig.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformConfig.cs.meta new file mode 100644 index 0000000..2e2743c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a65a6e7ecd744ea481a2b1ba6c5c7046 +timeCreated: 1673080389 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformManifestRewrite.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformManifestRewrite.cs new file mode 100644 index 0000000..1e86373 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformManifestRewrite.cs @@ -0,0 +1,53 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System.IO; +using System.Xml; +using UnityEditor.Android; +using UnityEngine; + +namespace Pico.Platform.Editor +{ + public class PlatformManifestRewrite : IPostGenerateGradleAndroidProject + { + public int callbackOrder => 9999; + + public void OnPostGenerateGradleAndroidProject(string path) + { + var appId = PicoGs.appId; + if (string.IsNullOrWhiteSpace(appId)) + { + Debug.Log("appId is ignored"); + return; + } + + XmlDocument doc = new XmlDocument(); + const string androidUri = "http://schemas.android.com/apk/res/android"; + var manifestPath = Path.Combine(path, "src/main/AndroidManifest.xml"); + doc.Load(manifestPath); + var app = doc.SelectSingleNode("//application"); + if (app == null) return; + + var appIdNode = doc.CreateElement("meta-data"); + appIdNode.SetAttribute("name", androidUri, "pvr.app.id"); + appIdNode.SetAttribute("value", androidUri, appId); + app.AppendChild(appIdNode); + + var highlightNode = doc.CreateElement("meta-data"); + highlightNode.SetAttribute("name", androidUri, "use_record_highlight_feature"); + highlightNode.SetAttribute("value", androidUri, PicoGs.useHighlight.ToString()); + app.AppendChild(highlightNode); + + doc.Save(manifestPath); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformManifestRewrite.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformManifestRewrite.cs.meta new file mode 100644 index 0000000..e5237c7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformManifestRewrite.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5e6569b4f00343d996dd6610d37068ca +timeCreated: 1684327101 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformPreprocessor.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformPreprocessor.cs new file mode 100644 index 0000000..17e6a56 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformPreprocessor.cs @@ -0,0 +1,36 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using Unity.XR.PXR; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using UnityEngine; + +namespace Pico.Platform.Editor +{ + public class PlatformPreprocessor : IPreprocessBuildWithReport + { + public int callbackOrder + { + get { return 0; } + } + + public void OnPreprocessBuild(BuildReport report) + { + string configAppID = PXR_PlatformSetting.Instance.appID.Trim(); + if (string.IsNullOrWhiteSpace(configAppID)) + { + Debug.LogWarning("appID is not configured"); + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformPreprocessor.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformPreprocessor.cs.meta new file mode 100644 index 0000000..944a735 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Editor/PlatformPreprocessor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c7e99491577614bbbb6c60ad215598f5 +timeCreated: 1674209284 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/PICO.Platform.asmdef b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/PICO.Platform.asmdef new file mode 100644 index 0000000..aa7b8e0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/PICO.Platform.asmdef @@ -0,0 +1,24 @@ +{ + "name": "PICO.Platform", + "references": [ + "Unity.XR.PICO.Editor", + "Unity.XR.PICO", + "Unity.XR.OpenXR.Features.PICOSupport" + ], + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "versionDefines": [ + { + "name": "com.unity.xr.management", + "expression": "", + "define": "USING_XR_MANAGEMENT" + }, + { + "name": "com.unity.xr.pico", + "expression": "", + "define": "USING_XR_SDK_PICO" + } + ] +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/PICO.Platform.asmdef.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/PICO.Platform.asmdef.meta new file mode 100644 index 0000000..3755c83 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/PICO.Platform.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b98de7ff63394bdca25fc3bdddff73bf +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins.meta new file mode 100644 index 0000000..778fdc2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1ca6f9e5135f74a4f82828799f50674b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Android64.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Android64.meta new file mode 100644 index 0000000..d68916c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Android64.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5a08de46916f4c7d945890c51c573e75 +timeCreated: 1641895563 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Android64/libpxrplatformloader.so b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Plugins/Android64/libpxrplatformloader.so new file mode 100644 index 0000000000000000000000000000000000000000..388acd3fe6a3d28c998870825f7822439140a263 GIT binary patch literal 251760 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 + { + if (m.IsError) + { + Log($"Async initialize failed: code={m.GetError().Code} message={m.GetError().Message}"); + return; + } + + if (m.Data != PlatformInitializeResult.Success && m.Data != PlatformInitializeResult.AlreadyInitialized) + { + Log($"Async initialize failed: result={m.Data}"); + return; + } + + Log("AsyncInitialize Successfully"); + EnterDemo(); + }); + } + catch (Exception e) + { + Log($"Async Initialize Failed:{e}"); + return; + } + } + else + { + try + { + CoreService.Initialize(); + } + catch (UnityException e) + { + Log($"Init Platform SDK error:{e}"); + throw; + } + + EnterDemo(); + } + } + + void EnterDemo() + { + UserService.RequestUserPermissions(new[] {Permissions.UserInfo, Permissions.FriendRelation}).OnComplete(m => + { + if (m.IsError) + { + Log($"Permission failed code={m.Error.Code} message={m.Error.Message}"); + return; + } + + Log($"RequestUserPermissions successfully:{String.Join(",", m.Data.AuthorizedPermissions)}"); + getUser(); + }); + } + + void getUser() + { + UserService.GetLoggedInUser().OnComplete(m => + { + if (m.IsError) + { + Debug.Log($"GetLoggedInUser failed:code={m.Error.Code} message={m.Error.Message}"); + return; + } + + StartCoroutine(DownloadImage(m.Data.ImageUrl, headImage)); + nameText.text = m.Data.DisplayName; + Log($"DisplayName={m.Data.DisplayName} UserId={m.Data.ID}"); + }); + } + + IEnumerator DownloadImage(string mediaUrl, RawImage rawImage) + { + UnityWebRequest request = UnityWebRequestTexture.GetTexture(mediaUrl); + yield return request.SendWebRequest(); + if (request.responseCode != 200) + { + Log("Load image failed"); + } + else + { + rawImage.texture = ((DownloadHandlerTexture) request.downloadHandler).texture; + rawImage.GetComponent().material.mainTexture = ((DownloadHandlerTexture) request.downloadHandler).texture; + } + } + + void Log(string s) + { + logText.text = s; + Debug.Log(s); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.cs.meta new file mode 100644 index 0000000..e9233c2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1b732fc4d5a124b7a9926a3b408165c0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.unity b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.unity new file mode 100644 index 0000000..98d3464 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.unity @@ -0,0 +1,1902 @@ +%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: 2100000, guid: f5ef92f0b9b738d429be8f6537730b22, type: 2} + 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.13241577, g: 0.13441247, b: 0.26180914, 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 &148013866 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 148013867} + - component: {fileID: 148013871} + - component: {fileID: 148013870} + - component: {fileID: 148013869} + - component: {fileID: 148013868} + m_Layer: 0 + m_Name: FPS + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &148013867 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148013866} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.4} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_Children: [] + m_Father: {fileID: 472520542} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.05, y: 0.1} + m_SizeDelta: {x: 160, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &148013868 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148013866} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c0686a02cb705eb4eb372aac02223c3c, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!223 &148013869 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148013866} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &148013870 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148013866} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 18 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: fps +--- !u!222 &148013871 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 148013866} + m_CullTransparentMesh: 0 +--- !u!1 &383031850 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 383031851} + - component: {fileID: 383031853} + - component: {fileID: 383031852} + m_Layer: 0 + m_Name: RawImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &383031851 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 383031850} + 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: 1924922718} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -5, y: 176} + m_SizeDelta: {x: 200, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &383031852 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 383031850} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &383031853 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 383031850} + m_CullTransparentMesh: 0 +--- !u!1 &397162576 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 397162577} + - component: {fileID: 397162579} + - component: {fileID: 397162578} + m_Layer: 0 + m_Name: LogText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &397162577 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 397162576} + 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: 1924922718} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 4.4957285, y: -153.92911} + m_SizeDelta: {x: 896.3071, y: 258.66895} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &397162578 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 397162576} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 23 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &397162579 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 397162576} + m_CullTransparentMesh: 0 +--- !u!1 &472520539 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 472520542} + - component: {fileID: 472520541} + - component: {fileID: 472520540} + - component: {fileID: 472520543} + 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 &472520540 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 472520539} + m_Enabled: 1 +--- !u!20 &472520541 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 472520539} + 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: -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 &472520542 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 472520539} + 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: 148013867} + m_Father: {fileID: 838079974} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &472520543 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 472520539} + 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!1 &503551738 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 503551739} + - component: {fileID: 503551743} + - component: {fileID: 503551742} + - component: {fileID: 503551741} + - component: {fileID: 503551740} + m_Layer: 0 + m_Name: RightHand Controller + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &503551739 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 503551738} + 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: 838079974} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &503551740 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 503551738} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e988983f96fe1dd48800bcdfc82f23e9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LineWidth: 0.02 + m_OverrideInteractorLineLength: 1 + m_LineLength: 10 + m_WidthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_ValidColorGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, 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 + m_InvalidColorGradient: + serializedVersion: 2 + key0: {r: 1, g: 0, b: 0, a: 1} + key1: {r: 1, g: 0, b: 0, 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 + m_BlockedColorGradient: + serializedVersion: 2 + key0: {r: 1, g: 0.92156863, b: 0.015686275, a: 1} + key1: {r: 1, g: 0.92156863, b: 0.015686275, 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 + m_TreatSelectionAsValidState: 0 + m_SmoothMovement: 0 + m_FollowTightness: 10 + m_SnapThresholdDistance: 10 + m_Reticle: {fileID: 0} + m_BlockedReticle: {fileID: 0} + m_StopLineAtFirstRaycastHit: 1 + m_StopLineAtSelection: 0 + m_SnapEndpointIfAvailable: 1 +--- !u!120 &503551741 +LineRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 503551738} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10306, 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: 5 + m_Positions: [] + m_Parameters: + serializedVersion: 3 + widthMultiplier: 0.02 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 0, g: 0, b: 1, a: 1} + key1: {r: 0, g: 0, 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: 4 + numCapVertices: 4 + alignment: 0 + textureMode: 0 + shadowBias: 0.5 + generateLightingData: 0 + m_UseWorldSpace: 1 + m_Loop: 0 +--- !u!114 &503551742 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 503551738} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6803edce0201f574f923fd9d10e5b30a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_InteractionManager: {fileID: 627001450} + m_InteractionLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_InteractionLayers: + m_Bits: 4294967295 + m_AttachTransform: {fileID: 0} + m_KeepSelectedTargetValid: 1 + m_DisableVisualsWhenBlockedInGroup: 1 + m_StartingSelectedInteractable: {fileID: 0} + m_StartingTargetFilter: {fileID: 0} + m_HoverEntered: + m_PersistentCalls: + m_Calls: [] + m_HoverExited: + m_PersistentCalls: + m_Calls: [] + m_SelectEntered: + m_PersistentCalls: + m_Calls: [] + m_SelectExited: + m_PersistentCalls: + m_Calls: [] + m_StartingHoverFilters: [] + m_StartingSelectFilters: [] + m_OnHoverEntered: + m_PersistentCalls: + m_Calls: [] + m_OnHoverExited: + m_PersistentCalls: + m_Calls: [] + m_OnSelectEntered: + m_PersistentCalls: + m_Calls: [] + m_OnSelectExited: + m_PersistentCalls: + m_Calls: [] + m_SelectActionTrigger: 1 + m_HideControllerOnSelect: 0 + m_AllowHoveredActivate: 0 + m_TargetPriorityMode: 0 + m_PlayAudioClipOnSelectEntered: 0 + m_AudioClipForOnSelectEntered: {fileID: 0} + m_PlayAudioClipOnSelectExited: 0 + m_AudioClipForOnSelectExited: {fileID: 0} + m_PlayAudioClipOnSelectCanceled: 0 + m_AudioClipForOnSelectCanceled: {fileID: 0} + m_PlayAudioClipOnHoverEntered: 0 + m_AudioClipForOnHoverEntered: {fileID: 0} + m_PlayAudioClipOnHoverExited: 0 + m_AudioClipForOnHoverExited: {fileID: 0} + m_PlayAudioClipOnHoverCanceled: 0 + m_AudioClipForOnHoverCanceled: {fileID: 0} + m_AllowHoverAudioWhileSelecting: 1 + m_PlayHapticsOnSelectEntered: 0 + m_HapticSelectEnterIntensity: 0 + m_HapticSelectEnterDuration: 0 + m_PlayHapticsOnSelectExited: 0 + m_HapticSelectExitIntensity: 0 + m_HapticSelectExitDuration: 0 + m_PlayHapticsOnSelectCanceled: 0 + m_HapticSelectCancelIntensity: 0 + m_HapticSelectCancelDuration: 0 + m_PlayHapticsOnHoverEntered: 0 + m_HapticHoverEnterIntensity: 0 + m_HapticHoverEnterDuration: 0 + m_PlayHapticsOnHoverExited: 0 + m_HapticHoverExitIntensity: 0 + m_HapticHoverExitDuration: 0 + m_PlayHapticsOnHoverCanceled: 0 + m_HapticHoverCancelIntensity: 0 + m_HapticHoverCancelDuration: 0 + m_AllowHoverHapticsWhileSelecting: 1 + m_LineType: 0 + m_BlendVisualLinePoints: 1 + m_MaxRaycastDistance: 30 + m_RayOriginTransform: {fileID: 0} + m_ReferenceFrame: {fileID: 0} + m_Velocity: 16 + m_Acceleration: 9.8 + m_AdditionalGroundHeight: 0.1 + m_AdditionalFlightTime: 0.5 + m_EndPointDistance: 30 + m_EndPointHeight: -10 + m_ControlPointDistance: 10 + m_ControlPointHeight: 5 + m_SampleFrequency: 20 + m_HitDetectionType: 0 + m_SphereCastRadius: 0 + m_RaycastMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RaycastTriggerInteraction: 1 + m_RaycastSnapVolumeInteraction: 1 + m_HitClosestOnly: 0 + m_HoverToSelect: 0 + m_HoverTimeToSelect: 0.5 + m_AutoDeselect: 0 + m_TimeToAutoDeselect: 3 + m_EnableUIInteraction: 1 + m_AllowAnchorControl: 1 + m_UseForceGrab: 1 + m_RotateSpeed: 180 + m_TranslateSpeed: 1 + m_AnchorRotateReferenceFrame: {fileID: 0} + m_AnchorRotationMode: 0 +--- !u!114 &503551743 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 503551738} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1ae26e19cd956134bbdf3c6f65bf393a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UpdateTrackingType: 0 + m_EnableInputTracking: 1 + m_EnableInputActions: 1 + m_ModelPrefab: {fileID: 0} + m_ModelParent: {fileID: 0} + m_Model: {fileID: 0} + m_AnimateModel: 0 + m_ModelSelectTransition: + m_ModelDeSelectTransition: + m_ControllerNode: 5 + m_SelectUsage: 3 + m_ActivateUsage: 2 + m_UIPressUsage: 2 + m_AxisToPressThreshold: 0.1 + m_RotateAnchorLeft: 16 + m_RotateAnchorRight: 17 + m_MoveObjectIn: 14 + m_MoveObjectOut: 15 + m_DirectionalAnchorRotation: 1 + m_PoseProvider: {fileID: 0} +--- !u!1 &627001449 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 627001451} + - component: {fileID: 627001450} + m_Layer: 0 + m_Name: XR Interaction Manager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &627001450 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 627001449} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 83e4e6cca11330d4088d729ab4fc9d9f, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StartingHoverFilters: [] + m_StartingSelectFilters: [] +--- !u!4 &627001451 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 627001449} + 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: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &766525449 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 766525450} + - component: {fileID: 766525452} + m_Layer: 0 + m_Name: XR Rig + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &766525450 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 766525449} + 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: 838079974} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &766525452 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 766525449} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7448815bd5148434682b3d931066cd10, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Camera: {fileID: 0} + m_OriginBaseGameObject: {fileID: 766525449} + m_CameraFloorOffsetObject: {fileID: 838079973} + m_RequestedTrackingOriginMode: 0 + m_CameraYOffset: 1.36144 + m_CameraGameObject: {fileID: 472520539} +--- !u!1 &822056247 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 822056249} + - component: {fileID: 822056248} + 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 &822056248 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 822056247} + 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 &822056249 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 822056247} + 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 &838079973 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 838079974} + 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 &838079974 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 838079973} + 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: 472520542} + - {fileID: 1486376872} + - {fileID: 503551739} + m_Father: {fileID: 766525450} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1486376871 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1486376872} + - component: {fileID: 1486376876} + - component: {fileID: 1486376875} + - component: {fileID: 1486376874} + - component: {fileID: 1486376873} + m_Layer: 0 + m_Name: LeftHand Controller + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1486376872 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486376871} + 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: 838079974} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1486376873 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486376871} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e988983f96fe1dd48800bcdfc82f23e9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LineWidth: 0.02 + m_OverrideInteractorLineLength: 1 + m_LineLength: 10 + m_WidthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_ValidColorGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, 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 + m_InvalidColorGradient: + serializedVersion: 2 + key0: {r: 1, g: 0, b: 0, a: 1} + key1: {r: 1, g: 0, b: 0, 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 + m_BlockedColorGradient: + serializedVersion: 2 + key0: {r: 1, g: 0.92156863, b: 0.015686275, a: 1} + key1: {r: 1, g: 0.92156863, b: 0.015686275, 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 + m_TreatSelectionAsValidState: 0 + m_SmoothMovement: 0 + m_FollowTightness: 10 + m_SnapThresholdDistance: 10 + m_Reticle: {fileID: 0} + m_BlockedReticle: {fileID: 0} + m_StopLineAtFirstRaycastHit: 1 + m_StopLineAtSelection: 0 + m_SnapEndpointIfAvailable: 1 +--- !u!120 &1486376874 +LineRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486376871} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10306, 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: 5 + m_Positions: [] + m_Parameters: + serializedVersion: 3 + widthMultiplier: 0.02 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 0, g: 0, b: 1, a: 1} + key1: {r: 0, g: 0, 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: 4 + numCapVertices: 4 + alignment: 0 + textureMode: 0 + shadowBias: 0.5 + generateLightingData: 0 + m_UseWorldSpace: 1 + m_Loop: 0 +--- !u!114 &1486376875 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486376871} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6803edce0201f574f923fd9d10e5b30a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_InteractionManager: {fileID: 627001450} + m_InteractionLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_InteractionLayers: + m_Bits: 4294967295 + m_AttachTransform: {fileID: 0} + m_KeepSelectedTargetValid: 1 + m_DisableVisualsWhenBlockedInGroup: 1 + m_StartingSelectedInteractable: {fileID: 0} + m_StartingTargetFilter: {fileID: 0} + m_HoverEntered: + m_PersistentCalls: + m_Calls: [] + m_HoverExited: + m_PersistentCalls: + m_Calls: [] + m_SelectEntered: + m_PersistentCalls: + m_Calls: [] + m_SelectExited: + m_PersistentCalls: + m_Calls: [] + m_StartingHoverFilters: [] + m_StartingSelectFilters: [] + m_OnHoverEntered: + m_PersistentCalls: + m_Calls: [] + m_OnHoverExited: + m_PersistentCalls: + m_Calls: [] + m_OnSelectEntered: + m_PersistentCalls: + m_Calls: [] + m_OnSelectExited: + m_PersistentCalls: + m_Calls: [] + m_SelectActionTrigger: 1 + m_HideControllerOnSelect: 0 + m_AllowHoveredActivate: 0 + m_TargetPriorityMode: 0 + m_PlayAudioClipOnSelectEntered: 0 + m_AudioClipForOnSelectEntered: {fileID: 0} + m_PlayAudioClipOnSelectExited: 0 + m_AudioClipForOnSelectExited: {fileID: 0} + m_PlayAudioClipOnSelectCanceled: 0 + m_AudioClipForOnSelectCanceled: {fileID: 0} + m_PlayAudioClipOnHoverEntered: 0 + m_AudioClipForOnHoverEntered: {fileID: 0} + m_PlayAudioClipOnHoverExited: 0 + m_AudioClipForOnHoverExited: {fileID: 0} + m_PlayAudioClipOnHoverCanceled: 0 + m_AudioClipForOnHoverCanceled: {fileID: 0} + m_AllowHoverAudioWhileSelecting: 1 + m_PlayHapticsOnSelectEntered: 0 + m_HapticSelectEnterIntensity: 0 + m_HapticSelectEnterDuration: 0 + m_PlayHapticsOnSelectExited: 0 + m_HapticSelectExitIntensity: 0 + m_HapticSelectExitDuration: 0 + m_PlayHapticsOnSelectCanceled: 0 + m_HapticSelectCancelIntensity: 0 + m_HapticSelectCancelDuration: 0 + m_PlayHapticsOnHoverEntered: 0 + m_HapticHoverEnterIntensity: 0 + m_HapticHoverEnterDuration: 0 + m_PlayHapticsOnHoverExited: 0 + m_HapticHoverExitIntensity: 0 + m_HapticHoverExitDuration: 0 + m_PlayHapticsOnHoverCanceled: 0 + m_HapticHoverCancelIntensity: 0 + m_HapticHoverCancelDuration: 0 + m_AllowHoverHapticsWhileSelecting: 1 + m_LineType: 0 + m_BlendVisualLinePoints: 1 + m_MaxRaycastDistance: 30 + m_RayOriginTransform: {fileID: 0} + m_ReferenceFrame: {fileID: 0} + m_Velocity: 16 + m_Acceleration: 9.8 + m_AdditionalGroundHeight: 0.1 + m_AdditionalFlightTime: 0.5 + m_EndPointDistance: 30 + m_EndPointHeight: -10 + m_ControlPointDistance: 10 + m_ControlPointHeight: 5 + m_SampleFrequency: 20 + m_HitDetectionType: 0 + m_SphereCastRadius: 0 + m_RaycastMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RaycastTriggerInteraction: 1 + m_RaycastSnapVolumeInteraction: 1 + m_HitClosestOnly: 0 + m_HoverToSelect: 0 + m_HoverTimeToSelect: 0.5 + m_AutoDeselect: 0 + m_TimeToAutoDeselect: 3 + m_EnableUIInteraction: 1 + m_AllowAnchorControl: 1 + m_UseForceGrab: 1 + m_RotateSpeed: 180 + m_TranslateSpeed: 1 + m_AnchorRotateReferenceFrame: {fileID: 0} + m_AnchorRotationMode: 0 +--- !u!114 &1486376876 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486376871} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1ae26e19cd956134bbdf3c6f65bf393a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UpdateTrackingType: 0 + m_EnableInputTracking: 1 + m_EnableInputActions: 1 + m_ModelPrefab: {fileID: 0} + m_ModelParent: {fileID: 0} + m_Model: {fileID: 0} + m_AnimateModel: 0 + m_ModelSelectTransition: + m_ModelDeSelectTransition: + m_ControllerNode: 4 + m_SelectUsage: 3 + m_ActivateUsage: 2 + m_UIPressUsage: 2 + m_AxisToPressThreshold: 0.1 + m_RotateAnchorLeft: 16 + m_RotateAnchorRight: 17 + m_MoveObjectIn: 14 + m_MoveObjectOut: 15 + m_DirectionalAnchorRotation: 1 + m_PoseProvider: {fileID: 0} +--- !u!1 &1849327822 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1849327826} + - component: {fileID: 1849327825} + - component: {fileID: 1849327824} + - component: {fileID: 1849327823} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1849327823 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849327822} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ab68ce6587aab0146b8dabefbd806791, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ClickSpeed: 0.3 + m_MoveDeadzone: 0.6 + m_RepeatDelay: 0.5 + m_RepeatRate: 0.1 + m_TrackedDeviceDragThresholdMultiplier: 2 + m_ActiveInputMode: 0 + m_MaxTrackedDeviceRaycastDistance: 1000 + m_EnableXRInput: 1 + m_EnableMouseInput: 1 + m_EnableTouchInput: 1 + m_PointAction: {fileID: 0} + m_LeftClickAction: {fileID: 0} + m_MiddleClickAction: {fileID: 0} + m_RightClickAction: {fileID: 0} + m_ScrollWheelAction: {fileID: 0} + m_NavigateAction: {fileID: 0} + m_SubmitAction: {fileID: 0} + m_CancelAction: {fileID: 0} + m_EnableBuiltinActionsAsFallback: 1 + m_EnableGamepadInput: 1 + m_EnableJoystickInput: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel +--- !u!114 &1849327824 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849327822} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ab68ce6587aab0146b8dabefbd806791, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ClickSpeed: 0.3 + m_MoveDeadzone: 0.6 + m_RepeatDelay: 0.5 + m_RepeatRate: 0.1 + m_TrackedDeviceDragThresholdMultiplier: 2 + m_ActiveInputMode: 0 + m_MaxTrackedDeviceRaycastDistance: 1000 + m_EnableXRInput: 1 + m_EnableMouseInput: 1 + m_EnableTouchInput: 1 + m_PointAction: {fileID: 0} + m_LeftClickAction: {fileID: 0} + m_MiddleClickAction: {fileID: 0} + m_RightClickAction: {fileID: 0} + m_ScrollWheelAction: {fileID: 0} + m_NavigateAction: {fileID: 0} + m_SubmitAction: {fileID: 0} + m_CancelAction: {fileID: 0} + m_EnableBuiltinActionsAsFallback: 1 + m_EnableGamepadInput: 1 + m_EnableJoystickInput: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel +--- !u!114 &1849327825 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849327822} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1849327826 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1849327822} + 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 &1924922713 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1924922718} + - component: {fileID: 1924922717} + - component: {fileID: 1924922716} + - component: {fileID: 1924922715} + - component: {fileID: 1924922714} + - component: {fileID: 1924922719} + m_Layer: 0 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1924922714 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1924922713} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7951c64acb0fa62458bf30a60089fe2d, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 0 + m_CheckFor2DOcclusion: 0 + m_CheckFor3DOcclusion: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 2147483647 + m_RaycastTriggerInteraction: 1 +--- !u!114 &1924922715 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1924922713} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1924922716 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1924922713} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!223 &1924922717 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1924922713} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 472520541} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1924922718 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1924922713} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 15} + m_LocalScale: {x: 0.03, y: 0.03, z: 1} + m_Children: + - {fileID: 397162577} + - {fileID: 383031851} + - {fileID: 1993752515} + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1000, y: 600} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1924922719 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1924922713} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1b732fc4d5a124b7a9926a3b408165c0, type: 3} + m_Name: + m_EditorClassIdentifier: + useAsyncInit: 1 + headImage: {fileID: 383031852} + nameText: {fileID: 1993752516} + logText: {fileID: 397162578} +--- !u!1 &1993752514 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1993752515} + - component: {fileID: 1993752517} + - component: {fileID: 1993752516} + m_Layer: 0 + m_Name: NameText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1993752515 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993752514} + 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: 1924922718} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -0.00014496, y: 34} + m_SizeDelta: {x: 299.9997, y: 78.33786} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1993752516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993752514} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8584906, g: 0.03644534, b: 0.03644534, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: New Text +--- !u!222 &1993752517 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1993752514} + m_CullTransparentMesh: 0 diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.unity.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.unity.meta new file mode 100644 index 0000000..12b5ea9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Samples/SimpleDemo.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bb50d682529fe4733a4f047bbf45f8a0 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts.meta new file mode 100644 index 0000000..97a3d1d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2388eea5be72a444795537c4eaedef68 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB.meta new file mode 100644 index 0000000..56f594b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: afc99c2a85af4b79b8d17dadaf00b40e +timeCreated: 1660284708 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB.cs new file mode 100644 index 0000000..df80c5c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB.cs @@ -0,0 +1,9402 @@ +// ---------------------------------------------------------------------------- +// +// This is autogenerated code by CppSharp. +// Do not edit this file or all your changes will be lost after re-generation. +// +// ---------------------------------------------------------------------------- +using System; +using System.Runtime.InteropServices; +using System.Security; +using __CallingConvention = global::System.Runtime.InteropServices.CallingConvention; +using __IntPtr = global::System.IntPtr; + +namespace Pico.Platform +{ + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_PopMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PopMessage(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_FreeMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_FreeMessage(__IntPtr obj); + } + + public static __IntPtr ppf_PopMessage() + { + var __ret = __Internal.ppf_PopMessage(); + return __ret; + } + + public static void ppf_FreeMessage(__IntPtr obj) + { + __Internal.ppf_FreeMessage(obj); + } + } + + /// The type of an achievement. + public enum AchievementType + { + /// Unknown. + Unknown = 0, + /// Simple achievement. + Simple = 1, + /// Count achievement. + Count = 2, + /// Bitfield achievement. + Bitfield = 3 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfAchievementType_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfAchievementType_ToString(global::Pico.Platform.AchievementType value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfAchievementType_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.AchievementType ppfAchievementType_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfAchievementType_ToString(global::Pico.Platform.AchievementType value) + { + var __ret = __Internal.ppfAchievementType_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.AchievementType ppfAchievementType_FromString(string str) + { + var __ret = __Internal.ppfAchievementType_FromString(str); + return __ret; + } + } + + /// The write policy for the achievement. + public enum AchievementWritePolicy + { + /// Unknown. + Unknown = 0, + /// Both the client app and server are allowed to update achievement progress. + Client = 1, + /// Only the server is allowed to update achievement progress. + Server = 2 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfAchievementWritePolicy_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfAchievementWritePolicy_ToString(global::Pico.Platform.AchievementWritePolicy value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfAchievementWritePolicy_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.AchievementWritePolicy ppfAchievementWritePolicy_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfAchievementWritePolicy_ToString(global::Pico.Platform.AchievementWritePolicy value) + { + var __ret = __Internal.ppfAchievementWritePolicy_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.AchievementWritePolicy ppfAchievementWritePolicy_FromString(string str) + { + var __ret = __Internal.ppfAchievementWritePolicy_FromString(str); + return __ret; + } + } + + /// The type of a key-value pair. + public enum KVPairType + { + /// String. + String = 0, + /// Integer. + Int = 1, + /// Both string and integer. + Double = 2, + /// Unknown. + Unknown = 3 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfKeyValuePairType_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfKeyValuePairType_ToString(global::Pico.Platform.KVPairType value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfKeyValuePairType_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.KVPairType ppfKeyValuePairType_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfKeyValuePairType_ToString(global::Pico.Platform.KVPairType value) + { + var __ret = __Internal.ppfKeyValuePairType_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.KVPairType ppfKeyValuePairType_FromString(string str) + { + var __ret = __Internal.ppfKeyValuePairType_FromString(str); + return __ret; + } + } + + /// The importance level of the expression for calculating the matching degree among users, which is configured on the PICO Developer Platform. + public enum MatchmakingCriterionImportance + { + /// Required. + Required = 0, + /// High. + High = 1, + /// Medium. + Medium = 2, + /// Low. + Low = 3, + /// Unknown. + Unknown = 4 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfMatchmakingCriterionImportance_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfMatchmakingCriterionImportance_ToString(global::Pico.Platform.MatchmakingCriterionImportance value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfMatchmakingCriterionImportance_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.MatchmakingCriterionImportance ppfMatchmakingCriterionImportance_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfMatchmakingCriterionImportance_ToString(global::Pico.Platform.MatchmakingCriterionImportance value) + { + var __ret = __Internal.ppfMatchmakingCriterionImportance_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.MatchmakingCriterionImportance ppfMatchmakingCriterionImportance_FromString(string str) + { + var __ret = __Internal.ppfMatchmakingCriterionImportance_FromString(str); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AchievementDefinition_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementDefinition_GetName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetBitfieldLength", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_AchievementDefinition_GetBitfieldLength(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetTarget", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_AchievementDefinition_GetTarget(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.AchievementType ppf_AchievementDefinition_GetType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetWritePolicy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.AchievementWritePolicy ppf_AchievementDefinition_GetWritePolicy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_IsArchived", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_AchievementDefinition_IsArchived(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_IsSecret", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_AchievementDefinition_IsSecret(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetTitle", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementDefinition_GetTitle(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetDescription", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementDefinition_GetDescription(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetUnlockedDescription", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementDefinition_GetUnlockedDescription(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetLockedImageURL", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementDefinition_GetLockedImageURL(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinition_GetUnlockedImageURL", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementDefinition_GetUnlockedImageURL(__IntPtr obj); + } + + public static ulong ppf_AchievementDefinition_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetID(obj); + return __ret; + } + + public static string ppf_AchievementDefinition_GetName(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static uint ppf_AchievementDefinition_GetBitfieldLength(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetBitfieldLength(obj); + return __ret; + } + + public static long ppf_AchievementDefinition_GetTarget(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetTarget(obj); + return __ret; + } + + public static global::Pico.Platform.AchievementType ppf_AchievementDefinition_GetType(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetType(obj); + return __ret; + } + + public static global::Pico.Platform.AchievementWritePolicy ppf_AchievementDefinition_GetWritePolicy(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetWritePolicy(obj); + return __ret; + } + + public static bool ppf_AchievementDefinition_IsArchived(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_IsArchived(obj); + return __ret; + } + + public static bool ppf_AchievementDefinition_IsSecret(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_IsSecret(obj); + return __ret; + } + + public static string ppf_AchievementDefinition_GetTitle(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetTitle(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AchievementDefinition_GetDescription(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetDescription(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AchievementDefinition_GetUnlockedDescription(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetUnlockedDescription(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AchievementDefinition_GetLockedImageURL(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetLockedImageURL(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AchievementDefinition_GetUnlockedImageURL(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinition_GetUnlockedImageURL(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinitionArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementDefinitionArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinitionArray_GetNextUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementDefinitionArray_GetNextUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinitionArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_AchievementDefinitionArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinitionArray_GetTotalSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_AchievementDefinitionArray_GetTotalSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementDefinitionArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_AchievementDefinitionArray_HasNextPage(__IntPtr obj); + } + + public static __IntPtr ppf_AchievementDefinitionArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_AchievementDefinitionArray_GetElement(obj, index); + return __ret; + } + + public static string ppf_AchievementDefinitionArray_GetNextUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinitionArray_GetNextUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_AchievementDefinitionArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinitionArray_GetSize(obj); + return __ret; + } + + public static UIntPtr ppf_AchievementDefinitionArray_GetTotalSize(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinitionArray_GetTotalSize(obj); + return __ret; + } + + public static bool ppf_AchievementDefinitionArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementDefinitionArray_HasNextPage(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgress_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AchievementProgress_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgress_GetBitfield", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementProgress_GetBitfield(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgress_GetCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_AchievementProgress_GetCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgress_GetIsUnlocked", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_AchievementProgress_GetIsUnlocked(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgress_GetName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementProgress_GetName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgress_GetUnlockTime", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AchievementProgress_GetUnlockTime(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgress_GetExtraData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementProgress_GetExtraData(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgress_GetExtraDataLength", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_AchievementProgress_GetExtraDataLength(__IntPtr obj); + } + + public static ulong ppf_AchievementProgress_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgress_GetID(obj); + return __ret; + } + + public static string ppf_AchievementProgress_GetBitfield(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgress_GetBitfield(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static long ppf_AchievementProgress_GetCount(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgress_GetCount(obj); + return __ret; + } + + public static bool ppf_AchievementProgress_GetIsUnlocked(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgress_GetIsUnlocked(obj); + return __ret; + } + + public static string ppf_AchievementProgress_GetName(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgress_GetName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static ulong ppf_AchievementProgress_GetUnlockTime(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgress_GetUnlockTime(obj); + return __ret; + } + + public static __IntPtr ppf_AchievementProgress_GetExtraData(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgress_GetExtraData(obj); + return __ret; + } + + public static uint ppf_AchievementProgress_GetExtraDataLength(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgress_GetExtraDataLength(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgressArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementProgressArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgressArray_GetNextUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementProgressArray_GetNextUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgressArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_AchievementProgressArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgressArray_GetTotalSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_AchievementProgressArray_GetTotalSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementProgressArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_AchievementProgressArray_HasNextPage(__IntPtr obj); + } + + public static __IntPtr ppf_AchievementProgressArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_AchievementProgressArray_GetElement(obj, index); + return __ret; + } + + public static string ppf_AchievementProgressArray_GetNextUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgressArray_GetNextUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_AchievementProgressArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgressArray_GetSize(obj); + return __ret; + } + + public static UIntPtr ppf_AchievementProgressArray_GetTotalSize(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgressArray_GetTotalSize(obj); + return __ret; + } + + public static bool ppf_AchievementProgressArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementProgressArray_HasNextPage(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementUpdate_GetJustUnlocked", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_AchievementUpdate_GetJustUnlocked(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AchievementUpdate_GetName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AchievementUpdate_GetName(__IntPtr obj); + } + + public static bool ppf_AchievementUpdate_GetJustUnlocked(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementUpdate_GetJustUnlocked(obj); + return __ret; + } + + public static string ppf_AchievementUpdate_GetName(__IntPtr obj) + { + var __ret = __Internal.ppf_AchievementUpdate_GetName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByMessageOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationByMessageOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByMessageOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationByMessageOptions_Destroy(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByMessageOptions_SetMessageData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationByMessageOptions_SetMessageData(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + } + + public static __IntPtr ppf_ApplicationByMessageOptions_Create() + { + var __ret = __Internal.ppf_ApplicationByMessageOptions_Create(); + return __ret; + } + + public static void ppf_ApplicationByMessageOptions_Destroy(__IntPtr handle) + { + __Internal.ppf_ApplicationByMessageOptions_Destroy(handle); + } + + public static void ppf_ApplicationByMessageOptions_SetMessageData(__IntPtr handle, string value) + { + __Internal.ppf_ApplicationByMessageOptions_SetMessageData(handle, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByPresenceOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationByPresenceOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByPresenceOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationByPresenceOptions_Destroy(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByPresenceOptions_SetDeeplinkMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationByPresenceOptions_SetDeeplinkMessage(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByPresenceOptions_SetDestinationApiName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationByPresenceOptions_SetDestinationApiName(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByPresenceOptions_SetLobbySessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationByPresenceOptions_SetLobbySessionId(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByPresenceOptions_SetMatchSessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationByPresenceOptions_SetMatchSessionId(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByPresenceOptions_SetTrackingId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationByPresenceOptions_SetTrackingId(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationByPresenceOptions_SetExtra", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationByPresenceOptions_SetExtra(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + } + + public static __IntPtr ppf_ApplicationByPresenceOptions_Create() + { + var __ret = __Internal.ppf_ApplicationByPresenceOptions_Create(); + return __ret; + } + + public static void ppf_ApplicationByPresenceOptions_Destroy(__IntPtr handle) + { + __Internal.ppf_ApplicationByPresenceOptions_Destroy(handle); + } + + public static void ppf_ApplicationByPresenceOptions_SetDeeplinkMessage(__IntPtr handle, string value) + { + __Internal.ppf_ApplicationByPresenceOptions_SetDeeplinkMessage(handle, value); + } + + public static void ppf_ApplicationByPresenceOptions_SetDestinationApiName(__IntPtr handle, string value) + { + __Internal.ppf_ApplicationByPresenceOptions_SetDestinationApiName(handle, value); + } + + public static void ppf_ApplicationByPresenceOptions_SetLobbySessionId(__IntPtr handle, string value) + { + __Internal.ppf_ApplicationByPresenceOptions_SetLobbySessionId(handle, value); + } + + public static void ppf_ApplicationByPresenceOptions_SetMatchSessionId(__IntPtr handle, string value) + { + __Internal.ppf_ApplicationByPresenceOptions_SetMatchSessionId(handle, value); + } + + public static void ppf_ApplicationByPresenceOptions_SetTrackingId(__IntPtr handle, string value) + { + __Internal.ppf_ApplicationByPresenceOptions_SetTrackingId(handle, value); + } + + public static void ppf_ApplicationByPresenceOptions_SetExtra(__IntPtr handle, string value) + { + __Internal.ppf_ApplicationByPresenceOptions_SetExtra(handle, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Destination_GetApiName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Destination_GetApiName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Destination_GetDeeplinkMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Destination_GetDeeplinkMessage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Destination_GetDisplayName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Destination_GetDisplayName(__IntPtr obj); + } + + public static string ppf_Destination_GetApiName(__IntPtr obj) + { + var __ret = __Internal.ppf_Destination_GetApiName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Destination_GetDeeplinkMessage(__IntPtr obj) + { + var __ret = __Internal.ppf_Destination_GetDeeplinkMessage(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Destination_GetDisplayName(__IntPtr obj) + { + var __ret = __Internal.ppf_Destination_GetDisplayName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetDisplayName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetDisplayName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetImageUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetImageUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetInviteToken", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetInviteToken(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetSmallImageUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetSmallImageUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetPresenceStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.UserPresenceStatus ppf_User_GetPresenceStatus(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetGender", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.Gender ppf_User_GetGender(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetPresence", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetPresence(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetPresenceDeeplinkMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetPresenceDeeplinkMessage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetPresenceDestinationApiName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetPresenceDestinationApiName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetPresenceLobbySessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetPresenceLobbySessionId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetPresenceMatchSessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetPresenceMatchSessionId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetPresencePackage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetPresencePackage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetPresenceExtra", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetPresenceExtra(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetPresenceIsJoinable", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_User_GetPresenceIsJoinable(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetStoreRegion", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_User_GetStoreRegion(__IntPtr obj); + } + + public static string ppf_User_GetDisplayName(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetDisplayName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_User_GetImageUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetImageUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_User_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetID(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_User_GetInviteToken(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetInviteToken(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_User_GetSmallImageUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetSmallImageUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.UserPresenceStatus ppf_User_GetPresenceStatus(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetPresenceStatus(obj); + return __ret; + } + + public static global::Pico.Platform.Gender ppf_User_GetGender(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetGender(obj); + return __ret; + } + + public static string ppf_User_GetPresence(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetPresence(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_User_GetPresenceDeeplinkMessage(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetPresenceDeeplinkMessage(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_User_GetPresenceDestinationApiName(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetPresenceDestinationApiName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_User_GetPresenceLobbySessionId(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetPresenceLobbySessionId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_User_GetPresenceMatchSessionId(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetPresenceMatchSessionId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_User_GetPresencePackage(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetPresencePackage(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_User_GetPresenceExtra(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetPresenceExtra(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static bool ppf_User_GetPresenceIsJoinable(__IntPtr obj) + { +#if !UNITY_EDITOR + var __ret = __Internal.ppf_User_GetPresenceIsJoinable(obj); + return __ret; +#endif + return true; + } + + public static string ppf_User_GetStoreRegion(__IntPtr obj) + { + var __ret = __Internal.ppf_User_GetStoreRegion(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationInvite_GetDestination", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationInvite_GetDestination(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationInvite_GetRecipient", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationInvite_GetRecipient(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationInvite_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_ApplicationInvite_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationInvite_GetIsActive", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_ApplicationInvite_GetIsActive(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationInvite_GetLobbySessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationInvite_GetLobbySessionId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationInvite_GetMatchSessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationInvite_GetMatchSessionId(__IntPtr obj); + } + + public static __IntPtr ppf_ApplicationInvite_GetDestination(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationInvite_GetDestination(obj); + return __ret; + } + + public static __IntPtr ppf_ApplicationInvite_GetRecipient(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationInvite_GetRecipient(obj); + return __ret; + } + + public static ulong ppf_ApplicationInvite_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationInvite_GetID(obj); + return __ret; + } + + public static bool ppf_ApplicationInvite_GetIsActive(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationInvite_GetIsActive(obj); + return __ret; + } + + public static string ppf_ApplicationInvite_GetLobbySessionId(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationInvite_GetLobbySessionId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_ApplicationInvite_GetMatchSessionId(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationInvite_GetMatchSessionId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationInviteArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationInviteArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationInviteArray_GetNextPageParam", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationInviteArray_GetNextPageParam(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationInviteArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_ApplicationInviteArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationInviteArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_ApplicationInviteArray_HasNextPage(__IntPtr obj); + } + + public static __IntPtr ppf_ApplicationInviteArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_ApplicationInviteArray_GetElement(obj, index); + return __ret; + } + + public static string ppf_ApplicationInviteArray_GetNextPageParam(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationInviteArray_GetNextPageParam(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_ApplicationInviteArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationInviteArray_GetSize(obj); + return __ret; + } + + public static bool ppf_ApplicationInviteArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationInviteArray_HasNextPage(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationOptions_Destroy(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationOptions_SetDeeplinkMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationOptions_SetDeeplinkMessage(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + } + + public static __IntPtr ppf_ApplicationOptions_Create() + { + var __ret = __Internal.ppf_ApplicationOptions_Create(); + return __ret; + } + + public static void ppf_ApplicationOptions_Destroy(__IntPtr handle) + { + __Internal.ppf_ApplicationOptions_Destroy(handle); + } + + public static void ppf_ApplicationOptions_SetDeeplinkMessage(__IntPtr handle, string value) + { + __Internal.ppf_ApplicationOptions_SetDeeplinkMessage(handle, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationVersion_GetCurrentCode", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_ApplicationVersion_GetCurrentCode(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationVersion_GetCurrentName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationVersion_GetCurrentName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationVersion_GetLatestCode", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_ApplicationVersion_GetLatestCode(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationVersion_GetLatestName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationVersion_GetLatestName(__IntPtr obj); + } + + public static long ppf_ApplicationVersion_GetCurrentCode(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationVersion_GetCurrentCode(obj); + return __ret; + } + + public static string ppf_ApplicationVersion_GetCurrentName(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationVersion_GetCurrentName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static long ppf_ApplicationVersion_GetLatestCode(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationVersion_GetLatestCode(obj); + return __ret; + } + + public static string ppf_ApplicationVersion_GetLatestName(__IntPtr obj) + { + var __ret = __Internal.ppf_ApplicationVersion_GetLatestName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AsrResult_GetText", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AsrResult_GetText(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AsrResult_GetIsFinalResult", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_AsrResult_GetIsFinalResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AsrResult_GetSessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AsrResult_GetSessionId(__IntPtr obj); + } + + public static string ppf_AsrResult_GetText(__IntPtr obj) + { + var __ret = __Internal.ppf_AsrResult_GetText(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static bool ppf_AsrResult_GetIsFinalResult(__IntPtr obj) + { + var __ret = __Internal.ppf_AsrResult_GetIsFinalResult(obj); + return __ret; + } + + public static string ppf_AsrResult_GetSessionId(__IntPtr obj) + { + var __ret = __Internal.ppf_AsrResult_GetSessionId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetAssetId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetDetails_GetAssetId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetAssetType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetAssetType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetDownloadStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetDownloadStatus(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetFilepath", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetFilepath(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetIapStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetIapStatus(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetMetadata", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetMetadata(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetFilename", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetFilename(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetVersion", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_AssetDetails_GetVersion(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetIapSku", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetIapSku(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetIapName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetIapName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetIapPrice", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetIapPrice(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetIapCurrency", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetIapCurrency(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetIapDescription", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetIapDescription(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetails_GetIapIcon", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetails_GetIapIcon(__IntPtr obj); + } + + public static ulong ppf_AssetDetails_GetAssetId(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetAssetId(obj); + return __ret; + } + + public static string ppf_AssetDetails_GetAssetType(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetAssetType(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetDetails_GetDownloadStatus(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetDownloadStatus(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetDetails_GetFilepath(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetFilepath(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetDetails_GetIapStatus(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetIapStatus(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetDetails_GetMetadata(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetMetadata(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetDetails_GetFilename(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetFilename(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static int ppf_AssetDetails_GetVersion(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetVersion(obj); + return __ret; + } + + public static string ppf_AssetDetails_GetIapSku(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetIapSku(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetDetails_GetIapName(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetIapName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetDetails_GetIapPrice(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetIapPrice(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetDetails_GetIapCurrency(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetIapCurrency(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetDetails_GetIapDescription(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetIapDescription(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetDetails_GetIapIcon(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetails_GetIapIcon(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetailsArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetailsArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetailsArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_AssetDetailsArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetailsArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_AssetDetailsArray_HasNextPage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetDetailsArray_GetNextPageParam", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetDetailsArray_GetNextPageParam(__IntPtr obj); + } + + public static __IntPtr ppf_AssetDetailsArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_AssetDetailsArray_GetElement(obj, index); + return __ret; + } + + public static UIntPtr ppf_AssetDetailsArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetailsArray_GetSize(obj); + return __ret; + } + + public static bool ppf_AssetDetailsArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetailsArray_HasNextPage(obj); + return __ret; + } + + public static string ppf_AssetDetailsArray_GetNextPageParam(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetDetailsArray_GetNextPageParam(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDeleteForSafety_GetAssetId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFileDeleteForSafety_GetAssetId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDeleteForSafety_GetReason", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetFileDeleteForSafety_GetReason(__IntPtr obj); + } + + public static ulong ppf_AssetFileDeleteForSafety_GetAssetId(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDeleteForSafety_GetAssetId(obj); + return __ret; + } + + public static string ppf_AssetFileDeleteForSafety_GetReason(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDeleteForSafety_GetReason(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDeleteResult_GetAssetId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFileDeleteResult_GetAssetId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDeleteResult_GetFilepath", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetFileDeleteResult_GetFilepath(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDeleteResult_GetSuccess", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_AssetFileDeleteResult_GetSuccess(__IntPtr obj); + } + + public static ulong ppf_AssetFileDeleteResult_GetAssetId(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDeleteResult_GetAssetId(obj); + return __ret; + } + + public static string ppf_AssetFileDeleteResult_GetFilepath(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDeleteResult_GetFilepath(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static bool ppf_AssetFileDeleteResult_GetSuccess(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDeleteResult_GetSuccess(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDownloadCancelResult_GetAssetId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFileDownloadCancelResult_GetAssetId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDownloadCancelResult_GetFilepath", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetFileDownloadCancelResult_GetFilepath(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDownloadCancelResult_GetSuccess", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_AssetFileDownloadCancelResult_GetSuccess(__IntPtr obj); + } + + public static ulong ppf_AssetFileDownloadCancelResult_GetAssetId(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDownloadCancelResult_GetAssetId(obj); + return __ret; + } + + public static string ppf_AssetFileDownloadCancelResult_GetFilepath(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDownloadCancelResult_GetFilepath(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static bool ppf_AssetFileDownloadCancelResult_GetSuccess(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDownloadCancelResult_GetSuccess(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDownloadResult_GetAssetId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFileDownloadResult_GetAssetId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDownloadResult_GetFilepath", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetFileDownloadResult_GetFilepath(__IntPtr obj); + } + + public static ulong ppf_AssetFileDownloadResult_GetAssetId(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDownloadResult_GetAssetId(obj); + return __ret; + } + + public static string ppf_AssetFileDownloadResult_GetFilepath(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDownloadResult_GetFilepath(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDownloadUpdate_GetAssetId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFileDownloadUpdate_GetAssetId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDownloadUpdate_GetBytesTotal", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFileDownloadUpdate_GetBytesTotal(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDownloadUpdate_GetBytesTransferred", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_AssetFileDownloadUpdate_GetBytesTransferred(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFileDownloadUpdate_GetCompleteStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.AssetFileDownloadCompleteStatus ppf_AssetFileDownloadUpdate_GetCompleteStatus(__IntPtr obj); + } + + public static ulong ppf_AssetFileDownloadUpdate_GetAssetId(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDownloadUpdate_GetAssetId(obj); + return __ret; + } + + public static ulong ppf_AssetFileDownloadUpdate_GetBytesTotal(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDownloadUpdate_GetBytesTotal(obj); + return __ret; + } + + public static long ppf_AssetFileDownloadUpdate_GetBytesTransferred(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDownloadUpdate_GetBytesTransferred(obj); + return __ret; + } + + public static global::Pico.Platform.AssetFileDownloadCompleteStatus ppf_AssetFileDownloadUpdate_GetCompleteStatus(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetFileDownloadUpdate_GetCompleteStatus(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetStatus_GetAssetId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetStatus_GetAssetId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetStatus_GetFilename", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetStatus_GetFilename(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetStatus_GetFilepath", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetStatus_GetFilepath(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetStatus_GetDownloadStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_AssetStatus_GetDownloadStatus(__IntPtr obj); + } + + public static ulong ppf_AssetStatus_GetAssetId(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetStatus_GetAssetId(obj); + return __ret; + } + + public static string ppf_AssetStatus_GetFilename(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetStatus_GetFilename(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetStatus_GetFilepath(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetStatus_GetFilepath(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_AssetStatus_GetDownloadStatus(__IntPtr obj) + { + var __ret = __Internal.ppf_AssetStatus_GetDownloadStatus(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_CaptureInfo_GetImagePath", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_CaptureInfo_GetImagePath(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_CaptureInfo_GetJobId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_CaptureInfo_GetJobId(__IntPtr obj); + } + + public static string ppf_CaptureInfo_GetImagePath(__IntPtr obj) + { + var __ret = __Internal.ppf_CaptureInfo_GetImagePath(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_CaptureInfo_GetJobId(__IntPtr obj) + { + var __ret = __Internal.ppf_CaptureInfo_GetJobId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + /// The creator of the challenge. + public enum ChallengeCreationType + { + /// Unknown. + Unknown = 0, + /// User. + UserCreated = 1, + /// Developer. + DeveloperCreated = 2 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfChallengeCreationType_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfChallengeCreationType_ToString(global::Pico.Platform.ChallengeCreationType value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfChallengeCreationType_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.ChallengeCreationType ppfChallengeCreationType_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfChallengeCreationType_ToString(global::Pico.Platform.ChallengeCreationType value) + { + var __ret = __Internal.ppfChallengeCreationType_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.ChallengeCreationType ppfChallengeCreationType_FromString(string str) + { + var __ret = __Internal.ppfChallengeCreationType_FromString(str); + return __ret; + } + } + + /// Indicates who can see and join the challenge. + public enum ChallengeVisibility + { + /// Unknown. + Unknown = 0, + /// Everyone can see the challenge, but only those invited can join it. + InviteOnly = 1, + /// Everyone can see and join the challenge. + Public = 2, + /// Only those invited can see and join the challenge. + Private = 3 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfChallengeVisibility_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfChallengeVisibility_ToString(global::Pico.Platform.ChallengeVisibility value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfChallengeVisibility_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.ChallengeVisibility ppfChallengeVisibility_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfChallengeVisibility_ToString(global::Pico.Platform.ChallengeVisibility value) + { + var __ret = __Internal.ppfChallengeVisibility_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.ChallengeVisibility ppfChallengeVisibility_FromString(string str) + { + var __ret = __Internal.ppfChallengeVisibility_FromString(str); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_GetDestination", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Leaderboard_GetDestination(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_GetApiName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Leaderboard_GetApiName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Leaderboard_GetID(__IntPtr obj); + } + + public static __IntPtr ppf_Leaderboard_GetDestination(__IntPtr obj) + { + var __ret = __Internal.ppf_Leaderboard_GetDestination(obj); + return __ret; + } + + public static string ppf_Leaderboard_GetApiName(__IntPtr obj) + { + var __ret = __Internal.ppf_Leaderboard_GetApiName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static ulong ppf_Leaderboard_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_Leaderboard_GetID(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_UserArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_UserArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_UserArray_HasNextPage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserArray_GetNextPageParam", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_UserArray_GetNextPageParam(__IntPtr obj); + } + + public static __IntPtr ppf_UserArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_UserArray_GetElement(obj, index); + return __ret; + } + + public static UIntPtr ppf_UserArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_UserArray_GetSize(obj); + return __ret; + } + + public static bool ppf_UserArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_UserArray_HasNextPage(obj); + return __ret; + } + + public static string ppf_UserArray_GetNextPageParam(__IntPtr obj) + { + var __ret = __Internal.ppf_UserArray_GetNextPageParam(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenge_GetCreationType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.ChallengeCreationType ppf_Challenge_GetCreationType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenge_GetInvitedUsers", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Challenge_GetInvitedUsers(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenge_GetLeaderboard", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Challenge_GetLeaderboard(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenge_GetParticipants", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Challenge_GetParticipants(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenge_GetTitle", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Challenge_GetTitle(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenge_GetVisibility", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.ChallengeVisibility ppf_Challenge_GetVisibility(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenge_GetEndDate", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenge_GetEndDate(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenge_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenge_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenge_GetStartDate", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenge_GetStartDate(__IntPtr obj); + } + + public static global::Pico.Platform.ChallengeCreationType ppf_Challenge_GetCreationType(__IntPtr obj) + { + var __ret = __Internal.ppf_Challenge_GetCreationType(obj); + return __ret; + } + + public static __IntPtr ppf_Challenge_GetInvitedUsers(__IntPtr obj) + { + var __ret = __Internal.ppf_Challenge_GetInvitedUsers(obj); + return __ret; + } + + public static __IntPtr ppf_Challenge_GetLeaderboard(__IntPtr obj) + { + var __ret = __Internal.ppf_Challenge_GetLeaderboard(obj); + return __ret; + } + + public static __IntPtr ppf_Challenge_GetParticipants(__IntPtr obj) + { + var __ret = __Internal.ppf_Challenge_GetParticipants(obj); + return __ret; + } + + public static string ppf_Challenge_GetTitle(__IntPtr obj) + { + var __ret = __Internal.ppf_Challenge_GetTitle(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.ChallengeVisibility ppf_Challenge_GetVisibility(__IntPtr obj) + { + var __ret = __Internal.ppf_Challenge_GetVisibility(obj); + return __ret; + } + + public static ulong ppf_Challenge_GetEndDate(__IntPtr obj) + { + var __ret = __Internal.ppf_Challenge_GetEndDate(obj); + return __ret; + } + + public static ulong ppf_Challenge_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_Challenge_GetID(obj); + return __ret; + } + + public static ulong ppf_Challenge_GetStartDate(__IntPtr obj) + { + var __ret = __Internal.ppf_Challenge_GetStartDate(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ChallengeArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeArray_GetNextUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ChallengeArray_GetNextUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeArray_GetPreviousUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ChallengeArray_GetPreviousUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_ChallengeArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeArray_GetTotalCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_ChallengeArray_GetTotalCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_ChallengeArray_HasNextPage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeArray_HasPreviousPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_ChallengeArray_HasPreviousPage(__IntPtr obj); + } + + public static __IntPtr ppf_ChallengeArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_ChallengeArray_GetElement(obj, index); + return __ret; + } + + public static string ppf_ChallengeArray_GetNextUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeArray_GetNextUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_ChallengeArray_GetPreviousUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeArray_GetPreviousUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_ChallengeArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeArray_GetSize(obj); + return __ret; + } + + public static ulong ppf_ChallengeArray_GetTotalCount(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeArray_GetTotalCount(obj); + return __ret; + } + + public static bool ppf_ChallengeArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeArray_HasNextPage(obj); + return __ret; + } + + public static bool ppf_ChallengeArray_HasPreviousPage(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeArray_HasPreviousPage(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntry_GetDisplayScore", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ChallengeEntry_GetDisplayScore(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntry_GetExtraData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ChallengeEntry_GetExtraData(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntry_GetExtraDataLength", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_ChallengeEntry_GetExtraDataLength(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntry_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_ChallengeEntry_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntry_GetRank", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_ChallengeEntry_GetRank(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntry_GetScore", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_ChallengeEntry_GetScore(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntry_GetTimestamp", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_ChallengeEntry_GetTimestamp(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntry_GetUser", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ChallengeEntry_GetUser(__IntPtr obj); + } + + public static string ppf_ChallengeEntry_GetDisplayScore(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntry_GetDisplayScore(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static __IntPtr ppf_ChallengeEntry_GetExtraData(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntry_GetExtraData(obj); + return __ret; + } + + public static uint ppf_ChallengeEntry_GetExtraDataLength(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntry_GetExtraDataLength(obj); + return __ret; + } + + public static ulong ppf_ChallengeEntry_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntry_GetID(obj); + return __ret; + } + + public static int ppf_ChallengeEntry_GetRank(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntry_GetRank(obj); + return __ret; + } + + public static long ppf_ChallengeEntry_GetScore(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntry_GetScore(obj); + return __ret; + } + + public static ulong ppf_ChallengeEntry_GetTimestamp(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntry_GetTimestamp(obj); + return __ret; + } + + public static __IntPtr ppf_ChallengeEntry_GetUser(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntry_GetUser(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntryArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ChallengeEntryArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntryArray_GetNextUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ChallengeEntryArray_GetNextUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntryArray_GetPreviousUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ChallengeEntryArray_GetPreviousUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntryArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_ChallengeEntryArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntryArray_GetTotalCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_ChallengeEntryArray_GetTotalCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntryArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_ChallengeEntryArray_HasNextPage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeEntryArray_HasPreviousPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_ChallengeEntryArray_HasPreviousPage(__IntPtr obj); + } + + public static __IntPtr ppf_ChallengeEntryArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_ChallengeEntryArray_GetElement(obj, index); + return __ret; + } + + public static string ppf_ChallengeEntryArray_GetNextUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntryArray_GetNextUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_ChallengeEntryArray_GetPreviousUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntryArray_GetPreviousUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_ChallengeEntryArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntryArray_GetSize(obj); + return __ret; + } + + public static ulong ppf_ChallengeEntryArray_GetTotalCount(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntryArray_GetTotalCount(obj); + return __ret; + } + + public static bool ppf_ChallengeEntryArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntryArray_HasNextPage(obj); + return __ret; + } + + public static bool ppf_ChallengeEntryArray_HasPreviousPage(__IntPtr obj) + { + var __ret = __Internal.ppf_ChallengeEntryArray_HasPreviousPage(obj); + return __ret; + } + } + + /// The filter for querying specified challenges. + public enum ChallengeViewerFilter + { + /// Unknown. + Unknown = 0, + /// To return the challenges visible to everyone. + AllVisible = 1, + /// To return the challenges only visible to the participants. + Participating = 2, + /// To return the challenges only visible to those invited. + Invited = 3, + /// To returns the challenges visible to both the participants and those invited. + ParticipatingOrInvited = 4 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfChallengeViewerFilter_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfChallengeViewerFilter_ToString(global::Pico.Platform.ChallengeViewerFilter value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfChallengeViewerFilter_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.ChallengeViewerFilter ppfChallengeViewerFilter_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfChallengeViewerFilter_ToString(global::Pico.Platform.ChallengeViewerFilter value) + { + var __ret = __Internal.ppfChallengeViewerFilter_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.ChallengeViewerFilter ppfChallengeViewerFilter_FromString(string str) + { + var __ret = __Internal.ppfChallengeViewerFilter_FromString(str); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ChallengeOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ChallengeOptions_Destroy(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_SetEndDate", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ChallengeOptions_SetEndDate(__IntPtr handle, ulong value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_SetIncludeActiveChallenges", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ChallengeOptions_SetIncludeActiveChallenges(__IntPtr handle, bool value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_SetIncludeFutureChallenges", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ChallengeOptions_SetIncludeFutureChallenges(__IntPtr handle, bool value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_SetIncludePastChallenges", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ChallengeOptions_SetIncludePastChallenges(__IntPtr handle, bool value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_SetLeaderboardName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ChallengeOptions_SetLeaderboardName(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_SetStartDate", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ChallengeOptions_SetStartDate(__IntPtr handle, ulong value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_SetTitle", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ChallengeOptions_SetTitle(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_SetViewerFilter", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ChallengeOptions_SetViewerFilter(__IntPtr handle, global::Pico.Platform.ChallengeViewerFilter value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ChallengeOptions_SetVisibility", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ChallengeOptions_SetVisibility(__IntPtr handle, global::Pico.Platform.ChallengeVisibility value); + } + + public static __IntPtr ppf_ChallengeOptions_Create() + { + var __ret = __Internal.ppf_ChallengeOptions_Create(); + return __ret; + } + + public static void ppf_ChallengeOptions_Destroy(__IntPtr handle) + { + __Internal.ppf_ChallengeOptions_Destroy(handle); + } + + public static void ppf_ChallengeOptions_SetEndDate(__IntPtr handle, ulong value) + { + __Internal.ppf_ChallengeOptions_SetEndDate(handle, value); + } + + public static void ppf_ChallengeOptions_SetIncludeActiveChallenges(__IntPtr handle, bool value) + { + __Internal.ppf_ChallengeOptions_SetIncludeActiveChallenges(handle, value); + } + + public static void ppf_ChallengeOptions_SetIncludeFutureChallenges(__IntPtr handle, bool value) + { + __Internal.ppf_ChallengeOptions_SetIncludeFutureChallenges(handle, value); + } + + public static void ppf_ChallengeOptions_SetIncludePastChallenges(__IntPtr handle, bool value) + { + __Internal.ppf_ChallengeOptions_SetIncludePastChallenges(handle, value); + } + + public static void ppf_ChallengeOptions_SetLeaderboardName(__IntPtr handle, string value) + { + __Internal.ppf_ChallengeOptions_SetLeaderboardName(handle, value); + } + + public static void ppf_ChallengeOptions_SetStartDate(__IntPtr handle, ulong value) + { + __Internal.ppf_ChallengeOptions_SetStartDate(handle, value); + } + + public static void ppf_ChallengeOptions_SetTitle(__IntPtr handle, string value) + { + __Internal.ppf_ChallengeOptions_SetTitle(handle, value); + } + + public static void ppf_ChallengeOptions_SetViewerFilter(__IntPtr handle, global::Pico.Platform.ChallengeViewerFilter value) + { + __Internal.ppf_ChallengeOptions_SetViewerFilter(handle, value); + } + + public static void ppf_ChallengeOptions_SetVisibility(__IntPtr handle, global::Pico.Platform.ChallengeVisibility value) + { + __Internal.ppf_ChallengeOptions_SetVisibility(handle, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_DataStore_Contains", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_DataStore_Contains(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string key); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_DataStore_GetKey", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_DataStore_GetKey(__IntPtr obj, int index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_DataStore_GetNumKeys", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_DataStore_GetNumKeys(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_DataStore_GetValue", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_DataStore_GetValue(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string key); + } + + public static uint ppf_DataStore_Contains(__IntPtr obj, string key) + { + var __ret = __Internal.ppf_DataStore_Contains(obj, key); + return __ret; + } + + public static string ppf_DataStore_GetKey(__IntPtr obj, int index) + { + var __ret = __Internal.ppf_DataStore_GetKey(obj, index); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_DataStore_GetNumKeys(__IntPtr obj) + { + var __ret = __Internal.ppf_DataStore_GetNumKeys(obj); + return __ret; + } + + public static string ppf_DataStore_GetValue(__IntPtr obj, string key) + { + var __ret = __Internal.ppf_DataStore_GetValue(obj, key); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_DestinationArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_DestinationArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_DestinationArray_GetNextPageParam", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_DestinationArray_GetNextPageParam(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_DestinationArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_DestinationArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_DestinationArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_DestinationArray_HasNextPage(__IntPtr obj); + } + + public static __IntPtr ppf_DestinationArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_DestinationArray_GetElement(obj, index); + return __ret; + } + + public static string ppf_DestinationArray_GetNextPageParam(__IntPtr obj) + { + var __ret = __Internal.ppf_DestinationArray_GetNextPageParam(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_DestinationArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_DestinationArray_GetSize(obj); + return __ret; + } + + public static bool ppf_DestinationArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_DestinationArray_HasNextPage(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_DetectSensitiveResult_GetFilteredText", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_DetectSensitiveResult_GetFilteredText(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_DetectSensitiveResult_GetProposal", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.SensitiveProposal ppf_DetectSensitiveResult_GetProposal(__IntPtr obj); + } + + public static string ppf_DetectSensitiveResult_GetFilteredText(__IntPtr obj) + { + var __ret = __Internal.ppf_DetectSensitiveResult_GetFilteredText(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.SensitiveProposal ppf_DetectSensitiveResult_GetProposal(__IntPtr obj) + { + var __ret = __Internal.ppf_DetectSensitiveResult_GetProposal(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_EntitlementCheckResult_GetHasEntitlement", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_EntitlementCheckResult_GetHasEntitlement(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_EntitlementCheckResult_GetStatusCode", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_EntitlementCheckResult_GetStatusCode(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_EntitlementCheckResult_GetStatusMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_EntitlementCheckResult_GetStatusMessage(__IntPtr obj); + } + + public static bool ppf_EntitlementCheckResult_GetHasEntitlement(__IntPtr obj) + { + var __ret = __Internal.ppf_EntitlementCheckResult_GetHasEntitlement(obj); + return __ret; + } + + public static int ppf_EntitlementCheckResult_GetStatusCode(__IntPtr obj) + { + var __ret = __Internal.ppf_EntitlementCheckResult_GetStatusCode(obj); + return __ret; + } + + public static string ppf_EntitlementCheckResult_GetStatusMessage(__IntPtr obj) + { + var __ret = __Internal.ppf_EntitlementCheckResult_GetStatusMessage(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Error_GetMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Error_GetMessage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Error_GetCode", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_Error_GetCode(__IntPtr obj); + } + + public static string ppf_Error_GetMessage(__IntPtr obj) + { + var __ret = __Internal.ppf_Error_GetMessage(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static int ppf_Error_GetCode(__IntPtr obj) + { + var __ret = __Internal.ppf_Error_GetCode(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchDetails_GetDeeplinkMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LaunchDetails_GetDeeplinkMessage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchDetails_GetDestinationApiName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LaunchDetails_GetDestinationApiName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchDetails_GetLobbySessionID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LaunchDetails_GetLobbySessionID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchDetails_GetMatchSessionID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LaunchDetails_GetMatchSessionID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchDetails_GetExtra", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LaunchDetails_GetExtra(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchDetails_GetRoomID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_LaunchDetails_GetRoomID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchDetails_GetChallengeID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_LaunchDetails_GetChallengeID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchDetails_GetTrackingID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LaunchDetails_GetTrackingID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchDetails_GetLaunchType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.LaunchType ppf_LaunchDetails_GetLaunchType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchDetails_GetClientAction", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LaunchDetails_GetClientAction(__IntPtr obj); + } + + public static string ppf_LaunchDetails_GetDeeplinkMessage(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchDetails_GetDeeplinkMessage(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_LaunchDetails_GetDestinationApiName(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchDetails_GetDestinationApiName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_LaunchDetails_GetLobbySessionID(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchDetails_GetLobbySessionID(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_LaunchDetails_GetMatchSessionID(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchDetails_GetMatchSessionID(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_LaunchDetails_GetExtra(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchDetails_GetExtra(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static ulong ppf_LaunchDetails_GetRoomID(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchDetails_GetRoomID(obj); + return __ret; + } + + public static ulong ppf_LaunchDetails_GetChallengeID(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchDetails_GetChallengeID(obj); + return __ret; + } + + public static string ppf_LaunchDetails_GetTrackingID(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchDetails_GetTrackingID(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.LaunchType ppf_LaunchDetails_GetLaunchType(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchDetails_GetLaunchType(obj); + return __ret; + } + + public static string ppf_LaunchDetails_GetClientAction(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchDetails_GetClientAction(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_SystemInfo_GetROMVersion", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SystemInfo_GetROMVersion(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SystemInfo_GetLocale", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SystemInfo_GetLocale(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SystemInfo_GetProductName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SystemInfo_GetProductName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SystemInfo_GetIsCnDevice", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_SystemInfo_GetIsCnDevice(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SystemInfo_GetMatrixVersionName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SystemInfo_GetMatrixVersionName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SystemInfo_GetMatrixVersionCode", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_SystemInfo_GetMatrixVersionCode(__IntPtr obj); + } + + public static string ppf_SystemInfo_GetROMVersion(__IntPtr obj) + { + var __ret = __Internal.ppf_SystemInfo_GetROMVersion(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_SystemInfo_GetLocale(__IntPtr obj) + { + var __ret = __Internal.ppf_SystemInfo_GetLocale(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_SystemInfo_GetProductName(__IntPtr obj) + { + var __ret = __Internal.ppf_SystemInfo_GetProductName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static bool ppf_SystemInfo_GetIsCnDevice(__IntPtr obj) + { + var __ret = __Internal.ppf_SystemInfo_GetIsCnDevice(obj); + return __ret; + } + + public static string ppf_SystemInfo_GetMatrixVersionName(__IntPtr obj) + { + var __ret = __Internal.ppf_SystemInfo_GetMatrixVersionName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static long ppf_SystemInfo_GetMatrixVersionCode(__IntPtr obj) + { + var __ret = __Internal.ppf_SystemInfo_GetMatrixVersionCode(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationLifecycle_GetLaunchDetails", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ApplicationLifecycle_GetLaunchDetails(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ApplicationLifecycle_LogDeeplinkResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ApplicationLifecycle_LogDeeplinkResult([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string trackingID, global::Pico.Platform.LaunchResult result); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Application_GetSystemInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Application_GetSystemInfo(); + } + + public static __IntPtr ppf_ApplicationLifecycle_GetLaunchDetails() + { + var __ret = __Internal.ppf_ApplicationLifecycle_GetLaunchDetails(); + return __ret; + } + + public static void ppf_ApplicationLifecycle_LogDeeplinkResult(string trackingID, global::Pico.Platform.LaunchResult result) + { + __Internal.ppf_ApplicationLifecycle_LogDeeplinkResult(trackingID, result); + } + + public static __IntPtr ppf_Application_GetSystemInfo() + { + var __ret = __Internal.ppf_Application_GetSystemInfo(); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Packet_Free", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Packet_Free(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Packet_GetBytes", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Packet_GetBytes(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Packet_GetSenderID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Packet_GetSenderID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Packet_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_Packet_GetSize(__IntPtr obj); + } + + public static void ppf_Packet_Free(__IntPtr obj) + { + __Internal.ppf_Packet_Free(obj); + } + + public static __IntPtr ppf_Packet_GetBytes(__IntPtr obj) + { + var __ret = __Internal.ppf_Packet_GetBytes(obj); + return __ret; + } + + public static string ppf_Packet_GetSenderID(__IntPtr obj) + { + var __ret = __Internal.ppf_Packet_GetSenderID(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_Packet_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_Packet_GetSize(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Net_ReadPacket", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Net_ReadPacket(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Net_SendPacket", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_Net_SendPacket([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userID, UIntPtr length, __IntPtr bytes); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Net_SendPacket2", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_Net_SendPacket2([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userID, UIntPtr length, __IntPtr bytes, bool reliable); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Net_SendPacketToCurrentRoom", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_Net_SendPacketToCurrentRoom(UIntPtr length, __IntPtr bytes); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Net_SendPacketToCurrentRoom2", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_Net_SendPacketToCurrentRoom2(UIntPtr length, __IntPtr bytes, bool reliable); + } + + public static __IntPtr ppf_Net_ReadPacket() + { + var __ret = __Internal.ppf_Net_ReadPacket(); + return __ret; + } + + public static bool ppf_Net_SendPacket(string userID, UIntPtr length, __IntPtr bytes) + { + var __ret = __Internal.ppf_Net_SendPacket(userID, length, bytes); + return __ret; + } + + public static bool ppf_Net_SendPacket2(string userID, UIntPtr length, __IntPtr bytes, bool reliable) + { + var __ret = __Internal.ppf_Net_SendPacket2(userID, length, bytes, reliable); + return __ret; + } + + public static bool ppf_Net_SendPacketToCurrentRoom(UIntPtr length, __IntPtr bytes) + { + var __ret = __Internal.ppf_Net_SendPacketToCurrentRoom(length, bytes); + return __ret; + } + + public static bool ppf_Net_SendPacketToCurrentRoom2(UIntPtr length, __IntPtr bytes, bool reliable) + { + var __ret = __Internal.ppf_Net_SendPacketToCurrentRoom2(length, bytes, reliable); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioPropertyOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcAudioPropertyOptions_Destroy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioPropertyOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcAudioPropertyOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioPropertyOptions_SetInterval", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcAudioPropertyOptions_SetInterval(__IntPtr obj, int value); + } + + public static void ppf_RtcAudioPropertyOptions_Destroy(__IntPtr obj) + { + __Internal.ppf_RtcAudioPropertyOptions_Destroy(obj); + } + + public static __IntPtr ppf_RtcAudioPropertyOptions_Create() + { + var __ret = __Internal.ppf_RtcAudioPropertyOptions_Create(); + return __ret; + } + + public static void ppf_RtcAudioPropertyOptions_SetInterval(__IntPtr obj, int value) + { + __Internal.ppf_RtcAudioPropertyOptions_SetInterval(obj, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcStreamSyncInfoOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcStreamSyncInfoOptions_Destroy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcStreamSyncInfoOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcStreamSyncInfoOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcStreamSyncInfoOptions_SetStreamIndex", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcStreamSyncInfoOptions_SetStreamIndex(__IntPtr obj, global::Pico.Platform.RtcStreamIndex value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcStreamSyncInfoOptions_SetRepeatCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcStreamSyncInfoOptions_SetRepeatCount(__IntPtr obj, int value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcStreamSyncInfoOptions_SetStreamType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcStreamSyncInfoOptions_SetStreamType(__IntPtr obj, global::Pico.Platform.RtcSyncInfoStreamType value); + } + + public static void ppf_RtcStreamSyncInfoOptions_Destroy(__IntPtr obj) + { + __Internal.ppf_RtcStreamSyncInfoOptions_Destroy(obj); + } + + public static __IntPtr ppf_RtcStreamSyncInfoOptions_Create() + { + var __ret = __Internal.ppf_RtcStreamSyncInfoOptions_Create(); + return __ret; + } + + public static void ppf_RtcStreamSyncInfoOptions_SetStreamIndex(__IntPtr obj, global::Pico.Platform.RtcStreamIndex value) + { + __Internal.ppf_RtcStreamSyncInfoOptions_SetStreamIndex(obj, value); + } + + public static void ppf_RtcStreamSyncInfoOptions_SetRepeatCount(__IntPtr obj, int value) + { + __Internal.ppf_RtcStreamSyncInfoOptions_SetRepeatCount(obj, value); + } + + public static void ppf_RtcStreamSyncInfoOptions_SetStreamType(__IntPtr obj, global::Pico.Platform.RtcSyncInfoStreamType value) + { + __Internal.ppf_RtcStreamSyncInfoOptions_SetStreamType(obj, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcRoomOptions_Destroy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRoomOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomOptions_SetRoomProfileType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcRoomOptions_SetRoomProfileType(__IntPtr obj, global::Pico.Platform.RtcRoomProfileType value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomOptions_SetIsAutoSubscribeAudio", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcRoomOptions_SetIsAutoSubscribeAudio(__IntPtr obj, bool value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomOptions_SetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcRoomOptions_SetRoomId(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomOptions_SetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcRoomOptions_SetUserId(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomOptions_SetUserExtra", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcRoomOptions_SetUserExtra(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomOptions_SetToken", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcRoomOptions_SetToken(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + } + + public static void ppf_RtcRoomOptions_Destroy(__IntPtr obj) + { + __Internal.ppf_RtcRoomOptions_Destroy(obj); + } + + public static __IntPtr ppf_RtcRoomOptions_Create() + { + var __ret = __Internal.ppf_RtcRoomOptions_Create(); + return __ret; + } + + public static void ppf_RtcRoomOptions_SetRoomProfileType(__IntPtr obj, global::Pico.Platform.RtcRoomProfileType value) + { + __Internal.ppf_RtcRoomOptions_SetRoomProfileType(obj, value); + } + + public static void ppf_RtcRoomOptions_SetIsAutoSubscribeAudio(__IntPtr obj, bool value) + { + __Internal.ppf_RtcRoomOptions_SetIsAutoSubscribeAudio(obj, value); + } + + public static void ppf_RtcRoomOptions_SetRoomId(__IntPtr obj, string value) + { + __Internal.ppf_RtcRoomOptions_SetRoomId(obj, value); + } + + public static void ppf_RtcRoomOptions_SetUserId(__IntPtr obj, string value) + { + __Internal.ppf_RtcRoomOptions_SetUserId(obj, value); + } + + public static void ppf_RtcRoomOptions_SetUserExtra(__IntPtr obj, string value) + { + __Internal.ppf_RtcRoomOptions_SetUserExtra(obj, value); + } + + public static void ppf_RtcRoomOptions_SetToken(__IntPtr obj, string value) + { + __Internal.ppf_RtcRoomOptions_SetToken(obj, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrameOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcAudioFrameOptions_Destroy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrameOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcAudioFrameOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrameOptions_SetSampleRate", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcAudioFrameOptions_SetSampleRate(__IntPtr obj, global::Pico.Platform.RtcAudioSampleRate value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrameOptions_SetChannel", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcAudioFrameOptions_SetChannel(__IntPtr obj, global::Pico.Platform.RtcAudioChannel value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrameOptions_SetTimeStampInUs", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcAudioFrameOptions_SetTimeStampInUs(__IntPtr obj, long value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrameOptions_SetData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcAudioFrameOptions_SetData(__IntPtr obj, __IntPtr value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrameOptions_SetDataSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcAudioFrameOptions_SetDataSize(__IntPtr obj, long value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrameOptions_SetDeepCopy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcAudioFrameOptions_SetDeepCopy(__IntPtr obj, bool value); + } + + public static void ppf_RtcAudioFrameOptions_Destroy(__IntPtr obj) + { + __Internal.ppf_RtcAudioFrameOptions_Destroy(obj); + } + + public static __IntPtr ppf_RtcAudioFrameOptions_Create() + { + var __ret = __Internal.ppf_RtcAudioFrameOptions_Create(); + return __ret; + } + + public static void ppf_RtcAudioFrameOptions_SetSampleRate(__IntPtr obj, global::Pico.Platform.RtcAudioSampleRate value) + { + __Internal.ppf_RtcAudioFrameOptions_SetSampleRate(obj, value); + } + + public static void ppf_RtcAudioFrameOptions_SetChannel(__IntPtr obj, global::Pico.Platform.RtcAudioChannel value) + { + __Internal.ppf_RtcAudioFrameOptions_SetChannel(obj, value); + } + + public static void ppf_RtcAudioFrameOptions_SetTimeStampInUs(__IntPtr obj, long value) + { + __Internal.ppf_RtcAudioFrameOptions_SetTimeStampInUs(obj, value); + } + + public static void ppf_RtcAudioFrameOptions_SetData(__IntPtr obj, __IntPtr value) + { + __Internal.ppf_RtcAudioFrameOptions_SetData(obj, value); + } + + public static void ppf_RtcAudioFrameOptions_SetDataSize(__IntPtr obj, long value) + { + __Internal.ppf_RtcAudioFrameOptions_SetDataSize(obj, value); + } + + public static void ppf_RtcAudioFrameOptions_SetDeepCopy(__IntPtr obj, bool value) + { + __Internal.ppf_RtcAudioFrameOptions_SetDeepCopy(obj, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_InitRtcEngine", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcEngineInitResult ppf_Rtc_InitRtcEngine(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_UnInitRtcEngine", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_UnInitRtcEngine(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_JoinRoom", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_Rtc_JoinRoom(__IntPtr roomOptions); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_LeaveRoom", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_Rtc_LeaveRoom([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_DestroyRoom", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_DestroyRoom([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_PublishRoom", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_PublishRoom([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_UnPublishRoom", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_UnPublishRoom([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_UpdateToken", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_UpdateToken([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string token); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_EnableAudioPropertiesReport", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_EnableAudioPropertiesReport(__IntPtr config); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_MuteLocalAudio", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_MuteLocalAudio(global::Pico.Platform.RtcMuteState muteState); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_RoomPauseAllSubscribedStream", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_RoomPauseAllSubscribedStream([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, global::Pico.Platform.RtcPauseResumeMediaType mediaType); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_RoomResumeAllSubscribedStream", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_RoomResumeAllSubscribedStream([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, global::Pico.Platform.RtcPauseResumeMediaType mediaType); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SetAudioPlaybackDevice", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_SetAudioPlaybackDevice(global::Pico.Platform.RtcAudioPlaybackDevice device); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SetAudioScenario", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_SetAudioScenario(global::Pico.Platform.RtcAudioScenarioType scenario); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SetCaptureVolume", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_SetCaptureVolume(global::Pico.Platform.RtcStreamIndex index, int volume); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SetEarMonitorMode", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_SetEarMonitorMode(global::Pico.Platform.RtcEarMonitorMode earMonitorMode); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SetEarMonitorVolume", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_SetEarMonitorVolume(int volume); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SetPlaybackVolume", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_SetPlaybackVolume(int volume); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_StartAudioCapture", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_StartAudioCapture(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_StopAudioCapture", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_StopAudioCapture(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_RoomPublishStream", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_RoomPublishStream([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, global::Pico.Platform.RtcMediaStreamType streamType); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_RoomSetRemoteAudioPlaybackVolume", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_RoomSetRemoteAudioPlaybackVolume([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userId, int volume); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_RoomSubscribeStream", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_RoomSubscribeStream([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userId, global::Pico.Platform.RtcMediaStreamType mediaType); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_RoomUnPublishStream", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_RoomUnPublishStream([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, global::Pico.Platform.RtcMediaStreamType streamType); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_RoomUnsubscribeStream", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_RoomUnsubscribeStream([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userId, global::Pico.Platform.RtcMediaStreamType mediaType); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SendRoomBinaryMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_Rtc_SendRoomBinaryMessage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, __IntPtr message, int length); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SendRoomMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_Rtc_SendRoomMessage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string message); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SendStreamSyncInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_Rtc_SendStreamSyncInfo(__IntPtr data, int length, __IntPtr config); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SendUserBinaryMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_Rtc_SendUserBinaryMessage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userId, __IntPtr message, int length); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SendUserMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_Rtc_SendUserMessage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string roomId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string message); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SetAudioSourceType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_Rtc_SetAudioSourceType(global::Pico.Platform.RtcAudioSourceType type); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_SetScreenAudioSourceType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Rtc_SetScreenAudioSourceType(global::Pico.Platform.RtcAudioSourceType sourceType); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_PushExternalAudioFrame", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_Rtc_PushExternalAudioFrame(__IntPtr audioFrame); + } + + public static global::Pico.Platform.RtcEngineInitResult ppf_Rtc_InitRtcEngine() + { + var __ret = __Internal.ppf_Rtc_InitRtcEngine(); + return __ret; + } + + public static void ppf_Rtc_UnInitRtcEngine() + { + __Internal.ppf_Rtc_UnInitRtcEngine(); + } + + public static int ppf_Rtc_JoinRoom(__IntPtr roomOptions) + { + var __ret = __Internal.ppf_Rtc_JoinRoom(roomOptions); + return __ret; + } + + public static int ppf_Rtc_LeaveRoom(string roomId) + { + var __ret = __Internal.ppf_Rtc_LeaveRoom(roomId); + return __ret; + } + + public static void ppf_Rtc_DestroyRoom(string roomId) + { + __Internal.ppf_Rtc_DestroyRoom(roomId); + } + + public static void ppf_Rtc_PublishRoom(string roomId) + { + __Internal.ppf_Rtc_PublishRoom(roomId); + } + + public static void ppf_Rtc_UnPublishRoom(string roomId) + { + __Internal.ppf_Rtc_UnPublishRoom(roomId); + } + + public static void ppf_Rtc_UpdateToken(string roomId, string token) + { + __Internal.ppf_Rtc_UpdateToken(roomId, token); + } + + public static void ppf_Rtc_EnableAudioPropertiesReport(__IntPtr config) + { + __Internal.ppf_Rtc_EnableAudioPropertiesReport(config); + } + + public static void ppf_Rtc_MuteLocalAudio(global::Pico.Platform.RtcMuteState muteState) + { + __Internal.ppf_Rtc_MuteLocalAudio(muteState); + } + + public static void ppf_Rtc_RoomPauseAllSubscribedStream(string roomId, global::Pico.Platform.RtcPauseResumeMediaType mediaType) + { + __Internal.ppf_Rtc_RoomPauseAllSubscribedStream(roomId, mediaType); + } + + public static void ppf_Rtc_RoomResumeAllSubscribedStream(string roomId, global::Pico.Platform.RtcPauseResumeMediaType mediaType) + { + __Internal.ppf_Rtc_RoomResumeAllSubscribedStream(roomId, mediaType); + } + + public static void ppf_Rtc_SetAudioPlaybackDevice(global::Pico.Platform.RtcAudioPlaybackDevice device) + { + __Internal.ppf_Rtc_SetAudioPlaybackDevice(device); + } + + public static void ppf_Rtc_SetAudioScenario(global::Pico.Platform.RtcAudioScenarioType scenario) + { + __Internal.ppf_Rtc_SetAudioScenario(scenario); + } + + public static void ppf_Rtc_SetCaptureVolume(global::Pico.Platform.RtcStreamIndex index, int volume) + { + __Internal.ppf_Rtc_SetCaptureVolume(index, volume); + } + + public static void ppf_Rtc_SetEarMonitorMode(global::Pico.Platform.RtcEarMonitorMode earMonitorMode) + { + __Internal.ppf_Rtc_SetEarMonitorMode(earMonitorMode); + } + + public static void ppf_Rtc_SetEarMonitorVolume(int volume) + { + __Internal.ppf_Rtc_SetEarMonitorVolume(volume); + } + + public static void ppf_Rtc_SetPlaybackVolume(int volume) + { + __Internal.ppf_Rtc_SetPlaybackVolume(volume); + } + + public static void ppf_Rtc_StartAudioCapture() + { + __Internal.ppf_Rtc_StartAudioCapture(); + } + + public static void ppf_Rtc_StopAudioCapture() + { + __Internal.ppf_Rtc_StopAudioCapture(); + } + + public static void ppf_Rtc_RoomPublishStream(string roomId, global::Pico.Platform.RtcMediaStreamType streamType) + { + __Internal.ppf_Rtc_RoomPublishStream(roomId, streamType); + } + + public static void ppf_Rtc_RoomSetRemoteAudioPlaybackVolume(string roomId, string userId, int volume) + { + __Internal.ppf_Rtc_RoomSetRemoteAudioPlaybackVolume(roomId, userId, volume); + } + + public static void ppf_Rtc_RoomSubscribeStream(string roomId, string userId, global::Pico.Platform.RtcMediaStreamType mediaType) + { + __Internal.ppf_Rtc_RoomSubscribeStream(roomId, userId, mediaType); + } + + public static void ppf_Rtc_RoomUnPublishStream(string roomId, global::Pico.Platform.RtcMediaStreamType streamType) + { + __Internal.ppf_Rtc_RoomUnPublishStream(roomId, streamType); + } + + public static void ppf_Rtc_RoomUnsubscribeStream(string roomId, string userId, global::Pico.Platform.RtcMediaStreamType mediaType) + { + __Internal.ppf_Rtc_RoomUnsubscribeStream(roomId, userId, mediaType); + } + + public static long ppf_Rtc_SendRoomBinaryMessage(string roomId, __IntPtr message, int length) + { + var __ret = __Internal.ppf_Rtc_SendRoomBinaryMessage(roomId, message, length); + return __ret; + } + + public static long ppf_Rtc_SendRoomMessage(string roomId, string message) + { + var __ret = __Internal.ppf_Rtc_SendRoomMessage(roomId, message); + return __ret; + } + + public static int ppf_Rtc_SendStreamSyncInfo(__IntPtr data, int length, __IntPtr config) + { + var __ret = __Internal.ppf_Rtc_SendStreamSyncInfo(data, length, config); + return __ret; + } + + public static long ppf_Rtc_SendUserBinaryMessage(string roomId, string userId, __IntPtr message, int length) + { + var __ret = __Internal.ppf_Rtc_SendUserBinaryMessage(roomId, userId, message, length); + return __ret; + } + + public static long ppf_Rtc_SendUserMessage(string roomId, string userId, string message) + { + var __ret = __Internal.ppf_Rtc_SendUserMessage(roomId, userId, message); + return __ret; + } + + public static int ppf_Rtc_SetAudioSourceType(global::Pico.Platform.RtcAudioSourceType type) + { + var __ret = __Internal.ppf_Rtc_SetAudioSourceType(type); + return __ret; + } + + public static void ppf_Rtc_SetScreenAudioSourceType(global::Pico.Platform.RtcAudioSourceType sourceType) + { + __Internal.ppf_Rtc_SetScreenAudioSourceType(sourceType); + } + + public static int ppf_Rtc_PushExternalAudioFrame(__IntPtr audioFrame) + { + var __ret = __Internal.ppf_Rtc_PushExternalAudioFrame(audioFrame); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_StartAsrOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_StartAsrOptions_Destroy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_StartAsrOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_StartAsrOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_StartAsrOptions_SetAutoStop", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_StartAsrOptions_SetAutoStop(__IntPtr obj, bool value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_StartAsrOptions_SetVadMaxDurationInSeconds", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_StartAsrOptions_SetVadMaxDurationInSeconds(__IntPtr obj, int value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_StartAsrOptions_SetShowPunctual", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_StartAsrOptions_SetShowPunctual(__IntPtr obj, bool value); + } + + public static void ppf_StartAsrOptions_Destroy(__IntPtr obj) + { + __Internal.ppf_StartAsrOptions_Destroy(obj); + } + + public static __IntPtr ppf_StartAsrOptions_Create() + { + var __ret = __Internal.ppf_StartAsrOptions_Create(); + return __ret; + } + + public static void ppf_StartAsrOptions_SetAutoStop(__IntPtr obj, bool value) + { + __Internal.ppf_StartAsrOptions_SetAutoStop(obj, value); + } + + public static void ppf_StartAsrOptions_SetVadMaxDurationInSeconds(__IntPtr obj, int value) + { + __Internal.ppf_StartAsrOptions_SetVadMaxDurationInSeconds(obj, value); + } + + public static void ppf_StartAsrOptions_SetShowPunctual(__IntPtr obj, bool value) + { + __Internal.ppf_StartAsrOptions_SetShowPunctual(obj, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Speech_InitAsrEngine", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.AsrEngineInitResult ppf_Speech_InitAsrEngine(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Speech_StartAsr", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_Speech_StartAsr(__IntPtr option); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Speech_StopAsr", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_Speech_StopAsr(); + } + + public static global::Pico.Platform.AsrEngineInitResult ppf_Speech_InitAsrEngine() + { + var __ret = __Internal.ppf_Speech_InitAsrEngine(); + return __ret; + } + + public static int ppf_Speech_StartAsr(__IntPtr option) + { + var __ret = __Internal.ppf_Speech_StartAsr(option); + return __ret; + } + + public static void ppf_Speech_StopAsr() + { + __Internal.ppf_Speech_StopAsr(); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Game_InitializeWithToken", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Game_InitializeWithToken([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string accessToken); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Game_InitializeWithTokenAccountTypeOne", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Game_InitializeWithTokenAccountTypeOne([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string accessToken); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Game_InitializeAuto", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Game_InitializeAuto(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Game_UnInitialize", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_Game_UnInitialize(); + } + + public static ulong ppf_Game_InitializeWithToken(string accessToken) + { + var __ret = __Internal.ppf_Game_InitializeWithToken(accessToken); + return __ret; + } + + public static ulong ppf_Game_InitializeWithTokenAccountTypeOne(string accessToken) + { + var __ret = __Internal.ppf_Game_InitializeWithTokenAccountTypeOne(accessToken); + return __ret; + } + + public static ulong ppf_Game_InitializeAuto() + { + var __ret = __Internal.ppf_Game_InitializeAuto(); + return __ret; + } + + public static bool ppf_Game_UnInitialize() + { + var __ret = __Internal.ppf_Game_UnInitialize(); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_InviteOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_InviteOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_InviteOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_InviteOptions_Destroy(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_InviteOptions_AddSuggestedUser", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_InviteOptions_AddSuggestedUser(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_InviteOptions_ClearSuggestedUsers", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_InviteOptions_ClearSuggestedUsers(__IntPtr handle); + } + + public static __IntPtr ppf_InviteOptions_Create() + { + var __ret = __Internal.ppf_InviteOptions_Create(); + return __ret; + } + + public static void ppf_InviteOptions_Destroy(__IntPtr handle) + { + __Internal.ppf_InviteOptions_Destroy(handle); + } + + public static void ppf_InviteOptions_AddSuggestedUser(__IntPtr handle, string value) + { + __Internal.ppf_InviteOptions_AddSuggestedUser(handle, value); + } + + public static void ppf_InviteOptions_ClearSuggestedUsers(__IntPtr handle) + { + __Internal.ppf_InviteOptions_ClearSuggestedUsers(handle); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_KeyValuePair_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_KeyValuePair_Destroy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_GetKey", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_KeyValuePair_GetKey(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_SetKey", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_KeyValuePair_SetKey(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string key); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_GetValueType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.KVPairType ppf_KeyValuePair_GetValueType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_GetIntValue", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_KeyValuePair_GetIntValue(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_SetIntValue", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_KeyValuePair_SetIntValue(__IntPtr obj, int value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_GetDoubleValue", CallingConvention = __CallingConvention.Cdecl)] + internal static extern double ppf_KeyValuePair_GetDoubleValue(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_SetDoubleValue", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_KeyValuePair_SetDoubleValue(__IntPtr obj, double value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_GetStringValue", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_KeyValuePair_GetStringValue(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePair_SetStringValue", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_KeyValuePair_SetStringValue(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + } + + public static __IntPtr ppf_KeyValuePair_Create() + { + var __ret = __Internal.ppf_KeyValuePair_Create(); + return __ret; + } + + public static void ppf_KeyValuePair_Destroy(__IntPtr obj) + { + __Internal.ppf_KeyValuePair_Destroy(obj); + } + + public static string ppf_KeyValuePair_GetKey(__IntPtr obj) + { + var __ret = __Internal.ppf_KeyValuePair_GetKey(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static void ppf_KeyValuePair_SetKey(__IntPtr obj, string key) + { + __Internal.ppf_KeyValuePair_SetKey(obj, key); + } + + public static global::Pico.Platform.KVPairType ppf_KeyValuePair_GetValueType(__IntPtr obj) + { + var __ret = __Internal.ppf_KeyValuePair_GetValueType(obj); + return __ret; + } + + public static int ppf_KeyValuePair_GetIntValue(__IntPtr obj) + { + var __ret = __Internal.ppf_KeyValuePair_GetIntValue(obj); + return __ret; + } + + public static void ppf_KeyValuePair_SetIntValue(__IntPtr obj, int value) + { + __Internal.ppf_KeyValuePair_SetIntValue(obj, value); + } + + public static double ppf_KeyValuePair_GetDoubleValue(__IntPtr obj) + { + var __ret = __Internal.ppf_KeyValuePair_GetDoubleValue(obj); + return __ret; + } + + public static void ppf_KeyValuePair_SetDoubleValue(__IntPtr obj, double value) + { + __Internal.ppf_KeyValuePair_SetDoubleValue(obj, value); + } + + public static string ppf_KeyValuePair_GetStringValue(__IntPtr obj) + { + var __ret = __Internal.ppf_KeyValuePair_GetStringValue(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static void ppf_KeyValuePair_SetStringValue(__IntPtr obj, string value) + { + __Internal.ppf_KeyValuePair_SetStringValue(obj, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePairArray_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_KeyValuePairArray_Create(UIntPtr size); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePairArray_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_KeyValuePairArray_Destroy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_KeyValuePairArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_KeyValuePairArray_GetElement(__IntPtr obj, UIntPtr index); + } + + public static __IntPtr ppf_KeyValuePairArray_Create(UIntPtr size) + { + var __ret = __Internal.ppf_KeyValuePairArray_Create(size); + return __ret; + } + + public static void ppf_KeyValuePairArray_Destroy(__IntPtr obj) + { + __Internal.ppf_KeyValuePairArray_Destroy(obj); + } + + public static __IntPtr ppf_KeyValuePairArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_KeyValuePairArray_GetElement(obj, index); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchFriendRequestFlowResult_GetDidCancel", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_LaunchFriendRequestFlowResult_GetDidCancel(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LaunchFriendRequestFlowResult_GetDidSendRequest", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_LaunchFriendRequestFlowResult_GetDidSendRequest(__IntPtr obj); + } + + public static bool ppf_LaunchFriendRequestFlowResult_GetDidCancel(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchFriendRequestFlowResult_GetDidCancel(obj); + return __ret; + } + + public static bool ppf_LaunchFriendRequestFlowResult_GetDidSendRequest(__IntPtr obj) + { + var __ret = __Internal.ppf_LaunchFriendRequestFlowResult_GetDidSendRequest(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LeaderboardArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardArray_GetNextUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LeaderboardArray_GetNextUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_LeaderboardArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardArray_GetTotalCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_LeaderboardArray_GetTotalCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_LeaderboardArray_HasNextPage(__IntPtr obj); + } + + public static __IntPtr ppf_LeaderboardArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_LeaderboardArray_GetElement(obj, index); + return __ret; + } + + public static string ppf_LeaderboardArray_GetNextUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardArray_GetNextUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_LeaderboardArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardArray_GetSize(obj); + return __ret; + } + + public static ulong ppf_LeaderboardArray_GetTotalCount(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardArray_GetTotalCount(obj); + return __ret; + } + + public static bool ppf_LeaderboardArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardArray_HasNextPage(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_SupplementaryMetric_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_SupplementaryMetric_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SupplementaryMetric_GetMetric", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_SupplementaryMetric_GetMetric(__IntPtr obj); + } + + public static ulong ppf_SupplementaryMetric_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_SupplementaryMetric_GetID(obj); + return __ret; + } + + public static long ppf_SupplementaryMetric_GetMetric(__IntPtr obj) + { + var __ret = __Internal.ppf_SupplementaryMetric_GetMetric(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntry_GetSupplementaryMetric", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LeaderboardEntry_GetSupplementaryMetric(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntry_GetDisplayScore", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LeaderboardEntry_GetDisplayScore(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntry_GetExtraData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LeaderboardEntry_GetExtraData(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntry_GetExtraDataLength", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_LeaderboardEntry_GetExtraDataLength(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntry_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_LeaderboardEntry_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntry_GetRank", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_LeaderboardEntry_GetRank(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntry_GetScore", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_LeaderboardEntry_GetScore(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntry_GetTimestamp", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_LeaderboardEntry_GetTimestamp(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntry_GetUser", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LeaderboardEntry_GetUser(__IntPtr obj); + } + + public static __IntPtr ppf_LeaderboardEntry_GetSupplementaryMetric(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntry_GetSupplementaryMetric(obj); + return __ret; + } + + public static string ppf_LeaderboardEntry_GetDisplayScore(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntry_GetDisplayScore(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static __IntPtr ppf_LeaderboardEntry_GetExtraData(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntry_GetExtraData(obj); + return __ret; + } + + public static uint ppf_LeaderboardEntry_GetExtraDataLength(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntry_GetExtraDataLength(obj); + return __ret; + } + + public static ulong ppf_LeaderboardEntry_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntry_GetID(obj); + return __ret; + } + + public static int ppf_LeaderboardEntry_GetRank(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntry_GetRank(obj); + return __ret; + } + + public static long ppf_LeaderboardEntry_GetScore(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntry_GetScore(obj); + return __ret; + } + + public static ulong ppf_LeaderboardEntry_GetTimestamp(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntry_GetTimestamp(obj); + return __ret; + } + + public static __IntPtr ppf_LeaderboardEntry_GetUser(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntry_GetUser(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntryArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LeaderboardEntryArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntryArray_GetNextUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LeaderboardEntryArray_GetNextUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntryArray_GetPreviousUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_LeaderboardEntryArray_GetPreviousUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntryArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_LeaderboardEntryArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntryArray_GetTotalCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_LeaderboardEntryArray_GetTotalCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntryArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_LeaderboardEntryArray_HasNextPage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardEntryArray_HasPreviousPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_LeaderboardEntryArray_HasPreviousPage(__IntPtr obj); + } + + public static __IntPtr ppf_LeaderboardEntryArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_LeaderboardEntryArray_GetElement(obj, index); + return __ret; + } + + public static string ppf_LeaderboardEntryArray_GetNextUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntryArray_GetNextUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_LeaderboardEntryArray_GetPreviousUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntryArray_GetPreviousUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_LeaderboardEntryArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntryArray_GetSize(obj); + return __ret; + } + + public static ulong ppf_LeaderboardEntryArray_GetTotalCount(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntryArray_GetTotalCount(obj); + return __ret; + } + + public static bool ppf_LeaderboardEntryArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntryArray_HasNextPage(obj); + return __ret; + } + + public static bool ppf_LeaderboardEntryArray_HasPreviousPage(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardEntryArray_HasPreviousPage(obj); + return __ret; + } + } + + /// The type of filter to use when retrieving leaderboard entries. + public enum LeaderboardFilterType + { + /// Do not filter. + None = 0, + /// Only display the entries of the user's friends. + Friends = 1, + /// Do not filter. + Unknown = 2, + /// Display the entries of specific users by specifying user IDs. + UserIds = 3 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfLeaderboardFilterType_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfLeaderboardFilterType_ToString(global::Pico.Platform.LeaderboardFilterType value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfLeaderboardFilterType_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.LeaderboardFilterType ppfLeaderboardFilterType_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfLeaderboardFilterType_ToString(global::Pico.Platform.LeaderboardFilterType value) + { + var __ret = __Internal.ppfLeaderboardFilterType_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.LeaderboardFilterType ppfLeaderboardFilterType_FromString(string str) + { + var __ret = __Internal.ppfLeaderboardFilterType_FromString(str); + return __ret; + } + } + + /// From where to start returning leaderboard entries. + public enum LeaderboardStartAt + { + /// To return entries from top 1. + Top = 0, + /// To place the current logged-in user's entry in the middle of the list on the first page. For example, if the total number of entries is 10, `pageSize` is set to `5`, and the user's rank is top 5, the ranks displayed on the first page will be top 3, 4, 5, 6, and 7. Top 1 and 2 will not be displayed, and top 8, 9, and 10 will be displayed on the second page. + CenteredOnViewer = 1, + /// To place the current logged-in user's entry on the top of the list on the first page. For example, if the total number of entries is 10, `pageSize` is set to `5`, and the user's rank is top 5, the ranks displayed on the first page will be top 5, 6, 7, 8, and 9. Top 1, 2, 3, and 4 will not be displayed, and top 10 will be displayed on the second page. + CenteredOnViewerOrTop = 2, + /// To returns an empty list. + Unknown = 3 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfLeaderboardStartAt_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfLeaderboardStartAt_ToString(global::Pico.Platform.LeaderboardStartAt value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfLeaderboardStartAt_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.LeaderboardStartAt ppfLeaderboardStartAt_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfLeaderboardStartAt_ToString(global::Pico.Platform.LeaderboardStartAt value) + { + var __ret = __Internal.ppfLeaderboardStartAt_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.LeaderboardStartAt ppfLeaderboardStartAt_FromString(string str) + { + var __ret = __Internal.ppfLeaderboardStartAt_FromString(str); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardUpdateStatus_GetDidUpdate", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_LeaderboardUpdateStatus_GetDidUpdate(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardUpdateStatus_GetUpdatedChallengeId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_LeaderboardUpdateStatus_GetUpdatedChallengeId(__IntPtr obj, uint index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_LeaderboardUpdateStatus_GetUpdatedChallengeIdsSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_LeaderboardUpdateStatus_GetUpdatedChallengeIdsSize(__IntPtr obj); + } + + public static bool ppf_LeaderboardUpdateStatus_GetDidUpdate(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardUpdateStatus_GetDidUpdate(obj); + return __ret; + } + + public static ulong ppf_LeaderboardUpdateStatus_GetUpdatedChallengeId(__IntPtr obj, uint index) + { + var __ret = __Internal.ppf_LeaderboardUpdateStatus_GetUpdatedChallengeId(obj, index); + return __ret; + } + + public static uint ppf_LeaderboardUpdateStatus_GetUpdatedChallengeIdsSize(__IntPtr obj) + { + var __ret = __Internal.ppf_LeaderboardUpdateStatus_GetUpdatedChallengeIdsSize(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingAdminSnapshotCandidate_GetCanMatch", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_MatchmakingAdminSnapshotCandidate_GetCanMatch(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingAdminSnapshotCandidate_GetMyTotalScore", CallingConvention = __CallingConvention.Cdecl)] + internal static extern double ppf_MatchmakingAdminSnapshotCandidate_GetMyTotalScore(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingAdminSnapshotCandidate_GetTheirCurrentThreshold", CallingConvention = __CallingConvention.Cdecl)] + internal static extern double ppf_MatchmakingAdminSnapshotCandidate_GetTheirCurrentThreshold(__IntPtr obj); + } + + public static bool ppf_MatchmakingAdminSnapshotCandidate_GetCanMatch(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingAdminSnapshotCandidate_GetCanMatch(obj); + return __ret; + } + + public static double ppf_MatchmakingAdminSnapshotCandidate_GetMyTotalScore(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingAdminSnapshotCandidate_GetMyTotalScore(obj); + return __ret; + } + + public static double ppf_MatchmakingAdminSnapshotCandidate_GetTheirCurrentThreshold(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingAdminSnapshotCandidate_GetTheirCurrentThreshold(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingAdminSnapshotCandidateArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingAdminSnapshotCandidateArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingAdminSnapshotCandidateArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_MatchmakingAdminSnapshotCandidateArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingAdminSnapshotCandidateArray_GetTotalCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_MatchmakingAdminSnapshotCandidateArray_GetTotalCount(__IntPtr obj); + } + + public static __IntPtr ppf_MatchmakingAdminSnapshotCandidateArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_MatchmakingAdminSnapshotCandidateArray_GetElement(obj, index); + return __ret; + } + + public static UIntPtr ppf_MatchmakingAdminSnapshotCandidateArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingAdminSnapshotCandidateArray_GetSize(obj); + return __ret; + } + + public static UIntPtr ppf_MatchmakingAdminSnapshotCandidateArray_GetTotalCount(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingAdminSnapshotCandidateArray_GetTotalCount(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingAdminSnapshot_GetCandidates", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingAdminSnapshot_GetCandidates(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingAdminSnapshot_GetMyCurrentThreshold", CallingConvention = __CallingConvention.Cdecl)] + internal static extern double ppf_MatchmakingAdminSnapshot_GetMyCurrentThreshold(__IntPtr obj); + } + + public static __IntPtr ppf_MatchmakingAdminSnapshot_GetCandidates(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingAdminSnapshot_GetCandidates(obj); + return __ret; + } + + public static double ppf_MatchmakingAdminSnapshot_GetMyCurrentThreshold(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingAdminSnapshot_GetMyCurrentThreshold(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingEnqueueResult_GetAdminSnapshot", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingEnqueueResult_GetAdminSnapshot(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingEnqueueResult_GetAverageWait", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_MatchmakingEnqueueResult_GetAverageWait(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingEnqueueResult_GetMatchesInLastHourCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_MatchmakingEnqueueResult_GetMatchesInLastHourCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingEnqueueResult_GetMaxExpectedWait", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_MatchmakingEnqueueResult_GetMaxExpectedWait(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingEnqueueResult_GetRecentMatchPercentage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_MatchmakingEnqueueResult_GetRecentMatchPercentage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingEnqueueResult_GetPool", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingEnqueueResult_GetPool(__IntPtr obj); + } + + public static __IntPtr ppf_MatchmakingEnqueueResult_GetAdminSnapshot(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingEnqueueResult_GetAdminSnapshot(obj); + return __ret; + } + + public static uint ppf_MatchmakingEnqueueResult_GetAverageWait(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingEnqueueResult_GetAverageWait(obj); + return __ret; + } + + public static uint ppf_MatchmakingEnqueueResult_GetMatchesInLastHourCount(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingEnqueueResult_GetMatchesInLastHourCount(obj); + return __ret; + } + + public static uint ppf_MatchmakingEnqueueResult_GetMaxExpectedWait(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingEnqueueResult_GetMaxExpectedWait(obj); + return __ret; + } + + public static uint ppf_MatchmakingEnqueueResult_GetRecentMatchPercentage(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingEnqueueResult_GetRecentMatchPercentage(obj); + return __ret; + } + + public static string ppf_MatchmakingEnqueueResult_GetPool(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingEnqueueResult_GetPool(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + /// The room's joinability. + public enum RoomJoinability + { + /// Unknown + Unknown = 0, + /// The user is already in the room. + AreIn = 1, + /// The user is kicked out of the room. + AreKicked = 2, + /// Others can join the room. + CanJoin = 3, + /// The room is full. + IsFull = 4, + /// (Not available, do not use it) + NoViewer = 5, + /// The room is not allowed to be joined. + PolicyPrevents = 6 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfRoomJoinability_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfRoomJoinability_ToString(global::Pico.Platform.RoomJoinability value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfRoomJoinability_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RoomJoinability ppfRoomJoinability_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfRoomJoinability_ToString(global::Pico.Platform.RoomJoinability value) + { + var __ret = __Internal.ppfRoomJoinability_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.RoomJoinability ppfRoomJoinability_FromString(string str) + { + var __ret = __Internal.ppfRoomJoinability_FromString(str); + return __ret; + } + } + + /// The room's join policy, which determines who are allowed to join the room. + public enum RoomJoinPolicy + { + /// No join policy. + None = 0, + /// Anyone is allowed to join the room. + Everyone = 1, + /// Only the friends of the users who are already in the room are allowed to join. + FriendsOfMembers = 2, + /// Only the friends of the room owner are allowed to join the room. + FriendsOfOwner = 3, + /// Only those who have been invited are allowed to join the room. + InvitedUsers = 4, + /// No join policy. + Unknown = 5 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfRoomJoinPolicy_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfRoomJoinPolicy_ToString(global::Pico.Platform.RoomJoinPolicy value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfRoomJoinPolicy_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RoomJoinPolicy ppfRoomJoinPolicy_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfRoomJoinPolicy_ToString(global::Pico.Platform.RoomJoinPolicy value) + { + var __ret = __Internal.ppfRoomJoinPolicy_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.RoomJoinPolicy ppfRoomJoinPolicy_FromString(string str) + { + var __ret = __Internal.ppfRoomJoinPolicy_FromString(str); + return __ret; + } + } + + /// The type of the room. + public enum RoomType + { + /// Unknown. + Unknown = 0, + /// Matchmaking room. + Matchmaking = 1, + /// Moderated room. + Moderated = 2, + /// Private room. + Private = 3, + /// Named room. + Named = 4 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfRoomType_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfRoomType_ToString(global::Pico.Platform.RoomType value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfRoomType_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RoomType ppfRoomType_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfRoomType_ToString(global::Pico.Platform.RoomType value) + { + var __ret = __Internal.ppfRoomType_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.RoomType ppfRoomType_FromString(string str) + { + var __ret = __Internal.ppfRoomType_FromString(str); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetDataStore", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Room_GetDataStore(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetOwner", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Room_GetOwner(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Room_GetName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetUsers", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Room_GetUsers(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetDescription", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Room_GetDescription(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetIsMembershipLocked", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_Room_GetIsMembershipLocked(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetJoinPolicy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RoomJoinPolicy ppf_Room_GetJoinPolicy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetJoinability", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RoomJoinability ppf_Room_GetJoinability(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetMaxUsers", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_Room_GetMaxUsers(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RoomType ppf_Room_GetType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetPlayerNumber", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_Room_GetPlayerNumber(__IntPtr obj); + } + + public static __IntPtr ppf_Room_GetDataStore(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetDataStore(obj); + return __ret; + } + + public static __IntPtr ppf_Room_GetOwner(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetOwner(obj); + return __ret; + } + + public static string ppf_Room_GetName(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static __IntPtr ppf_Room_GetUsers(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetUsers(obj); + return __ret; + } + + public static string ppf_Room_GetDescription(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetDescription(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static ulong ppf_Room_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetID(obj); + return __ret; + } + + public static bool ppf_Room_GetIsMembershipLocked(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetIsMembershipLocked(obj); + return __ret; + } + + public static global::Pico.Platform.RoomJoinPolicy ppf_Room_GetJoinPolicy(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetJoinPolicy(obj); + return __ret; + } + + public static global::Pico.Platform.RoomJoinability ppf_Room_GetJoinability(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetJoinability(obj); + return __ret; + } + + public static uint ppf_Room_GetMaxUsers(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetMaxUsers(obj); + return __ret; + } + + public static global::Pico.Platform.RoomType ppf_Room_GetType(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetType(obj); + return __ret; + } + + public static uint ppf_Room_GetPlayerNumber(__IntPtr obj) + { + var __ret = __Internal.ppf_Room_GetPlayerNumber(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingRoom_GetPingTime", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_MatchmakingRoom_GetPingTime(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingRoom_GetRoom", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingRoom_GetRoom(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingRoom_HasPingTime", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_MatchmakingRoom_HasPingTime(__IntPtr obj); + } + + public static uint ppf_MatchmakingRoom_GetPingTime(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingRoom_GetPingTime(obj); + return __ret; + } + + public static __IntPtr ppf_MatchmakingRoom_GetRoom(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingRoom_GetRoom(obj); + return __ret; + } + + public static bool ppf_MatchmakingRoom_HasPingTime(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingRoom_HasPingTime(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingRoomArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingRoomArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingRoomArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_MatchmakingRoomArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingRoomArray_GetTotalCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_MatchmakingRoomArray_GetTotalCount(__IntPtr obj); + } + + public static __IntPtr ppf_MatchmakingRoomArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_MatchmakingRoomArray_GetElement(obj, index); + return __ret; + } + + public static UIntPtr ppf_MatchmakingRoomArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingRoomArray_GetSize(obj); + return __ret; + } + + public static int ppf_MatchmakingRoomArray_GetTotalCount(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingRoomArray_GetTotalCount(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingBrowseResult_GetEnqueueResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingBrowseResult_GetEnqueueResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingBrowseResult_GetRooms", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingBrowseResult_GetRooms(__IntPtr obj); + } + + public static __IntPtr ppf_MatchmakingBrowseResult_GetEnqueueResult(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingBrowseResult_GetEnqueueResult(obj); + return __ret; + } + + public static __IntPtr ppf_MatchmakingBrowseResult_GetRooms(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingBrowseResult_GetRooms(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingEnqueueResultAndRoom_GetMatchmakingEnqueueResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingEnqueueResultAndRoom_GetMatchmakingEnqueueResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingEnqueueResultAndRoom_GetRoom", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingEnqueueResultAndRoom_GetRoom(__IntPtr obj); + } + + public static __IntPtr ppf_MatchmakingEnqueueResultAndRoom_GetMatchmakingEnqueueResult(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingEnqueueResultAndRoom_GetMatchmakingEnqueueResult(obj); + return __ret; + } + + public static __IntPtr ppf_MatchmakingEnqueueResultAndRoom_GetRoom(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingEnqueueResultAndRoom_GetRoom(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_MatchmakingOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_Destroy(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_SetCreateRoomDataStoreString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_SetCreateRoomDataStoreString(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_ClearCreateRoomDataStore", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_ClearCreateRoomDataStore(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_SetCreateRoomJoinPolicy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_SetCreateRoomJoinPolicy(__IntPtr handle, global::Pico.Platform.RoomJoinPolicy value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_SetCreateRoomMaxUsers", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_SetCreateRoomMaxUsers(__IntPtr handle, uint value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_ClearEnqueueAdditionalUsers", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_ClearEnqueueAdditionalUsers(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_SetEnqueueDataSettingsInt", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_SetEnqueueDataSettingsInt(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string key, int value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_SetEnqueueDataSettingsDouble", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_SetEnqueueDataSettingsDouble(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string key, double value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_SetEnqueueDataSettingsString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_SetEnqueueDataSettingsString(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_ClearEnqueueDataSettings", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_ClearEnqueueDataSettings(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_SetEnqueueIsDebug", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_SetEnqueueIsDebug(__IntPtr handle, bool value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingOptions_SetEnqueueQueryKey", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_MatchmakingOptions_SetEnqueueQueryKey(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + } + + public static __IntPtr ppf_MatchmakingOptions_Create() + { + var __ret = __Internal.ppf_MatchmakingOptions_Create(); + return __ret; + } + + public static void ppf_MatchmakingOptions_Destroy(__IntPtr handle) + { + __Internal.ppf_MatchmakingOptions_Destroy(handle); + } + + public static void ppf_MatchmakingOptions_SetCreateRoomDataStoreString(__IntPtr handle, string key, string value) + { + __Internal.ppf_MatchmakingOptions_SetCreateRoomDataStoreString(handle, key, value); + } + + public static void ppf_MatchmakingOptions_ClearCreateRoomDataStore(__IntPtr handle) + { + __Internal.ppf_MatchmakingOptions_ClearCreateRoomDataStore(handle); + } + + public static void ppf_MatchmakingOptions_SetCreateRoomJoinPolicy(__IntPtr handle, global::Pico.Platform.RoomJoinPolicy value) + { + __Internal.ppf_MatchmakingOptions_SetCreateRoomJoinPolicy(handle, value); + } + + public static void ppf_MatchmakingOptions_SetCreateRoomMaxUsers(__IntPtr handle, uint value) + { + __Internal.ppf_MatchmakingOptions_SetCreateRoomMaxUsers(handle, value); + } + + public static void ppf_MatchmakingOptions_ClearEnqueueAdditionalUsers(__IntPtr handle) + { + __Internal.ppf_MatchmakingOptions_ClearEnqueueAdditionalUsers(handle); + } + + public static void ppf_MatchmakingOptions_SetEnqueueDataSettingsInt(__IntPtr handle, string key, int value) + { + __Internal.ppf_MatchmakingOptions_SetEnqueueDataSettingsInt(handle, key, value); + } + + public static void ppf_MatchmakingOptions_SetEnqueueDataSettingsDouble(__IntPtr handle, string key, double value) + { + __Internal.ppf_MatchmakingOptions_SetEnqueueDataSettingsDouble(handle, key, value); + } + + public static void ppf_MatchmakingOptions_SetEnqueueDataSettingsString(__IntPtr handle, string key, string value) + { + __Internal.ppf_MatchmakingOptions_SetEnqueueDataSettingsString(handle, key, value); + } + + public static void ppf_MatchmakingOptions_ClearEnqueueDataSettings(__IntPtr handle) + { + __Internal.ppf_MatchmakingOptions_ClearEnqueueDataSettings(handle); + } + + public static void ppf_MatchmakingOptions_SetEnqueueIsDebug(__IntPtr handle, bool value) + { + __Internal.ppf_MatchmakingOptions_SetEnqueueIsDebug(handle, value); + } + + public static void ppf_MatchmakingOptions_SetEnqueueQueryKey(__IntPtr handle, string value) + { + __Internal.ppf_MatchmakingOptions_SetEnqueueQueryKey(handle, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingStats_GetDrawCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_MatchmakingStats_GetDrawCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingStats_GetLossCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_MatchmakingStats_GetLossCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingStats_GetSkillLevel", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_MatchmakingStats_GetSkillLevel(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingStats_GetSkillMean", CallingConvention = __CallingConvention.Cdecl)] + internal static extern double ppf_MatchmakingStats_GetSkillMean(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingStats_GetSkillStandardDeviation", CallingConvention = __CallingConvention.Cdecl)] + internal static extern double ppf_MatchmakingStats_GetSkillStandardDeviation(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_MatchmakingStats_GetWinCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern uint ppf_MatchmakingStats_GetWinCount(__IntPtr obj); + } + + public static uint ppf_MatchmakingStats_GetDrawCount(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingStats_GetDrawCount(obj); + return __ret; + } + + public static uint ppf_MatchmakingStats_GetLossCount(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingStats_GetLossCount(obj); + return __ret; + } + + public static uint ppf_MatchmakingStats_GetSkillLevel(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingStats_GetSkillLevel(obj); + return __ret; + } + + public static double ppf_MatchmakingStats_GetSkillMean(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingStats_GetSkillMean(obj); + return __ret; + } + + public static double ppf_MatchmakingStats_GetSkillStandardDeviation(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingStats_GetSkillStandardDeviation(obj); + return __ret; + } + + public static uint ppf_MatchmakingStats_GetWinCount(__IntPtr obj) + { + var __ret = __Internal.ppf_MatchmakingStats_GetWinCount(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserAndRoom_GetUser", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_UserAndRoom_GetUser(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserAndRoom_GetRoom", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_UserAndRoom_GetRoom(__IntPtr obj); + } + + public static __IntPtr ppf_UserAndRoom_GetUser(__IntPtr obj) + { + var __ret = __Internal.ppf_UserAndRoom_GetUser(obj); + return __ret; + } + + public static __IntPtr ppf_UserAndRoom_GetRoom(__IntPtr obj) + { + var __ret = __Internal.ppf_UserAndRoom_GetRoom(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserAndRoomArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_UserAndRoomArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserAndRoomArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_UserAndRoomArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserAndRoomArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_UserAndRoomArray_HasNextPage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserAndRoomArray_GetNextPageParam", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_UserAndRoomArray_GetNextPageParam(__IntPtr obj); + } + + public static __IntPtr ppf_UserAndRoomArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_UserAndRoomArray_GetElement(obj, index); + return __ret; + } + + public static UIntPtr ppf_UserAndRoomArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_UserAndRoomArray_GetSize(obj); + return __ret; + } + + public static bool ppf_UserAndRoomArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_UserAndRoomArray_HasNextPage(obj); + return __ret; + } + + public static string ppf_UserAndRoomArray_GetNextPageParam(__IntPtr obj) + { + var __ret = __Internal.ppf_UserAndRoomArray_GetNextPageParam(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcJoinRoomResult_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcJoinRoomResult_GetRoomId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcJoinRoomResult_GetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcJoinRoomResult_GetUserId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcJoinRoomResult_GetErrorCode", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcJoinRoomResult_GetErrorCode(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcJoinRoomResult_GetElapsed", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcJoinRoomResult_GetElapsed(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcJoinRoomResult_GetJoinType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcJoinRoomType ppf_RtcJoinRoomResult_GetJoinType(__IntPtr obj); + } + + public static string ppf_RtcJoinRoomResult_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcJoinRoomResult_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_RtcJoinRoomResult_GetUserId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcJoinRoomResult_GetUserId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static int ppf_RtcJoinRoomResult_GetErrorCode(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcJoinRoomResult_GetErrorCode(obj); + return __ret; + } + + public static int ppf_RtcJoinRoomResult_GetElapsed(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcJoinRoomResult_GetElapsed(obj); + return __ret; + } + + public static global::Pico.Platform.RtcJoinRoomType ppf_RtcJoinRoomResult_GetJoinType(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcJoinRoomResult_GetJoinType(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcLeaveRoomResult_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcLeaveRoomResult_GetRoomId(__IntPtr obj); + } + + public static string ppf_RtcLeaveRoomResult_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcLeaveRoomResult_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomStats_GetTotalDuration", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcRoomStats_GetTotalDuration(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomStats_GetUserCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcRoomStats_GetUserCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomStats_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRoomStats_GetRoomId(__IntPtr obj); + } + + public static int ppf_RtcRoomStats_GetTotalDuration(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRoomStats_GetTotalDuration(obj); + return __ret; + } + + public static int ppf_RtcRoomStats_GetUserCount(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRoomStats_GetUserCount(obj); + return __ret; + } + + public static string ppf_RtcRoomStats_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRoomStats_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserJoinInfo_GetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserJoinInfo_GetUserId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserJoinInfo_GetUserExtra", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserJoinInfo_GetUserExtra(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserJoinInfo_GetElapsed", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcUserJoinInfo_GetElapsed(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserJoinInfo_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserJoinInfo_GetRoomId(__IntPtr obj); + } + + public static string ppf_RtcUserJoinInfo_GetUserId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserJoinInfo_GetUserId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_RtcUserJoinInfo_GetUserExtra(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserJoinInfo_GetUserExtra(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static int ppf_RtcUserJoinInfo_GetElapsed(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserJoinInfo_GetElapsed(obj); + return __ret; + } + + public static string ppf_RtcUserJoinInfo_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserJoinInfo_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserLeaveInfo_GetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserLeaveInfo_GetUserId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserLeaveInfo_GetOfflineReason", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcUserLeaveReasonType ppf_RtcUserLeaveInfo_GetOfflineReason(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserLeaveInfo_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserLeaveInfo_GetRoomId(__IntPtr obj); + } + + public static string ppf_RtcUserLeaveInfo_GetUserId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserLeaveInfo_GetUserId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.RtcUserLeaveReasonType ppf_RtcUserLeaveInfo_GetOfflineReason(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserLeaveInfo_GetOfflineReason(obj); + return __ret; + } + + public static string ppf_RtcUserLeaveInfo_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserLeaveInfo_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomWarn_GetCode", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcRoomWarn_GetCode(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomWarn_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRoomWarn_GetRoomId(__IntPtr obj); + } + + public static int ppf_RtcRoomWarn_GetCode(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRoomWarn_GetCode(obj); + return __ret; + } + + public static string ppf_RtcRoomWarn_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRoomWarn_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomError_GetCode", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcRoomError_GetCode(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomError_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRoomError_GetRoomId(__IntPtr obj); + } + + public static int ppf_RtcRoomError_GetCode(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRoomError_GetCode(obj); + return __ret; + } + + public static string ppf_RtcRoomError_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRoomError_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcMuteInfo_GetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcMuteInfo_GetUserId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcMuteInfo_GetMuteState", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcMuteState ppf_RtcMuteInfo_GetMuteState(__IntPtr obj); + } + + public static string ppf_RtcMuteInfo_GetUserId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcMuteInfo_GetUserId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.RtcMuteState ppf_RtcMuteInfo_GetMuteState(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcMuteInfo_GetMuteState(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcMediaDeviceChangeInfo_GetDeviceId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcMediaDeviceChangeInfo_GetDeviceId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcMediaDeviceChangeInfo_GetDeviceType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcMediaDeviceType ppf_RtcMediaDeviceChangeInfo_GetDeviceType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcMediaDeviceChangeInfo_GetDeviceState", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcMediaDeviceState ppf_RtcMediaDeviceChangeInfo_GetDeviceState(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcMediaDeviceChangeInfo_GetDeviceError", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcMediaDeviceError ppf_RtcMediaDeviceChangeInfo_GetDeviceError(__IntPtr obj); + } + + public static string ppf_RtcMediaDeviceChangeInfo_GetDeviceId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcMediaDeviceChangeInfo_GetDeviceId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.RtcMediaDeviceType ppf_RtcMediaDeviceChangeInfo_GetDeviceType(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcMediaDeviceChangeInfo_GetDeviceType(obj); + return __ret; + } + + public static global::Pico.Platform.RtcMediaDeviceState ppf_RtcMediaDeviceChangeInfo_GetDeviceState(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcMediaDeviceChangeInfo_GetDeviceState(obj); + return __ret; + } + + public static global::Pico.Platform.RtcMediaDeviceError ppf_RtcMediaDeviceChangeInfo_GetDeviceError(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcMediaDeviceChangeInfo_GetDeviceError(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioPropertyInfo_GetVolume", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcAudioPropertyInfo_GetVolume(__IntPtr obj); + } + + public static int ppf_RtcAudioPropertyInfo_GetVolume(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcAudioPropertyInfo_GetVolume(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcLocalAudioPropertiesInfo_GetStreamIndex", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcStreamIndex ppf_RtcLocalAudioPropertiesInfo_GetStreamIndex(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcLocalAudioPropertiesInfo_GetAudioPropertyInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcLocalAudioPropertiesInfo_GetAudioPropertyInfo(__IntPtr obj); + } + + public static global::Pico.Platform.RtcStreamIndex ppf_RtcLocalAudioPropertiesInfo_GetStreamIndex(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcLocalAudioPropertiesInfo_GetStreamIndex(obj); + return __ret; + } + + public static __IntPtr ppf_RtcLocalAudioPropertiesInfo_GetAudioPropertyInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcLocalAudioPropertiesInfo_GetAudioPropertyInfo(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcLocalAudioPropertiesReport_GetAudioPropertiesInfos", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcLocalAudioPropertiesReport_GetAudioPropertiesInfos(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcLocalAudioPropertiesReport_GetAudioPropertiesInfosSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_RtcLocalAudioPropertiesReport_GetAudioPropertiesInfosSize(__IntPtr obj); + } + + public static __IntPtr ppf_RtcLocalAudioPropertiesReport_GetAudioPropertiesInfos(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_RtcLocalAudioPropertiesReport_GetAudioPropertiesInfos(obj, index); + return __ret; + } + + public static UIntPtr ppf_RtcLocalAudioPropertiesReport_GetAudioPropertiesInfosSize(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcLocalAudioPropertiesReport_GetAudioPropertiesInfosSize(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRemoteStreamKey_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRemoteStreamKey_GetRoomId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRemoteStreamKey_GetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRemoteStreamKey_GetUserId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRemoteStreamKey_GetStreamIndex", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcStreamIndex ppf_RtcRemoteStreamKey_GetStreamIndex(__IntPtr obj); + } + + public static string ppf_RtcRemoteStreamKey_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRemoteStreamKey_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_RtcRemoteStreamKey_GetUserId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRemoteStreamKey_GetUserId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.RtcStreamIndex ppf_RtcRemoteStreamKey_GetStreamIndex(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRemoteStreamKey_GetStreamIndex(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRemoteAudioPropertiesInfo_GetStreamKey", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRemoteAudioPropertiesInfo_GetStreamKey(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRemoteAudioPropertiesInfo_GetAudioPropertiesInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRemoteAudioPropertiesInfo_GetAudioPropertiesInfo(__IntPtr obj); + } + + public static __IntPtr ppf_RtcRemoteAudioPropertiesInfo_GetStreamKey(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRemoteAudioPropertiesInfo_GetStreamKey(obj); + return __ret; + } + + public static __IntPtr ppf_RtcRemoteAudioPropertiesInfo_GetAudioPropertiesInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRemoteAudioPropertiesInfo_GetAudioPropertiesInfo(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRemoteAudioPropertiesReport_GetAudioPropertiesInfos", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRemoteAudioPropertiesReport_GetAudioPropertiesInfos(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRemoteAudioPropertiesReport_GetAudioPropertiesInfosSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_RtcRemoteAudioPropertiesReport_GetAudioPropertiesInfosSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRemoteAudioPropertiesReport_GetTotalRemoteVolume", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcRemoteAudioPropertiesReport_GetTotalRemoteVolume(__IntPtr obj); + } + + public static __IntPtr ppf_RtcRemoteAudioPropertiesReport_GetAudioPropertiesInfos(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_RtcRemoteAudioPropertiesReport_GetAudioPropertiesInfos(obj, index); + return __ret; + } + + public static UIntPtr ppf_RtcRemoteAudioPropertiesReport_GetAudioPropertiesInfosSize(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRemoteAudioPropertiesReport_GetAudioPropertiesInfosSize(obj); + return __ret; + } + + public static int ppf_RtcRemoteAudioPropertiesReport_GetTotalRemoteVolume(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRemoteAudioPropertiesReport_GetTotalRemoteVolume(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomMessageReceived_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRoomMessageReceived_GetRoomId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomMessageReceived_GetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRoomMessageReceived_GetUserId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcRoomMessageReceived_GetMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcRoomMessageReceived_GetMessage(__IntPtr obj); + } + + public static string ppf_RtcRoomMessageReceived_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRoomMessageReceived_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_RtcRoomMessageReceived_GetUserId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRoomMessageReceived_GetUserId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_RtcRoomMessageReceived_GetMessage(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcRoomMessageReceived_GetMessage(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcBinaryMessageReceived_GetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcBinaryMessageReceived_GetUserId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcBinaryMessageReceived_GetData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcBinaryMessageReceived_GetData(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcBinaryMessageReceived_GetLength", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcBinaryMessageReceived_GetLength(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcBinaryMessageReceived_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcBinaryMessageReceived_GetRoomId(__IntPtr obj); + } + + public static string ppf_RtcBinaryMessageReceived_GetUserId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcBinaryMessageReceived_GetUserId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static __IntPtr ppf_RtcBinaryMessageReceived_GetData(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcBinaryMessageReceived_GetData(obj); + return __ret; + } + + public static int ppf_RtcBinaryMessageReceived_GetLength(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcBinaryMessageReceived_GetLength(obj); + return __ret; + } + + public static string ppf_RtcBinaryMessageReceived_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcBinaryMessageReceived_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcStreamSyncInfo_GetStreamKey", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcStreamSyncInfo_GetStreamKey(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcStreamSyncInfo_GetStreamType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcSyncInfoStreamType ppf_RtcStreamSyncInfo_GetStreamType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcStreamSyncInfo_GetData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcStreamSyncInfo_GetData(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcStreamSyncInfo_GetLength", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcStreamSyncInfo_GetLength(__IntPtr obj); + } + + public static __IntPtr ppf_RtcStreamSyncInfo_GetStreamKey(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcStreamSyncInfo_GetStreamKey(obj); + return __ret; + } + + public static global::Pico.Platform.RtcSyncInfoStreamType ppf_RtcStreamSyncInfo_GetStreamType(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcStreamSyncInfo_GetStreamType(obj); + return __ret; + } + + public static __IntPtr ppf_RtcStreamSyncInfo_GetData(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcStreamSyncInfo_GetData(obj); + return __ret; + } + + public static int ppf_RtcStreamSyncInfo_GetLength(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcStreamSyncInfo_GetLength(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcFirstLocalVideoFrameCapturedInfo_GetStreamIndex", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcStreamIndex ppf_RtcFirstLocalVideoFrameCapturedInfo_GetStreamIndex(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcFirstLocalVideoFrameCapturedInfo_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcFirstLocalVideoFrameCapturedInfo_GetRoomId(__IntPtr obj); + } + + public static global::Pico.Platform.RtcStreamIndex ppf_RtcFirstLocalVideoFrameCapturedInfo_GetStreamIndex(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcFirstLocalVideoFrameCapturedInfo_GetStreamIndex(obj); + return __ret; + } + + public static string ppf_RtcFirstLocalVideoFrameCapturedInfo_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcFirstLocalVideoFrameCapturedInfo_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcLocalVideoSizeChangeInfo_GetStreamIndex", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcStreamIndex ppf_RtcLocalVideoSizeChangeInfo_GetStreamIndex(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcLocalVideoSizeChangeInfo_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcLocalVideoSizeChangeInfo_GetRoomId(__IntPtr obj); + } + + public static global::Pico.Platform.RtcStreamIndex ppf_RtcLocalVideoSizeChangeInfo_GetStreamIndex(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcLocalVideoSizeChangeInfo_GetStreamIndex(obj); + return __ret; + } + + public static string ppf_RtcLocalVideoSizeChangeInfo_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcLocalVideoSizeChangeInfo_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserPublishInfo_GetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserPublishInfo_GetUserId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserPublishInfo_GetMediaStreamType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcMediaStreamType ppf_RtcUserPublishInfo_GetMediaStreamType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserPublishInfo_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserPublishInfo_GetRoomId(__IntPtr obj); + } + + public static string ppf_RtcUserPublishInfo_GetUserId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserPublishInfo_GetUserId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.RtcMediaStreamType ppf_RtcUserPublishInfo_GetMediaStreamType(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserPublishInfo_GetMediaStreamType(obj); + return __ret; + } + + public static string ppf_RtcUserPublishInfo_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserPublishInfo_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserUnPublishInfo_GetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserUnPublishInfo_GetUserId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserUnPublishInfo_GetMediaStreamType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcMediaStreamType ppf_RtcUserUnPublishInfo_GetMediaStreamType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserUnPublishInfo_GetReason", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcStreamRemoveReason ppf_RtcUserUnPublishInfo_GetReason(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserUnPublishInfo_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserUnPublishInfo_GetRoomId(__IntPtr obj); + } + + public static string ppf_RtcUserUnPublishInfo_GetUserId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserUnPublishInfo_GetUserId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.RtcMediaStreamType ppf_RtcUserUnPublishInfo_GetMediaStreamType(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserUnPublishInfo_GetMediaStreamType(obj); + return __ret; + } + + public static global::Pico.Platform.RtcStreamRemoveReason ppf_RtcUserUnPublishInfo_GetReason(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserUnPublishInfo_GetReason(obj); + return __ret; + } + + public static string ppf_RtcUserUnPublishInfo_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserUnPublishInfo_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RoomArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_RoomArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomArray_GetTotalCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RoomArray_GetTotalCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_RoomArray_HasNextPage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomArray_GetPageSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RoomArray_GetPageSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomArray_GetPageIndex", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RoomArray_GetPageIndex(__IntPtr obj); + } + + public static __IntPtr ppf_RoomArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_RoomArray_GetElement(obj, index); + return __ret; + } + + public static UIntPtr ppf_RoomArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomArray_GetSize(obj); + return __ret; + } + + public static int ppf_RoomArray_GetTotalCount(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomArray_GetTotalCount(obj); + return __ret; + } + + public static bool ppf_RoomArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomArray_HasNextPage(obj); + return __ret; + } + + public static int ppf_RoomArray_GetPageSize(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomArray_GetPageSize(obj); + return __ret; + } + + public static int ppf_RoomArray_GetPageIndex(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomArray_GetPageIndex(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserMessageReceived_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserMessageReceived_GetRoomId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserMessageReceived_GetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserMessageReceived_GetUserId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcUserMessageReceived_GetMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcUserMessageReceived_GetMessage(__IntPtr obj); + } + + public static string ppf_RtcUserMessageReceived_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserMessageReceived_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_RtcUserMessageReceived_GetUserId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserMessageReceived_GetUserId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_RtcUserMessageReceived_GetMessage(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcUserMessageReceived_GetMessage(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcMessageSendResult_GetMessageId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_RtcMessageSendResult_GetMessageId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcMessageSendResult_GetError", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RtcMessageSendResult_GetError(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcMessageSendResult_GetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcMessageSendResult_GetRoomId(__IntPtr obj); + } + + public static long ppf_RtcMessageSendResult_GetMessageId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcMessageSendResult_GetMessageId(obj); + return __ret; + } + + public static int ppf_RtcMessageSendResult_GetError(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcMessageSendResult_GetError(obj); + return __ret; + } + + public static string ppf_RtcMessageSendResult_GetRoomId(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcMessageSendResult_GetRoomId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_CloudStorage_StartNewBackup", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_CloudStorage_StartNewBackup(); + } + + public static ulong ppf_CloudStorage_StartNewBackup() + { + var __ret = __Internal.ppf_CloudStorage_StartNewBackup(); + return __ret; + } + } + + /// The initialization result of the game service. + public enum GameInitializeResult + { + /// Successfully initialized. + Success = 0, + /// Not initialized. + Uninitialized = 1, + /// Network error. + NetworkError = 2, + /// Invalid credentials. + InvalidCredentials = 3, + /// Game service is not available. + ServiceNotAvaliable = 4, + /// Unknown. + Unknown = 5, + /// Invalid server address. + InvalidServerAddr = 6, + /// Duplicate initialization. + DupInitialize = 7 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfPlatformGameInitializeResult_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfPlatformGameInitializeResult_ToString(global::Pico.Platform.GameInitializeResult value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfPlatformGameInitializeResult_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.GameInitializeResult ppfPlatformGameInitializeResult_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfPlatformGameInitializeResult_ToString(global::Pico.Platform.GameInitializeResult value) + { + var __ret = __Internal.ppfPlatformGameInitializeResult_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.GameInitializeResult ppfPlatformGameInitializeResult_FromString(string str) + { + var __ret = __Internal.ppfPlatformGameInitializeResult_FromString(str); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_PlatformGameInitialize_GetResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.GameInitializeResult ppf_PlatformGameInitialize_GetResult(__IntPtr obj); + } + + public static global::Pico.Platform.GameInitializeResult ppf_PlatformGameInitialize_GetResult(__IntPtr obj) + { + var __ret = __Internal.ppf_PlatformGameInitialize_GetResult(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_SendInvitesResult_GetInvites", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SendInvitesResult_GetInvites(__IntPtr obj); + } + + public static __IntPtr ppf_SendInvitesResult_GetInvites(__IntPtr obj) + { + var __ret = __Internal.ppf_SendInvitesResult_GetInvites(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceJoinIntent_GetDeeplinkMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PresenceJoinIntent_GetDeeplinkMessage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceJoinIntent_GetDestinationApiName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PresenceJoinIntent_GetDestinationApiName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceJoinIntent_GetLobbySessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PresenceJoinIntent_GetLobbySessionId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceJoinIntent_GetMatchSessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PresenceJoinIntent_GetMatchSessionId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceJoinIntent_GetExtra", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PresenceJoinIntent_GetExtra(__IntPtr obj); + } + + public static string ppf_PresenceJoinIntent_GetDeeplinkMessage(__IntPtr obj) + { + var __ret = __Internal.ppf_PresenceJoinIntent_GetDeeplinkMessage(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_PresenceJoinIntent_GetDestinationApiName(__IntPtr obj) + { + var __ret = __Internal.ppf_PresenceJoinIntent_GetDestinationApiName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_PresenceJoinIntent_GetLobbySessionId(__IntPtr obj) + { + var __ret = __Internal.ppf_PresenceJoinIntent_GetLobbySessionId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_PresenceJoinIntent_GetMatchSessionId(__IntPtr obj) + { + var __ret = __Internal.ppf_PresenceJoinIntent_GetMatchSessionId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_PresenceJoinIntent_GetExtra(__IntPtr obj) + { + var __ret = __Internal.ppf_PresenceJoinIntent_GetExtra(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomInviteNotification_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_RoomInviteNotification_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomInviteNotification_GetRoomID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_RoomInviteNotification_GetRoomID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomInviteNotification_GetSenderID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RoomInviteNotification_GetSenderID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomInviteNotification_GetSentTime", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_RoomInviteNotification_GetSentTime(__IntPtr obj); + } + + public static ulong ppf_RoomInviteNotification_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomInviteNotification_GetID(obj); + return __ret; + } + + public static ulong ppf_RoomInviteNotification_GetRoomID(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomInviteNotification_GetRoomID(obj); + return __ret; + } + + public static string ppf_RoomInviteNotification_GetSenderID(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomInviteNotification_GetSenderID(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static ulong ppf_RoomInviteNotification_GetSentTime(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomInviteNotification_GetSentTime(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomInviteNotificationArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RoomInviteNotificationArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomInviteNotificationArray_GetNextUrl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RoomInviteNotificationArray_GetNextUrl(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomInviteNotificationArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_RoomInviteNotificationArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomInviteNotificationArray_GetTotalCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RoomInviteNotificationArray_GetTotalCount(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomInviteNotificationArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_RoomInviteNotificationArray_HasNextPage(__IntPtr obj); + } + + public static __IntPtr ppf_RoomInviteNotificationArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_RoomInviteNotificationArray_GetElement(obj, index); + return __ret; + } + + public static string ppf_RoomInviteNotificationArray_GetNextUrl(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomInviteNotificationArray_GetNextUrl(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_RoomInviteNotificationArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomInviteNotificationArray_GetSize(obj); + return __ret; + } + + public static int ppf_RoomInviteNotificationArray_GetTotalCount(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomInviteNotificationArray_GetTotalCount(obj); + return __ret; + } + + public static bool ppf_RoomInviteNotificationArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_RoomInviteNotificationArray_HasNextPage(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportUserInfo_GetGender", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.Gender ppf_SportUserInfo_GetGender(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportUserInfo_GetBirthday", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_SportUserInfo_GetBirthday(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportUserInfo_GetStature", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_SportUserInfo_GetStature(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportUserInfo_GetWeight", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_SportUserInfo_GetWeight(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportUserInfo_GetSportLevel", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_SportUserInfo_GetSportLevel(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportUserInfo_GetDailyDurationInMinutes", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_SportUserInfo_GetDailyDurationInMinutes(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportUserInfo_GetDaysPerWeek", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_SportUserInfo_GetDaysPerWeek(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportUserInfo_GetSportTarget", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.SportTarget ppf_SportUserInfo_GetSportTarget(__IntPtr obj); + } + + public static global::Pico.Platform.Gender ppf_SportUserInfo_GetGender(__IntPtr obj) + { + var __ret = __Internal.ppf_SportUserInfo_GetGender(obj); + return __ret; + } + + public static long ppf_SportUserInfo_GetBirthday(__IntPtr obj) + { + var __ret = __Internal.ppf_SportUserInfo_GetBirthday(obj); + return __ret; + } + + public static int ppf_SportUserInfo_GetStature(__IntPtr obj) + { + var __ret = __Internal.ppf_SportUserInfo_GetStature(obj); + return __ret; + } + + public static int ppf_SportUserInfo_GetWeight(__IntPtr obj) + { + var __ret = __Internal.ppf_SportUserInfo_GetWeight(obj); + return __ret; + } + + public static int ppf_SportUserInfo_GetSportLevel(__IntPtr obj) + { + var __ret = __Internal.ppf_SportUserInfo_GetSportLevel(obj); + return __ret; + } + + public static int ppf_SportUserInfo_GetDailyDurationInMinutes(__IntPtr obj) + { + var __ret = __Internal.ppf_SportUserInfo_GetDailyDurationInMinutes(obj); + return __ret; + } + + public static int ppf_SportUserInfo_GetDaysPerWeek(__IntPtr obj) + { + var __ret = __Internal.ppf_SportUserInfo_GetDaysPerWeek(obj); + return __ret; + } + + public static global::Pico.Platform.SportTarget ppf_SportUserInfo_GetSportTarget(__IntPtr obj) + { + var __ret = __Internal.ppf_SportUserInfo_GetSportTarget(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportDailySummary_GetId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_SportDailySummary_GetId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportDailySummary_GetDate", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_SportDailySummary_GetDate(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportDailySummary_GetDurationInSeconds", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_SportDailySummary_GetDurationInSeconds(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportDailySummary_GetPlanDurationInMinutes", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_SportDailySummary_GetPlanDurationInMinutes(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportDailySummary_GetCalorie", CallingConvention = __CallingConvention.Cdecl)] + internal static extern double ppf_SportDailySummary_GetCalorie(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportDailySummary_GetPlanCalorie", CallingConvention = __CallingConvention.Cdecl)] + internal static extern double ppf_SportDailySummary_GetPlanCalorie(__IntPtr obj); + } + + public static long ppf_SportDailySummary_GetId(__IntPtr obj) + { + var __ret = __Internal.ppf_SportDailySummary_GetId(obj); + return __ret; + } + + public static long ppf_SportDailySummary_GetDate(__IntPtr obj) + { + var __ret = __Internal.ppf_SportDailySummary_GetDate(obj); + return __ret; + } + + public static int ppf_SportDailySummary_GetDurationInSeconds(__IntPtr obj) + { + var __ret = __Internal.ppf_SportDailySummary_GetDurationInSeconds(obj); + return __ret; + } + + public static int ppf_SportDailySummary_GetPlanDurationInMinutes(__IntPtr obj) + { + var __ret = __Internal.ppf_SportDailySummary_GetPlanDurationInMinutes(obj); + return __ret; + } + + public static double ppf_SportDailySummary_GetCalorie(__IntPtr obj) + { + var __ret = __Internal.ppf_SportDailySummary_GetCalorie(obj); + return __ret; + } + + public static double ppf_SportDailySummary_GetPlanCalorie(__IntPtr obj) + { + var __ret = __Internal.ppf_SportDailySummary_GetPlanCalorie(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportDailySummaryArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SportDailySummaryArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportDailySummaryArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_SportDailySummaryArray_GetSize(__IntPtr obj); + } + + public static __IntPtr ppf_SportDailySummaryArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_SportDailySummaryArray_GetElement(obj, index); + return __ret; + } + + public static UIntPtr ppf_SportDailySummaryArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_SportDailySummaryArray_GetSize(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportSummary_GetDurationInSeconds", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_SportSummary_GetDurationInSeconds(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportSummary_GetCalorie", CallingConvention = __CallingConvention.Cdecl)] + internal static extern double ppf_SportSummary_GetCalorie(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportSummary_GetStartTime", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_SportSummary_GetStartTime(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SportSummary_GetEndTime", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_SportSummary_GetEndTime(__IntPtr obj); + } + + public static long ppf_SportSummary_GetDurationInSeconds(__IntPtr obj) + { + var __ret = __Internal.ppf_SportSummary_GetDurationInSeconds(obj); + return __ret; + } + + public static double ppf_SportSummary_GetCalorie(__IntPtr obj) + { + var __ret = __Internal.ppf_SportSummary_GetCalorie(obj); + return __ret; + } + + public static long ppf_SportSummary_GetStartTime(__IntPtr obj) + { + var __ret = __Internal.ppf_SportSummary_GetStartTime(obj); + return __ret; + } + + public static long ppf_SportSummary_GetEndTime(__IntPtr obj) + { + var __ret = __Internal.ppf_SportSummary_GetEndTime(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetExpirationTime", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_Purchase_GetExpirationTime(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetGrantTime", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_Purchase_GetGrantTime(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Purchase_GetID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetSKU", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Purchase_GetSKU(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetIcon", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Purchase_GetIcon(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetAddonsType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.AddonsType ppf_Purchase_GetAddonsType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetOuterId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Purchase_GetOuterId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetCurrentPeriodType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.PeriodType ppf_Purchase_GetCurrentPeriodType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetNextPeriodType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.PeriodType ppf_Purchase_GetNextPeriodType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetNextPayTime", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_Purchase_GetNextPayTime(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetDiscountType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.DiscountType ppf_Purchase_GetDiscountType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Purchase_GetOrderComment", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Purchase_GetOrderComment(__IntPtr obj); + } + + public static long ppf_Purchase_GetExpirationTime(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetExpirationTime(obj); + return __ret; + } + + public static long ppf_Purchase_GetGrantTime(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetGrantTime(obj); + return __ret; + } + + public static string ppf_Purchase_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetID(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Purchase_GetSKU(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetSKU(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Purchase_GetIcon(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetIcon(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.AddonsType ppf_Purchase_GetAddonsType(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetAddonsType(obj); + return __ret; + } + + public static string ppf_Purchase_GetOuterId(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetOuterId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.PeriodType ppf_Purchase_GetCurrentPeriodType(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetCurrentPeriodType(obj); + return __ret; + } + + public static global::Pico.Platform.PeriodType ppf_Purchase_GetNextPeriodType(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetNextPeriodType(obj); + return __ret; + } + + public static long ppf_Purchase_GetNextPayTime(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetNextPayTime(obj); + return __ret; + } + + public static global::Pico.Platform.DiscountType ppf_Purchase_GetDiscountType(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetDiscountType(obj); + return __ret; + } + + public static string ppf_Purchase_GetOrderComment(__IntPtr obj) + { + var __ret = __Internal.ppf_Purchase_GetOrderComment(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_PurchaseArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PurchaseArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PurchaseArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_PurchaseArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PurchaseArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_PurchaseArray_HasNextPage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PurchaseArray_GetNextPageParam", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PurchaseArray_GetNextPageParam(__IntPtr obj); + } + + public static __IntPtr ppf_PurchaseArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_PurchaseArray_GetElement(obj, index); + return __ret; + } + + public static UIntPtr ppf_PurchaseArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_PurchaseArray_GetSize(obj); + return __ret; + } + + public static bool ppf_PurchaseArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_PurchaseArray_HasNextPage(obj); + return __ret; + } + + public static string ppf_PurchaseArray_GetNextPageParam(__IntPtr obj) + { + var __ret = __Internal.ppf_PurchaseArray_GetNextPageParam(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetDescription", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Product_GetDescription(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetDetailDescription", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Product_GetDetailDescription(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetPrice", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Product_GetPrice(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetCurrency", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Product_GetCurrency(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Product_GetName(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetSKU", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Product_GetSKU(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetIcon", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Product_GetIcon(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetAddonsType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.AddonsType ppf_Product_GetAddonsType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetPeriodType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.PeriodType ppf_Product_GetPeriodType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetTrialPeriodUnit", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.PeriodType ppf_Product_GetTrialPeriodUnit(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetTrialPeriodValue", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_Product_GetTrialPeriodValue(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetOuterId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Product_GetOuterId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetOriginalPrice", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Product_GetOriginalPrice(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetGroupId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Product_GetGroupId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_GetLevel", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_Product_GetLevel(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Product_IsContinuous", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_Product_IsContinuous(__IntPtr obj); + } + + public static string ppf_Product_GetDescription(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetDescription(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Product_GetDetailDescription(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetDetailDescription(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Product_GetPrice(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetPrice(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Product_GetCurrency(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetCurrency(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Product_GetName(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetName(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Product_GetSKU(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetSKU(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Product_GetIcon(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetIcon(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.AddonsType ppf_Product_GetAddonsType(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetAddonsType(obj); + return __ret; + } + + public static global::Pico.Platform.PeriodType ppf_Product_GetPeriodType(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetPeriodType(obj); + return __ret; + } + + public static global::Pico.Platform.PeriodType ppf_Product_GetTrialPeriodUnit(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetTrialPeriodUnit(obj); + return __ret; + } + + public static int ppf_Product_GetTrialPeriodValue(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetTrialPeriodValue(obj); + return __ret; + } + + public static string ppf_Product_GetOuterId(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetOuterId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Product_GetOriginalPrice(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetOriginalPrice(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_Product_GetGroupId(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetGroupId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static int ppf_Product_GetLevel(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_GetLevel(obj); + return __ret; + } + + public static bool ppf_Product_IsContinuous(__IntPtr obj) + { + var __ret = __Internal.ppf_Product_IsContinuous(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ProductArray_GetElement", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ProductArray_GetElement(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ProductArray_GetSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_ProductArray_GetSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ProductArray_HasNextPage", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_ProductArray_HasNextPage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ProductArray_GetNextPageParam", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ProductArray_GetNextPageParam(__IntPtr obj); + } + + public static __IntPtr ppf_ProductArray_GetElement(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_ProductArray_GetElement(obj, index); + return __ret; + } + + public static UIntPtr ppf_ProductArray_GetSize(__IntPtr obj) + { + var __ret = __Internal.ppf_ProductArray_GetSize(obj); + return __ret; + } + + public static bool ppf_ProductArray_HasNextPage(__IntPtr obj) + { + var __ret = __Internal.ppf_ProductArray_HasNextPage(obj); + return __ret; + } + + public static string ppf_ProductArray_GetNextPageParam(__IntPtr obj) + { + var __ret = __Internal.ppf_ProductArray_GetNextPageParam(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_PermissionResult_GetAuthorizedPermissions", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PermissionResult_GetAuthorizedPermissions(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PermissionResult_GetAuthorizedPermissionsSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_PermissionResult_GetAuthorizedPermissionsSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PermissionResult_GetAccessToken", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PermissionResult_GetAccessToken(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PermissionResult_GetUserID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PermissionResult_GetUserID(__IntPtr obj); + } + + public static string ppf_PermissionResult_GetAuthorizedPermissions(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_PermissionResult_GetAuthorizedPermissions(obj, index); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static UIntPtr ppf_PermissionResult_GetAuthorizedPermissionsSize(__IntPtr obj) + { + var __ret = __Internal.ppf_PermissionResult_GetAuthorizedPermissionsSize(obj); + return __ret; + } + + public static string ppf_PermissionResult_GetAccessToken(__IntPtr obj) + { + var __ret = __Internal.ppf_PermissionResult_GetAccessToken(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_PermissionResult_GetUserID(__IntPtr obj) + { + var __ret = __Internal.ppf_PermissionResult_GetUserID(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_SubscriptionStatus_GetSKU", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SubscriptionStatus_GetSKU(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SubscriptionStatus_GetOuterId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SubscriptionStatus_GetOuterId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SubscriptionStatus_GetStartTime", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_SubscriptionStatus_GetStartTime(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SubscriptionStatus_GetEndTime", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_SubscriptionStatus_GetEndTime(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SubscriptionStatus_GetPeriodType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.PeriodType ppf_SubscriptionStatus_GetPeriodType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SubscriptionStatus_GetEntitlementStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.EntitlementStatus ppf_SubscriptionStatus_GetEntitlementStatus(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SubscriptionStatus_GetCancelReason", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.CancelReason ppf_SubscriptionStatus_GetCancelReason(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SubscriptionStatus_GetIsFreeTrial", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_SubscriptionStatus_GetIsFreeTrial(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SubscriptionStatus_GetNextPeriod", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_SubscriptionStatus_GetNextPeriod(__IntPtr obj); + } + + public static string ppf_SubscriptionStatus_GetSKU(__IntPtr obj) + { + var __ret = __Internal.ppf_SubscriptionStatus_GetSKU(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_SubscriptionStatus_GetOuterId(__IntPtr obj) + { + var __ret = __Internal.ppf_SubscriptionStatus_GetOuterId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static long ppf_SubscriptionStatus_GetStartTime(__IntPtr obj) + { + var __ret = __Internal.ppf_SubscriptionStatus_GetStartTime(obj); + return __ret; + } + + public static long ppf_SubscriptionStatus_GetEndTime(__IntPtr obj) + { + var __ret = __Internal.ppf_SubscriptionStatus_GetEndTime(obj); + return __ret; + } + + public static global::Pico.Platform.PeriodType ppf_SubscriptionStatus_GetPeriodType(__IntPtr obj) + { + var __ret = __Internal.ppf_SubscriptionStatus_GetPeriodType(obj); + return __ret; + } + + public static global::Pico.Platform.EntitlementStatus ppf_SubscriptionStatus_GetEntitlementStatus(__IntPtr obj) + { + var __ret = __Internal.ppf_SubscriptionStatus_GetEntitlementStatus(obj); + return __ret; + } + + public static global::Pico.Platform.CancelReason ppf_SubscriptionStatus_GetCancelReason(__IntPtr obj) + { + var __ret = __Internal.ppf_SubscriptionStatus_GetCancelReason(obj); + return __ret; + } + + public static bool ppf_SubscriptionStatus_GetIsFreeTrial(__IntPtr obj) + { + var __ret = __Internal.ppf_SubscriptionStatus_GetIsFreeTrial(obj); + return __ret; + } + + public static int ppf_SubscriptionStatus_GetNextPeriod(__IntPtr obj) + { + var __ret = __Internal.ppf_SubscriptionStatus_GetNextPeriod(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserRelationResult_GetRelationsKey", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_UserRelationResult_GetRelationsKey(__IntPtr obj, int index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserRelationResult_GetRelationsValue", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.UserRelationType ppf_UserRelationResult_GetRelationsValue(__IntPtr obj, int index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_UserRelationResult_GetRelationsSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_UserRelationResult_GetRelationsSize(__IntPtr obj); + } + + public static string ppf_UserRelationResult_GetRelationsKey(__IntPtr obj, int index) + { + var __ret = __Internal.ppf_UserRelationResult_GetRelationsKey(obj, index); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.UserRelationType ppf_UserRelationResult_GetRelationsValue(__IntPtr obj, int index) + { + var __ret = __Internal.ppf_UserRelationResult_GetRelationsValue(obj, index); + return __ret; + } + + public static int ppf_UserRelationResult_GetRelationsSize(__IntPtr obj) + { + var __ret = __Internal.ppf_UserRelationResult_GetRelationsSize(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_SpeechError_GetMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SpeechError_GetMessage(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SpeechError_GetSessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SpeechError_GetSessionId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SpeechError_GetCode", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_SpeechError_GetCode(__IntPtr obj); + } + + public static string ppf_SpeechError_GetMessage(__IntPtr obj) + { + var __ret = __Internal.ppf_SpeechError_GetMessage(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_SpeechError_GetSessionId(__IntPtr obj) + { + var __ret = __Internal.ppf_SpeechError_GetSessionId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static int ppf_SpeechError_GetCode(__IntPtr obj) + { + var __ret = __Internal.ppf_SpeechError_GetCode(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_OrgScopedID_GetID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_OrgScopedID_GetID(__IntPtr obj); + } + + public static string ppf_OrgScopedID_GetID(__IntPtr obj) + { + var __ret = __Internal.ppf_OrgScopedID_GetID(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RecordInfo_GetVideoPath", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RecordInfo_GetVideoPath(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RecordInfo_GetJobId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RecordInfo_GetJobId(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RecordInfo_GetDurationInMilliSeconds", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RecordInfo_GetDurationInMilliSeconds(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RecordInfo_GetWidth", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RecordInfo_GetWidth(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RecordInfo_GetHeight", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_RecordInfo_GetHeight(__IntPtr obj); + } + + public static string ppf_RecordInfo_GetVideoPath(__IntPtr obj) + { + var __ret = __Internal.ppf_RecordInfo_GetVideoPath(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static string ppf_RecordInfo_GetJobId(__IntPtr obj) + { + var __ret = __Internal.ppf_RecordInfo_GetJobId(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static int ppf_RecordInfo_GetDurationInMilliSeconds(__IntPtr obj) + { + var __ret = __Internal.ppf_RecordInfo_GetDurationInMilliSeconds(obj); + return __ret; + } + + public static int ppf_RecordInfo_GetWidth(__IntPtr obj) + { + var __ret = __Internal.ppf_RecordInfo_GetWidth(obj); + return __ret; + } + + public static int ppf_RecordInfo_GetHeight(__IntPtr obj) + { + var __ret = __Internal.ppf_RecordInfo_GetHeight(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_SessionMedia_GetImages", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SessionMedia_GetImages(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SessionMedia_GetImagesSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_SessionMedia_GetImagesSize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SessionMedia_GetVideos", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_SessionMedia_GetVideos(__IntPtr obj, UIntPtr index); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_SessionMedia_GetVideosSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern UIntPtr ppf_SessionMedia_GetVideosSize(__IntPtr obj); + } + + public static __IntPtr ppf_SessionMedia_GetImages(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_SessionMedia_GetImages(obj, index); + return __ret; + } + + public static UIntPtr ppf_SessionMedia_GetImagesSize(__IntPtr obj) + { + var __ret = __Internal.ppf_SessionMedia_GetImagesSize(obj); + return __ret; + } + + public static __IntPtr ppf_SessionMedia_GetVideos(__IntPtr obj, UIntPtr index) + { + var __ret = __Internal.ppf_SessionMedia_GetVideos(obj, index); + return __ret; + } + + public static UIntPtr ppf_SessionMedia_GetVideosSize(__IntPtr obj) + { + var __ret = __Internal.ppf_SessionMedia_GetVideosSize(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetUser", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetUser(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetString(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetInt32", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_Message_GetInt32(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.MessageType ppf_Message_GetType(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetError", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetError(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_IsError", CallingConvention = __CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.I1)] + internal static extern bool ppf_Message_IsError(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRequestID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Message_GetRequestID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetUserArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetUserArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetLaunchFriendRequestFlowResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetLaunchFriendRequestFlowResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetUserAndRoomArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetUserAndRoomArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetPermissionResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetPermissionResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetApplicationVersion", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetApplicationVersion(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetUserRelationResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetUserRelationResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetSubscriptionStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetSubscriptionStatus(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetEntitlementCheckResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetEntitlementCheckResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcJoinRoomResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcJoinRoomResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcLeaveRoomResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcLeaveRoomResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcRoomStats", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcRoomStats(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcUserJoinInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcUserJoinInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcUserLeaveInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcUserLeaveInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcRoomWarn", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcRoomWarn(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcRoomError", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcRoomError(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcMuteInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcMuteInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcAudioPlaybackDevice", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcAudioPlaybackDevice ppf_Message_GetRtcAudioPlaybackDevice(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcMediaDeviceChangeInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcMediaDeviceChangeInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcLocalAudioPropertiesReport", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcLocalAudioPropertiesReport(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcRemoteAudioPropertiesReport", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcRemoteAudioPropertiesReport(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcRoomMessageReceived", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcRoomMessageReceived(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcUserMessageReceived", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcUserMessageReceived(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcBinaryMessageReceived", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcBinaryMessageReceived(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcStreamSyncInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcStreamSyncInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcFirstLocalVideoFrameCapturedInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcFirstLocalVideoFrameCapturedInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcLocalVideoSizeChangeInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcLocalVideoSizeChangeInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcMessageSendResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcMessageSendResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcUserPublishInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcUserPublishInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRtcUserUnPublishInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRtcUserUnPublishInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetMatchmakingAdminSnapshot", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetMatchmakingAdminSnapshot(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetMatchmakingBrowseResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetMatchmakingBrowseResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetMatchmakingBrowseCustomPageResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetMatchmakingBrowseCustomPageResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetMatchmakingEnqueueResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetMatchmakingEnqueueResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetMatchmakingEnqueueResultAndRoom", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetMatchmakingEnqueueResultAndRoom(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetMatchmakingStats", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetMatchmakingStats(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRoom", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRoom(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRoomArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRoomArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetPlatformGameInitialize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetPlatformGameInitialize(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetGameConnectionEvent", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.GameConnectionEvent ppf_Message_GetGameConnectionEvent(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetGameRequestFailedReason", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.GameRequestFailedReason ppf_Message_GetGameRequestFailedReason(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetApplicationInviteArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetApplicationInviteArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetSendInvitesResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetSendInvitesResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetDestinationArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetDestinationArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetPresenceJoinIntent", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetPresenceJoinIntent(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRoomInviteNotificationArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRoomInviteNotificationArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetLeaderboardArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetLeaderboardArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetLeaderboardUpdateStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetLeaderboardUpdateStatus(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetLeaderboardEntryArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetLeaderboardEntryArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAchievementDefinitionArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAchievementDefinitionArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAchievementProgressArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAchievementProgressArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAchievementUpdate", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAchievementUpdate(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetChallenge", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetChallenge(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetChallengeArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetChallengeArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetChallengeEntryArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetChallengeEntryArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetPurchaseArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetPurchaseArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetProductArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetProductArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetPurchase", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetPurchase(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetSportUserInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetSportUserInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetSportDailySummaryArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetSportDailySummaryArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetSportSummary", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetSportSummary(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAssetDetails", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAssetDetails(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAssetDetailsArray", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAssetDetailsArray(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAssetFileDeleteResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAssetFileDeleteResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAssetFileDownloadCancelResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAssetFileDownloadCancelResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAssetFileDownloadResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAssetFileDownloadResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAssetFileDownloadUpdate", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAssetFileDownloadUpdate(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAssetStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAssetStatus(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAssetFileDeleteForSafety", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAssetFileDeleteForSafety(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetAsrResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetAsrResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetSpeechError", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetSpeechError(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetDetectSensitiveResult", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetDetectSensitiveResult(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetOrgScopedID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetOrgScopedID(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetCaptureInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetCaptureInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetRecordInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetRecordInfo(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Message_GetSessionMedia", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_Message_GetSessionMedia(__IntPtr obj); + } + + public static __IntPtr ppf_Message_GetUser(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetUser(obj); + return __ret; + } + + public static string ppf_Message_GetString(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetString(obj); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static int ppf_Message_GetInt32(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetInt32(obj); + return __ret; + } + + public static global::Pico.Platform.MessageType ppf_Message_GetType(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetType(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetError(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetError(obj); + return __ret; + } + + public static bool ppf_Message_IsError(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_IsError(obj); + return __ret; + } + + public static ulong ppf_Message_GetRequestID(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRequestID(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetUserArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetUserArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetLaunchFriendRequestFlowResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetLaunchFriendRequestFlowResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetUserAndRoomArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetUserAndRoomArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetPermissionResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetPermissionResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetApplicationVersion(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetApplicationVersion(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetUserRelationResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetUserRelationResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetSubscriptionStatus(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetSubscriptionStatus(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetEntitlementCheckResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetEntitlementCheckResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcJoinRoomResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcJoinRoomResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcLeaveRoomResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcLeaveRoomResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcRoomStats(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcRoomStats(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcUserJoinInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcUserJoinInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcUserLeaveInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcUserLeaveInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcRoomWarn(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcRoomWarn(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcRoomError(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcRoomError(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcMuteInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcMuteInfo(obj); + return __ret; + } + + public static global::Pico.Platform.RtcAudioPlaybackDevice ppf_Message_GetRtcAudioPlaybackDevice(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcAudioPlaybackDevice(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcMediaDeviceChangeInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcMediaDeviceChangeInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcLocalAudioPropertiesReport(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcLocalAudioPropertiesReport(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcRemoteAudioPropertiesReport(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcRemoteAudioPropertiesReport(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcRoomMessageReceived(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcRoomMessageReceived(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcUserMessageReceived(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcUserMessageReceived(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcBinaryMessageReceived(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcBinaryMessageReceived(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcStreamSyncInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcStreamSyncInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcFirstLocalVideoFrameCapturedInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcFirstLocalVideoFrameCapturedInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcLocalVideoSizeChangeInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcLocalVideoSizeChangeInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcMessageSendResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcMessageSendResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcUserPublishInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcUserPublishInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRtcUserUnPublishInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRtcUserUnPublishInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetMatchmakingAdminSnapshot(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetMatchmakingAdminSnapshot(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetMatchmakingBrowseResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetMatchmakingBrowseResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetMatchmakingBrowseCustomPageResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetMatchmakingBrowseCustomPageResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetMatchmakingEnqueueResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetMatchmakingEnqueueResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetMatchmakingEnqueueResultAndRoom(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetMatchmakingEnqueueResultAndRoom(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetMatchmakingStats(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetMatchmakingStats(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRoom(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRoom(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRoomArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRoomArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetPlatformGameInitialize(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetPlatformGameInitialize(obj); + return __ret; + } + + public static global::Pico.Platform.GameConnectionEvent ppf_Message_GetGameConnectionEvent(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetGameConnectionEvent(obj); + return __ret; + } + + public static global::Pico.Platform.GameRequestFailedReason ppf_Message_GetGameRequestFailedReason(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetGameRequestFailedReason(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetApplicationInviteArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetApplicationInviteArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetSendInvitesResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetSendInvitesResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetDestinationArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetDestinationArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetPresenceJoinIntent(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetPresenceJoinIntent(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRoomInviteNotificationArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRoomInviteNotificationArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetLeaderboardArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetLeaderboardArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetLeaderboardUpdateStatus(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetLeaderboardUpdateStatus(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetLeaderboardEntryArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetLeaderboardEntryArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAchievementDefinitionArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAchievementDefinitionArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAchievementProgressArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAchievementProgressArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAchievementUpdate(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAchievementUpdate(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetChallenge(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetChallenge(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetChallengeArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetChallengeArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetChallengeEntryArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetChallengeEntryArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetPurchaseArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetPurchaseArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetProductArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetProductArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetPurchase(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetPurchase(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetSportUserInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetSportUserInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetSportDailySummaryArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetSportDailySummaryArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetSportSummary(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetSportSummary(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAssetDetails(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAssetDetails(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAssetDetailsArray(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAssetDetailsArray(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAssetFileDeleteResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAssetFileDeleteResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAssetFileDownloadCancelResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAssetFileDownloadCancelResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAssetFileDownloadResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAssetFileDownloadResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAssetFileDownloadUpdate(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAssetFileDownloadUpdate(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAssetStatus(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAssetStatus(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAssetFileDeleteForSafety(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAssetFileDeleteForSafety(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetAsrResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetAsrResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetSpeechError(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetSpeechError(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetDetectSensitiveResult(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetDetectSensitiveResult(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetOrgScopedID(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetOrgScopedID(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetCaptureInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetCaptureInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetRecordInfo(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetRecordInfo(obj); + return __ret; + } + + public static __IntPtr ppf_Message_GetSessionMedia(__IntPtr obj) + { + var __ret = __Internal.ppf_Message_GetSessionMedia(obj); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_PcInitWrapper", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.PlatformInitializeResult ppf_PcInitWrapper([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string appId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string configPath, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string logPath); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PcInitAsynchronousWrapper", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_PcInitAsynchronousWrapper([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string appId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string configJson, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string logPath); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PcUnInitialize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_PcUnInitialize(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RegisterFunctions", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RegisterFunctions(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_GetLoaderVersion", CallingConvention = __CallingConvention.Cdecl)] + internal static extern int ppf_GetLoaderVersion(); + } + + public static global::Pico.Platform.PlatformInitializeResult ppf_PcInitWrapper(string appId, string configPath, string logPath) + { + var __ret = __Internal.ppf_PcInitWrapper(appId, configPath, logPath); + return __ret; + } + + public static ulong ppf_PcInitAsynchronousWrapper(string appId, string configJson, string logPath) + { + var __ret = __Internal.ppf_PcInitAsynchronousWrapper(appId, configJson, logPath); + return __ret; + } + + public static int ppf_PcUnInitialize() + { + var __ret = __Internal.ppf_PcUnInitialize(); + return __ret; + } + + public static void ppf_RegisterFunctions() + { + __Internal.ppf_RegisterFunctions(); + } + + public static int ppf_GetLoaderVersion() + { + var __ret = __Internal.ppf_GetLoaderVersion(); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_PresenceOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_PresenceOptions_Destroy(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceOptions_SetDestinationApiName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_PresenceOptions_SetDestinationApiName(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceOptions_SetIsJoinable", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_PresenceOptions_SetIsJoinable(__IntPtr handle, bool value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceOptions_SetLobbySessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_PresenceOptions_SetLobbySessionId(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceOptions_SetMatchSessionId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_PresenceOptions_SetMatchSessionId(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_PresenceOptions_SetExtra", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_PresenceOptions_SetExtra(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + } + + public static __IntPtr ppf_PresenceOptions_Create() + { + var __ret = __Internal.ppf_PresenceOptions_Create(); + return __ret; + } + + public static void ppf_PresenceOptions_Destroy(__IntPtr handle) + { + __Internal.ppf_PresenceOptions_Destroy(handle); + } + + public static void ppf_PresenceOptions_SetDestinationApiName(__IntPtr handle, string value) + { + __Internal.ppf_PresenceOptions_SetDestinationApiName(handle, value); + } + + public static void ppf_PresenceOptions_SetIsJoinable(__IntPtr handle, bool value) + { + __Internal.ppf_PresenceOptions_SetIsJoinable(handle, value); + } + + public static void ppf_PresenceOptions_SetLobbySessionId(__IntPtr handle, string value) + { + __Internal.ppf_PresenceOptions_SetLobbySessionId(handle, value); + } + + public static void ppf_PresenceOptions_SetMatchSessionId(__IntPtr handle, string value) + { + __Internal.ppf_PresenceOptions_SetMatchSessionId(handle, value); + } + + public static void ppf_PresenceOptions_SetExtra(__IntPtr handle, string value) + { + __Internal.ppf_PresenceOptions_SetExtra(handle, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Achievements_AddCount", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Achievements_AddCount([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string name, long count, __IntPtr extra_data, uint extra_data_length); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Achievements_AddFields", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Achievements_AddFields([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string name, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string fields, __IntPtr extra_data, uint extra_data_length); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Achievements_GetAllDefinitions", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Achievements_GetAllDefinitions(int pageIdx, int pageSize); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Achievements_GetAllProgress", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Achievements_GetAllProgress(int pageIdx, int pageSize); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Achievements_GetDefinitionsByName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Achievements_GetDefinitionsByName(__IntPtr[]names, int count); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Achievements_GetProgressByName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Achievements_GetProgressByName(__IntPtr[]names, int count); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Achievements_Unlock", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Achievements_Unlock([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string name, __IntPtr extra_data, uint extra_data_length); + } + + public static ulong ppf_Achievements_AddCount(string name, long count, __IntPtr extra_data, uint extra_data_length) + { + var __ret = __Internal.ppf_Achievements_AddCount(name, count, extra_data, extra_data_length); + return __ret; + } + + public static ulong ppf_Achievements_AddFields(string name, string fields, __IntPtr extra_data, uint extra_data_length) + { + var __ret = __Internal.ppf_Achievements_AddFields(name, fields, extra_data, extra_data_length); + return __ret; + } + + public static ulong ppf_Achievements_GetAllDefinitions(int pageIdx, int pageSize) + { + var __ret = __Internal.ppf_Achievements_GetAllDefinitions(pageIdx, pageSize); + return __ret; + } + + public static ulong ppf_Achievements_GetAllProgress(int pageIdx, int pageSize) + { + var __ret = __Internal.ppf_Achievements_GetAllProgress(pageIdx, pageSize); + return __ret; + } + + public static ulong ppf_Achievements_GetDefinitionsByName(__IntPtr[]names, int count) + { + var __ret = __Internal.ppf_Achievements_GetDefinitionsByName(names, count); + return __ret; + } + + public static ulong ppf_Achievements_GetProgressByName(__IntPtr[]names, int count) + { + var __ret = __Internal.ppf_Achievements_GetProgressByName(names, count); + return __ret; + } + + public static ulong ppf_Achievements_Unlock(string name, __IntPtr extra_data, uint extra_data_length) + { + var __ret = __Internal.ppf_Achievements_Unlock(name, extra_data, extra_data_length); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Application_LaunchOtherApp", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Application_LaunchOtherApp([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string packageName, __IntPtr deeplink_options); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Application_LaunchOtherAppByAppID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Application_LaunchOtherAppByAppID([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string appID, __IntPtr deeplink_options); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Application_LaunchOtherAppByPresence", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Application_LaunchOtherAppByPresence([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string appID, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string packageName, __IntPtr options); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Application_LaunchOtherAppByMessage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Application_LaunchOtherAppByMessage(__IntPtr options); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Application_GetVersion", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Application_GetVersion(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Application_LaunchStore", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Application_LaunchStore(); + } + + public static ulong ppf_Application_LaunchOtherApp(string packageName, __IntPtr deeplink_options) + { + var __ret = __Internal.ppf_Application_LaunchOtherApp(packageName, deeplink_options); + return __ret; + } + + public static ulong ppf_Application_LaunchOtherAppByAppID(string appID, __IntPtr deeplink_options) + { + var __ret = __Internal.ppf_Application_LaunchOtherAppByAppID(appID, deeplink_options); + return __ret; + } + + public static ulong ppf_Application_LaunchOtherAppByPresence(string appID, string packageName, __IntPtr options) + { + var __ret = __Internal.ppf_Application_LaunchOtherAppByPresence(appID, packageName, options); + return __ret; + } + + public static ulong ppf_Application_LaunchOtherAppByMessage(__IntPtr options) + { + var __ret = __Internal.ppf_Application_LaunchOtherAppByMessage(options); + return __ret; + } + + public static ulong ppf_Application_GetVersion() + { + var __ret = __Internal.ppf_Application_GetVersion(); + return __ret; + } + + public static ulong ppf_Application_LaunchStore() + { + var __ret = __Internal.ppf_Application_LaunchStore(); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFile_DeleteById", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFile_DeleteById(ulong assetFileID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFile_DeleteByName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFile_DeleteByName([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string assetFileName); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFile_DownloadById", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFile_DownloadById(ulong assetFileID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFile_DownloadByName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFile_DownloadByName([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string assetFileName); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFile_DownloadCancelById", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFile_DownloadCancelById(ulong assetFileID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFile_DownloadCancelByName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFile_DownloadCancelByName([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string assetFileName); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFile_GetList", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFile_GetList(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFile_GetNextAssetDetailsArrayPage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFile_GetNextAssetDetailsArrayPage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string @params); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFile_StatusById", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFile_StatusById(ulong assetFileID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_AssetFile_StatusByName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_AssetFile_StatusByName([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string assetFileName); + } + + public static ulong ppf_AssetFile_DeleteById(ulong assetFileID) + { + var __ret = __Internal.ppf_AssetFile_DeleteById(assetFileID); + return __ret; + } + + public static ulong ppf_AssetFile_DeleteByName(string assetFileName) + { + var __ret = __Internal.ppf_AssetFile_DeleteByName(assetFileName); + return __ret; + } + + public static ulong ppf_AssetFile_DownloadById(ulong assetFileID) + { + var __ret = __Internal.ppf_AssetFile_DownloadById(assetFileID); + return __ret; + } + + public static ulong ppf_AssetFile_DownloadByName(string assetFileName) + { + var __ret = __Internal.ppf_AssetFile_DownloadByName(assetFileName); + return __ret; + } + + public static ulong ppf_AssetFile_DownloadCancelById(ulong assetFileID) + { + var __ret = __Internal.ppf_AssetFile_DownloadCancelById(assetFileID); + return __ret; + } + + public static ulong ppf_AssetFile_DownloadCancelByName(string assetFileName) + { + var __ret = __Internal.ppf_AssetFile_DownloadCancelByName(assetFileName); + return __ret; + } + + public static ulong ppf_AssetFile_GetList() + { + var __ret = __Internal.ppf_AssetFile_GetList(); + return __ret; + } + + public static ulong ppf_AssetFile_GetNextAssetDetailsArrayPage(string @params) + { + var __ret = __Internal.ppf_AssetFile_GetNextAssetDetailsArrayPage(@params); + return __ret; + } + + public static ulong ppf_AssetFile_StatusById(ulong assetFileID) + { + var __ret = __Internal.ppf_AssetFile_StatusById(assetFileID); + return __ret; + } + + public static ulong ppf_AssetFile_StatusByName(string assetFileName) + { + var __ret = __Internal.ppf_AssetFile_StatusByName(assetFileName); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenges_Invites", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenges_Invites(ulong challengeID, __IntPtr[]userIDs, uint userIDLength); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenges_Get", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenges_Get(ulong challengeID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenges_GetEntries", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenges_GetEntries(ulong challengeID, global::Pico.Platform.LeaderboardFilterType filter, global::Pico.Platform.LeaderboardStartAt startAt, int pageIdx, int pageSize); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenges_GetEntriesAfterRank", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenges_GetEntriesAfterRank(ulong challengeID, ulong afterRank, int pageIdx, int pageSize); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenges_GetEntriesByIds", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenges_GetEntriesByIds(ulong challengeID, global::Pico.Platform.LeaderboardStartAt startAt, __IntPtr[]userIDs, uint userIDLength, int pageIdx, int pageSize); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenges_GetList", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenges_GetList(__IntPtr challengeOptions, int pageIdx, int pageSize); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenges_Join", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenges_Join(ulong challengeID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenges_Leave", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenges_Leave(ulong challengeID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Challenges_LaunchInvitableUserFlow", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Challenges_LaunchInvitableUserFlow(ulong challengeID); + } + + public static ulong ppf_Challenges_Invites(ulong challengeID, __IntPtr[]userIDs, uint userIDLength) + { + var __ret = __Internal.ppf_Challenges_Invites(challengeID, userIDs, userIDLength); + return __ret; + } + + public static ulong ppf_Challenges_Get(ulong challengeID) + { + var __ret = __Internal.ppf_Challenges_Get(challengeID); + return __ret; + } + + public static ulong ppf_Challenges_GetEntries(ulong challengeID, global::Pico.Platform.LeaderboardFilterType filter, global::Pico.Platform.LeaderboardStartAt startAt, int pageIdx, int pageSize) + { + var __ret = __Internal.ppf_Challenges_GetEntries(challengeID, filter, startAt, pageIdx, pageSize); + return __ret; + } + + public static ulong ppf_Challenges_GetEntriesAfterRank(ulong challengeID, ulong afterRank, int pageIdx, int pageSize) + { + var __ret = __Internal.ppf_Challenges_GetEntriesAfterRank(challengeID, afterRank, pageIdx, pageSize); + return __ret; + } + + public static ulong ppf_Challenges_GetEntriesByIds(ulong challengeID, global::Pico.Platform.LeaderboardStartAt startAt, __IntPtr[]userIDs, uint userIDLength, int pageIdx, int pageSize) + { + var __ret = __Internal.ppf_Challenges_GetEntriesByIds(challengeID, startAt, userIDs, userIDLength, pageIdx, pageSize); + return __ret; + } + + public static ulong ppf_Challenges_GetList(__IntPtr challengeOptions, int pageIdx, int pageSize) + { + var __ret = __Internal.ppf_Challenges_GetList(challengeOptions, pageIdx, pageSize); + return __ret; + } + + public static ulong ppf_Challenges_Join(ulong challengeID) + { + var __ret = __Internal.ppf_Challenges_Join(challengeID); + return __ret; + } + + public static ulong ppf_Challenges_Leave(ulong challengeID) + { + var __ret = __Internal.ppf_Challenges_Leave(challengeID); + return __ret; + } + + public static ulong ppf_Challenges_LaunchInvitableUserFlow(ulong challengeID) + { + var __ret = __Internal.ppf_Challenges_LaunchInvitableUserFlow(challengeID); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Compliance_DetectSensitive", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Compliance_DetectSensitive(global::Pico.Platform.DetectSensitiveScene scene, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string content); + } + + public static ulong ppf_Compliance_DetectSensitive(global::Pico.Platform.DetectSensitiveScene scene, string content) + { + var __ret = __Internal.ppf_Compliance_DetectSensitive(scene, content); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Highlight_CaptureScreen", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Highlight_CaptureScreen(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Highlight_ListMedia", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Highlight_ListMedia([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string sessionId); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Highlight_SaveMedia", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Highlight_SaveMedia([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string jobId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string sessionId); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Highlight_ShareMedia", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Highlight_ShareMedia([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string jobId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string sessionId); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Highlight_StartRecord", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Highlight_StartRecord(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Highlight_StartSession", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Highlight_StartSession(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Highlight_StopRecord", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Highlight_StopRecord(); + } + + public static ulong ppf_Highlight_CaptureScreen() + { + var __ret = __Internal.ppf_Highlight_CaptureScreen(); + return __ret; + } + + public static ulong ppf_Highlight_ListMedia(string sessionId) + { + var __ret = __Internal.ppf_Highlight_ListMedia(sessionId); + return __ret; + } + + public static ulong ppf_Highlight_SaveMedia(string jobId, string sessionId) + { + var __ret = __Internal.ppf_Highlight_SaveMedia(jobId, sessionId); + return __ret; + } + + public static ulong ppf_Highlight_ShareMedia(string jobId, string sessionId) + { + var __ret = __Internal.ppf_Highlight_ShareMedia(jobId, sessionId); + return __ret; + } + + public static ulong ppf_Highlight_StartRecord() + { + var __ret = __Internal.ppf_Highlight_StartRecord(); + return __ret; + } + + public static ulong ppf_Highlight_StartSession() + { + var __ret = __Internal.ppf_Highlight_StartSession(); + return __ret; + } + + public static ulong ppf_Highlight_StopRecord() + { + var __ret = __Internal.ppf_Highlight_StopRecord(); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_IAP_ConsumePurchase", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_IAP_ConsumePurchase([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string sku); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_IAP_GetNextProductArrayPage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_IAP_GetNextProductArrayPage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string nextPageParam); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_IAP_GetNextPurchaseArrayPage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_IAP_GetNextPurchaseArrayPage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string nextPageParam); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_IAP_GetProductsBySKU", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_IAP_GetProductsBySKU(__IntPtr[]skus, int size); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_IAP_GetViewerPurchases", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_IAP_GetViewerPurchases(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_IAP_LaunchCheckoutFlow", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_IAP_LaunchCheckoutFlow([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string sku, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string price, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string currency); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_IAP_LaunchCheckoutFlowV2", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_IAP_LaunchCheckoutFlowV2([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string sku, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string price, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string currency, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string outerId); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_IAP_LaunchCheckoutFlowV3", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_IAP_LaunchCheckoutFlowV3([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string sku, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string price, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string currency, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string outerId, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string orderComment); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_IAP_GetSubscriptionStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_IAP_GetSubscriptionStatus([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string sku); + } + + public static ulong ppf_IAP_ConsumePurchase(string sku) + { + var __ret = __Internal.ppf_IAP_ConsumePurchase(sku); + return __ret; + } + + public static ulong ppf_IAP_GetNextProductArrayPage(string nextPageParam) + { + var __ret = __Internal.ppf_IAP_GetNextProductArrayPage(nextPageParam); + return __ret; + } + + public static ulong ppf_IAP_GetNextPurchaseArrayPage(string nextPageParam) + { + var __ret = __Internal.ppf_IAP_GetNextPurchaseArrayPage(nextPageParam); + return __ret; + } + + public static ulong ppf_IAP_GetProductsBySKU(__IntPtr[]skus, int size) + { + var __ret = __Internal.ppf_IAP_GetProductsBySKU(skus, size); + return __ret; + } + + public static ulong ppf_IAP_GetViewerPurchases() + { + var __ret = __Internal.ppf_IAP_GetViewerPurchases(); + return __ret; + } + + public static ulong ppf_IAP_LaunchCheckoutFlow(string sku, string price, string currency) + { + var __ret = __Internal.ppf_IAP_LaunchCheckoutFlow(sku, price, currency); + return __ret; + } + + public static ulong ppf_IAP_LaunchCheckoutFlowV2(string sku, string price, string currency, string outerId) + { + var __ret = __Internal.ppf_IAP_LaunchCheckoutFlowV2(sku, price, currency, outerId); + return __ret; + } + + public static ulong ppf_IAP_LaunchCheckoutFlowV3(string sku, string price, string currency, string outerId, string orderComment) + { + var __ret = __Internal.ppf_IAP_LaunchCheckoutFlowV3(sku, price, currency, outerId, orderComment); + return __ret; + } + + public static ulong ppf_IAP_GetSubscriptionStatus(string sku) + { + var __ret = __Internal.ppf_IAP_GetSubscriptionStatus(sku); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_Get", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Leaderboard_Get([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string leaderboardName); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_GetEntries", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Leaderboard_GetEntries([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string leaderboardName, int pageSize, int pageIdx, global::Pico.Platform.LeaderboardFilterType filter, global::Pico.Platform.LeaderboardStartAt startAt); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_GetEntriesAfterRank", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Leaderboard_GetEntriesAfterRank([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string leaderboardName, int pageSize, int pageIdx, ulong afterRank); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_GetEntriesByIds", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Leaderboard_GetEntriesByIds([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string leaderboardName, int pageSize, int pageIdx, global::Pico.Platform.LeaderboardStartAt startAt, __IntPtr[]userIDs, uint userIDLength); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_GetNextEntries", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Leaderboard_GetNextEntries(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_GetNextLeaderboardArrayPage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Leaderboard_GetNextLeaderboardArrayPage(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_GetPreviousEntries", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Leaderboard_GetPreviousEntries(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_WriteEntry", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Leaderboard_WriteEntry([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string leaderboardName, long score, __IntPtr extraData, uint extraDataLength, bool forceUpdate); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Leaderboard_WriteEntryWithSupplementaryMetric", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Leaderboard_WriteEntryWithSupplementaryMetric([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string leaderboardName, long score, long supplementaryMetric, __IntPtr extraData, uint extraDataLength, bool forceUpdate); + } + + public static ulong ppf_Leaderboard_Get(string leaderboardName) + { + var __ret = __Internal.ppf_Leaderboard_Get(leaderboardName); + return __ret; + } + + public static ulong ppf_Leaderboard_GetEntries(string leaderboardName, int pageSize, int pageIdx, global::Pico.Platform.LeaderboardFilterType filter, global::Pico.Platform.LeaderboardStartAt startAt) + { + var __ret = __Internal.ppf_Leaderboard_GetEntries(leaderboardName, pageSize, pageIdx, filter, startAt); + return __ret; + } + + public static ulong ppf_Leaderboard_GetEntriesAfterRank(string leaderboardName, int pageSize, int pageIdx, ulong afterRank) + { + var __ret = __Internal.ppf_Leaderboard_GetEntriesAfterRank(leaderboardName, pageSize, pageIdx, afterRank); + return __ret; + } + + public static ulong ppf_Leaderboard_GetEntriesByIds(string leaderboardName, int pageSize, int pageIdx, global::Pico.Platform.LeaderboardStartAt startAt, __IntPtr[]userIDs, uint userIDLength) + { + var __ret = __Internal.ppf_Leaderboard_GetEntriesByIds(leaderboardName, pageSize, pageIdx, startAt, userIDs, userIDLength); + return __ret; + } + + public static ulong ppf_Leaderboard_GetNextEntries(__IntPtr handle) + { + var __ret = __Internal.ppf_Leaderboard_GetNextEntries(handle); + return __ret; + } + + public static ulong ppf_Leaderboard_GetNextLeaderboardArrayPage(__IntPtr handle) + { + var __ret = __Internal.ppf_Leaderboard_GetNextLeaderboardArrayPage(handle); + return __ret; + } + + public static ulong ppf_Leaderboard_GetPreviousEntries(__IntPtr handle) + { + var __ret = __Internal.ppf_Leaderboard_GetPreviousEntries(handle); + return __ret; + } + + public static ulong ppf_Leaderboard_WriteEntry(string leaderboardName, long score, __IntPtr extraData, uint extraDataLength, bool forceUpdate) + { + var __ret = __Internal.ppf_Leaderboard_WriteEntry(leaderboardName, score, extraData, extraDataLength, forceUpdate); + return __ret; + } + + public static ulong ppf_Leaderboard_WriteEntryWithSupplementaryMetric(string leaderboardName, long score, long supplementaryMetric, __IntPtr extraData, uint extraDataLength, bool forceUpdate) + { + var __ret = __Internal.ppf_Leaderboard_WriteEntryWithSupplementaryMetric(leaderboardName, score, supplementaryMetric, extraData, extraDataLength, forceUpdate); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Matchmaking_Browse2", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Matchmaking_Browse2([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string pool, __IntPtr matchmakingOptions); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Matchmaking_Browse2CustomPage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Matchmaking_Browse2CustomPage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string pool, __IntPtr matchmakingOptions, int pageIndex, int pageSize); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Matchmaking_Cancel2", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Matchmaking_Cancel2(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Matchmaking_CreateAndEnqueueRoom2", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Matchmaking_CreateAndEnqueueRoom2([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string pool, __IntPtr matchmakingOptions); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Matchmaking_Enqueue2", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Matchmaking_Enqueue2([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string pool, __IntPtr matchmakingOptions); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Matchmaking_GetAdminSnapshot", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Matchmaking_GetAdminSnapshot(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Matchmaking_GetStats", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Matchmaking_GetStats([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string pool, uint maxLevel, global::Pico.Platform.MatchmakingStatApproach approach); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Matchmaking_ReportResultInsecure", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Matchmaking_ReportResultInsecure(ulong roomID, __IntPtr data, uint numItems); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Matchmaking_StartMatch", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Matchmaking_StartMatch(ulong roomID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Matchmaking_CrashTest", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Matchmaking_CrashTest(); + } + + public static ulong ppf_Matchmaking_Browse2(string pool, __IntPtr matchmakingOptions) + { + var __ret = __Internal.ppf_Matchmaking_Browse2(pool, matchmakingOptions); + return __ret; + } + + public static ulong ppf_Matchmaking_Browse2CustomPage(string pool, __IntPtr matchmakingOptions, int pageIndex, int pageSize) + { + var __ret = __Internal.ppf_Matchmaking_Browse2CustomPage(pool, matchmakingOptions, pageIndex, pageSize); + return __ret; + } + + public static ulong ppf_Matchmaking_Cancel2() + { + var __ret = __Internal.ppf_Matchmaking_Cancel2(); + return __ret; + } + + public static ulong ppf_Matchmaking_CreateAndEnqueueRoom2(string pool, __IntPtr matchmakingOptions) + { + var __ret = __Internal.ppf_Matchmaking_CreateAndEnqueueRoom2(pool, matchmakingOptions); + return __ret; + } + + public static ulong ppf_Matchmaking_Enqueue2(string pool, __IntPtr matchmakingOptions) + { + var __ret = __Internal.ppf_Matchmaking_Enqueue2(pool, matchmakingOptions); + return __ret; + } + + public static ulong ppf_Matchmaking_GetAdminSnapshot() + { + var __ret = __Internal.ppf_Matchmaking_GetAdminSnapshot(); + return __ret; + } + + public static ulong ppf_Matchmaking_GetStats(string pool, uint maxLevel, global::Pico.Platform.MatchmakingStatApproach approach) + { + var __ret = __Internal.ppf_Matchmaking_GetStats(pool, maxLevel, approach); + return __ret; + } + + public static ulong ppf_Matchmaking_ReportResultInsecure(ulong roomID, __IntPtr data, uint numItems) + { + var __ret = __Internal.ppf_Matchmaking_ReportResultInsecure(roomID, data, numItems); + return __ret; + } + + public static ulong ppf_Matchmaking_StartMatch(ulong roomID) + { + var __ret = __Internal.ppf_Matchmaking_StartMatch(roomID); + return __ret; + } + + public static ulong ppf_Matchmaking_CrashTest() + { + var __ret = __Internal.ppf_Matchmaking_CrashTest(); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Notification_GetNextRoomInviteNotificationArrayPage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Notification_GetNextRoomInviteNotificationArrayPage(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Notification_GetRoomInvites", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Notification_GetRoomInvites(int pageIdx, int pageSize); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Notification_MarkAsRead", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Notification_MarkAsRead(ulong notificationID); + } + + public static ulong ppf_Notification_GetNextRoomInviteNotificationArrayPage(__IntPtr handle) + { + var __ret = __Internal.ppf_Notification_GetNextRoomInviteNotificationArrayPage(handle); + return __ret; + } + + public static ulong ppf_Notification_GetRoomInvites(int pageIdx, int pageSize) + { + var __ret = __Internal.ppf_Notification_GetRoomInvites(pageIdx, pageSize); + return __ret; + } + + public static ulong ppf_Notification_MarkAsRead(ulong notificationID) + { + var __ret = __Internal.ppf_Notification_MarkAsRead(notificationID); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_ShareMediaOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ShareMediaOptions_Destroy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ShareMediaOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_ShareMediaOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ShareMediaOptions_SetShareMediaType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ShareMediaOptions_SetShareMediaType(__IntPtr obj, global::Pico.Platform.ShareMediaType value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ShareMediaOptions_SetVideoPath", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ShareMediaOptions_SetVideoPath(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ShareMediaOptions_SetVideoThumbPath", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ShareMediaOptions_SetVideoThumbPath(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ShareMediaOptions_AddImagePath", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ShareMediaOptions_AddImagePath(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ShareMediaOptions_ClearImagePaths", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ShareMediaOptions_ClearImagePaths(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_ShareMediaOptions_SetShareAppType", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_ShareMediaOptions_SetShareAppType(__IntPtr obj, global::Pico.Platform.ShareAppType value); + } + + public static void ppf_ShareMediaOptions_Destroy(__IntPtr obj) + { + __Internal.ppf_ShareMediaOptions_Destroy(obj); + } + + public static __IntPtr ppf_ShareMediaOptions_Create() + { + var __ret = __Internal.ppf_ShareMediaOptions_Create(); + return __ret; + } + + public static void ppf_ShareMediaOptions_SetShareMediaType(__IntPtr obj, global::Pico.Platform.ShareMediaType value) + { + __Internal.ppf_ShareMediaOptions_SetShareMediaType(obj, value); + } + + public static void ppf_ShareMediaOptions_SetVideoPath(__IntPtr obj, string value) + { + __Internal.ppf_ShareMediaOptions_SetVideoPath(obj, value); + } + + public static void ppf_ShareMediaOptions_SetVideoThumbPath(__IntPtr obj, string value) + { + __Internal.ppf_ShareMediaOptions_SetVideoThumbPath(obj, value); + } + + public static void ppf_ShareMediaOptions_AddImagePath(__IntPtr obj, string value) + { + __Internal.ppf_ShareMediaOptions_AddImagePath(obj, value); + } + + public static void ppf_ShareMediaOptions_ClearImagePaths(__IntPtr obj) + { + __Internal.ppf_ShareMediaOptions_ClearImagePaths(obj); + } + + public static void ppf_ShareMediaOptions_SetShareAppType(__IntPtr obj, global::Pico.Platform.ShareAppType value) + { + __Internal.ppf_ShareMediaOptions_SetShareAppType(obj, value); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_Clear", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_Clear(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_GetInvitableUsers", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_GetInvitableUsers(__IntPtr options); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_GetNextApplicationInviteArrayPage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_GetNextApplicationInviteArrayPage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string @params); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_GetSentInvites", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_GetSentInvites(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_SendInvites", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_SendInvites(__IntPtr[]userIDs, uint userIDLength); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_SendCustomInvites", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_SendCustomInvites([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string msg, __IntPtr[]userIDs, uint userIDLength); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_Set", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_Set(__IntPtr presenceOptions); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_SetDestination", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_SetDestination([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string api_name); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_SetIsJoinable", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_SetIsJoinable(bool is_joinable); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_SetLobbySession", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_SetLobbySession([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string id); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_SetMatchSession", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_SetMatchSession([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string id); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_SetExtra", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_SetExtra([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string extra); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_GetDestinations", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_GetDestinations(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_GetNextDestinationArrayPage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_GetNextDestinationArrayPage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string @params); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_ShareMedia", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_ShareMedia(__IntPtr shareMediaOptions); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Presence_LaunchInvitePanel", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Presence_LaunchInvitePanel(); + } + + public static ulong ppf_Presence_Clear() + { + var __ret = __Internal.ppf_Presence_Clear(); + return __ret; + } + + public static ulong ppf_Presence_GetInvitableUsers(__IntPtr options) + { + var __ret = __Internal.ppf_Presence_GetInvitableUsers(options); + return __ret; + } + + public static ulong ppf_Presence_GetNextApplicationInviteArrayPage(string @params) + { + var __ret = __Internal.ppf_Presence_GetNextApplicationInviteArrayPage(@params); + return __ret; + } + + public static ulong ppf_Presence_GetSentInvites() + { + var __ret = __Internal.ppf_Presence_GetSentInvites(); + return __ret; + } + + public static ulong ppf_Presence_SendInvites(__IntPtr[]userIDs, uint userIDLength) + { + var __ret = __Internal.ppf_Presence_SendInvites(userIDs, userIDLength); + return __ret; + } + + public static ulong ppf_Presence_SendCustomInvites(string msg, __IntPtr[]userIDs, uint userIDLength) + { + var __ret = __Internal.ppf_Presence_SendCustomInvites(msg, userIDs, userIDLength); + return __ret; + } + + public static ulong ppf_Presence_Set(__IntPtr presenceOptions) + { + var __ret = __Internal.ppf_Presence_Set(presenceOptions); + return __ret; + } + + public static ulong ppf_Presence_SetDestination(string api_name) + { + var __ret = __Internal.ppf_Presence_SetDestination(api_name); + return __ret; + } + + public static ulong ppf_Presence_SetIsJoinable(bool is_joinable) + { + var __ret = __Internal.ppf_Presence_SetIsJoinable(is_joinable); + return __ret; + } + + public static ulong ppf_Presence_SetLobbySession(string id) + { + var __ret = __Internal.ppf_Presence_SetLobbySession(id); + return __ret; + } + + public static ulong ppf_Presence_SetMatchSession(string id) + { + var __ret = __Internal.ppf_Presence_SetMatchSession(id); + return __ret; + } + + public static ulong ppf_Presence_SetExtra(string extra) + { + var __ret = __Internal.ppf_Presence_SetExtra(extra); + return __ret; + } + + public static ulong ppf_Presence_GetDestinations() + { + var __ret = __Internal.ppf_Presence_GetDestinations(); + return __ret; + } + + public static ulong ppf_Presence_GetNextDestinationArrayPage(string @params) + { + var __ret = __Internal.ppf_Presence_GetNextDestinationArrayPage(@params); + return __ret; + } + + public static ulong ppf_Presence_ShareMedia(__IntPtr shareMediaOptions) + { + var __ret = __Internal.ppf_Presence_ShareMedia(shareMediaOptions); + return __ret; + } + + public static ulong ppf_Presence_LaunchInvitePanel() + { + var __ret = __Internal.ppf_Presence_LaunchInvitePanel(); + return __ret; + } + } + + /// Locks/unlocks the membership for a room to allow/disallow new members from being able to join the room. The caller should be the room owner. + public enum RoomMembershipLockStatus + { + /// Unknown. + Unknown = 0, + /// Lock the membership for the room. + Lock = 1, + /// Unlock the membership for the room. + Unlock = 2 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppfRoomMembershipLockStatus_ToString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppfRoomMembershipLockStatus_ToString(global::Pico.Platform.RoomMembershipLockStatus value); + + [DllImport("pxrplatformloader", EntryPoint = "ppfRoomMembershipLockStatus_FromString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RoomMembershipLockStatus ppfRoomMembershipLockStatus_FromString([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string str); + } + + public static string ppfRoomMembershipLockStatus_ToString(global::Pico.Platform.RoomMembershipLockStatus value) + { + var __ret = __Internal.ppfRoomMembershipLockStatus_ToString(value); + return Pico.Platform.MarshalUtil.GetString(global::System.Text.Encoding.UTF8, __ret); + } + + public static global::Pico.Platform.RoomMembershipLockStatus ppfRoomMembershipLockStatus_FromString(string str) + { + var __ret = __Internal.ppfRoomMembershipLockStatus_FromString(str); + return __ret; + } + } + + /// (Not used) + public enum UserOrdering + { + /// / + None = 0, + /// / + PresenceAlphabetical = 1 + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RoomOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_Destroy(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_SetDataStoreString", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_SetDataStoreString(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string key, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_ClearDataStore", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_ClearDataStore(__IntPtr handle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_SetExcludeRecentlyMet", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_SetExcludeRecentlyMet(__IntPtr handle, bool value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_SetMaxUserResults", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_SetMaxUserResults(__IntPtr handle, uint value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_SetOrdering", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_SetOrdering(__IntPtr handle, global::Pico.Platform.UserOrdering value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_SetRecentlyMetTimeWindow", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_SetRecentlyMetTimeWindow(__IntPtr handle, long value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_SetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_SetRoomId(__IntPtr handle, ulong value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_SetTurnOffUpdates", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_SetTurnOffUpdates(__IntPtr handle, bool value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_SetName", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_SetName(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string name); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RoomOptions_SetPassword", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RoomOptions_SetPassword(__IntPtr handle, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string password); + } + + public static __IntPtr ppf_RoomOptions_Create() + { + var __ret = __Internal.ppf_RoomOptions_Create(); + return __ret; + } + + public static void ppf_RoomOptions_Destroy(__IntPtr handle) + { + __Internal.ppf_RoomOptions_Destroy(handle); + } + + public static void ppf_RoomOptions_SetDataStoreString(__IntPtr handle, string key, string value) + { + __Internal.ppf_RoomOptions_SetDataStoreString(handle, key, value); + } + + public static void ppf_RoomOptions_ClearDataStore(__IntPtr handle) + { + __Internal.ppf_RoomOptions_ClearDataStore(handle); + } + + public static void ppf_RoomOptions_SetExcludeRecentlyMet(__IntPtr handle, bool value) + { + __Internal.ppf_RoomOptions_SetExcludeRecentlyMet(handle, value); + } + + public static void ppf_RoomOptions_SetMaxUserResults(__IntPtr handle, uint value) + { + __Internal.ppf_RoomOptions_SetMaxUserResults(handle, value); + } + + public static void ppf_RoomOptions_SetOrdering(__IntPtr handle, global::Pico.Platform.UserOrdering value) + { + __Internal.ppf_RoomOptions_SetOrdering(handle, value); + } + + public static void ppf_RoomOptions_SetRecentlyMetTimeWindow(__IntPtr handle, long value) + { + __Internal.ppf_RoomOptions_SetRecentlyMetTimeWindow(handle, value); + } + + public static void ppf_RoomOptions_SetRoomId(__IntPtr handle, ulong value) + { + __Internal.ppf_RoomOptions_SetRoomId(handle, value); + } + + public static void ppf_RoomOptions_SetTurnOffUpdates(__IntPtr handle, bool value) + { + __Internal.ppf_RoomOptions_SetTurnOffUpdates(handle, value); + } + + public static void ppf_RoomOptions_SetName(__IntPtr handle, string name) + { + __Internal.ppf_RoomOptions_SetName(handle, name); + } + + public static void ppf_RoomOptions_SetPassword(__IntPtr handle, string password) + { + __Internal.ppf_RoomOptions_SetPassword(handle, password); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_CreateAndJoinPrivate2", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_CreateAndJoinPrivate2(global::Pico.Platform.RoomJoinPolicy joinPolicy, uint maxUsers, __IntPtr roomOptions); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_Get", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_Get(ulong roomID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetCurrent", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_GetCurrent(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetCurrentForUser", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_GetCurrentForUser([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetInvitableUsers2", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_GetInvitableUsers2(__IntPtr roomOptions); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetModeratedRooms", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_GetModeratedRooms(int page_idx, int page_size); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_JoinNamed", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_JoinNamed(global::Pico.Platform.RoomJoinPolicy joinPolicy, bool createIfNotExist, uint maxUsers, __IntPtr roomOptions); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_GetNamedRooms", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_GetNamedRooms(int page_idx, int page_size); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_InviteUser", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_InviteUser(ulong roomID, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string inviteToken); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_Join2", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_Join2(ulong roomID, __IntPtr roomOptions); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_KickUser", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_KickUser(ulong roomID, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userID, int kickDurationSeconds); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_LaunchInvitableUserFlow", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_LaunchInvitableUserFlow(ulong roomID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_Leave", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_Leave(ulong roomID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_SetDescription", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_SetDescription(ulong roomID, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string description); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_UpdateDataStore", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_UpdateDataStore(ulong roomID, __IntPtr data, uint numItems); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_UpdateMembershipLockStatus", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_UpdateMembershipLockStatus(ulong roomID, global::Pico.Platform.RoomMembershipLockStatus membershipLockStatus); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_UpdateOwner", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_UpdateOwner(ulong roomID, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Room_UpdatePrivateRoomJoinPolicy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Room_UpdatePrivateRoomJoinPolicy(ulong roomID, global::Pico.Platform.RoomJoinPolicy newJoinPolicy); + } + + public static ulong ppf_Room_CreateAndJoinPrivate2(global::Pico.Platform.RoomJoinPolicy joinPolicy, uint maxUsers, __IntPtr roomOptions) + { + var __ret = __Internal.ppf_Room_CreateAndJoinPrivate2(joinPolicy, maxUsers, roomOptions); + return __ret; + } + + public static ulong ppf_Room_Get(ulong roomID) + { + var __ret = __Internal.ppf_Room_Get(roomID); + return __ret; + } + + public static ulong ppf_Room_GetCurrent() + { + var __ret = __Internal.ppf_Room_GetCurrent(); + return __ret; + } + + public static ulong ppf_Room_GetCurrentForUser(string userID) + { + var __ret = __Internal.ppf_Room_GetCurrentForUser(userID); + return __ret; + } + + public static ulong ppf_Room_GetInvitableUsers2(__IntPtr roomOptions) + { + var __ret = __Internal.ppf_Room_GetInvitableUsers2(roomOptions); + return __ret; + } + + public static ulong ppf_Room_GetModeratedRooms(int page_idx, int page_size) + { + var __ret = __Internal.ppf_Room_GetModeratedRooms(page_idx, page_size); + return __ret; + } + + public static ulong ppf_Room_JoinNamed(global::Pico.Platform.RoomJoinPolicy joinPolicy, bool createIfNotExist, uint maxUsers, __IntPtr roomOptions) + { + var __ret = __Internal.ppf_Room_JoinNamed(joinPolicy, createIfNotExist, maxUsers, roomOptions); + return __ret; + } + + public static ulong ppf_Room_GetNamedRooms(int page_idx, int page_size) + { + var __ret = __Internal.ppf_Room_GetNamedRooms(page_idx, page_size); + return __ret; + } + + public static ulong ppf_Room_InviteUser(ulong roomID, string inviteToken) + { + var __ret = __Internal.ppf_Room_InviteUser(roomID, inviteToken); + return __ret; + } + + public static ulong ppf_Room_Join2(ulong roomID, __IntPtr roomOptions) + { + var __ret = __Internal.ppf_Room_Join2(roomID, roomOptions); + return __ret; + } + + public static ulong ppf_Room_KickUser(ulong roomID, string userID, int kickDurationSeconds) + { + var __ret = __Internal.ppf_Room_KickUser(roomID, userID, kickDurationSeconds); + return __ret; + } + + public static ulong ppf_Room_LaunchInvitableUserFlow(ulong roomID) + { + var __ret = __Internal.ppf_Room_LaunchInvitableUserFlow(roomID); + return __ret; + } + + public static ulong ppf_Room_Leave(ulong roomID) + { + var __ret = __Internal.ppf_Room_Leave(roomID); + return __ret; + } + + public static ulong ppf_Room_SetDescription(ulong roomID, string description) + { + var __ret = __Internal.ppf_Room_SetDescription(roomID, description); + return __ret; + } + + public static ulong ppf_Room_UpdateDataStore(ulong roomID, __IntPtr data, uint numItems) + { + var __ret = __Internal.ppf_Room_UpdateDataStore(roomID, data, numItems); + return __ret; + } + + public static ulong ppf_Room_UpdateMembershipLockStatus(ulong roomID, global::Pico.Platform.RoomMembershipLockStatus membershipLockStatus) + { + var __ret = __Internal.ppf_Room_UpdateMembershipLockStatus(roomID, membershipLockStatus); + return __ret; + } + + public static ulong ppf_Room_UpdateOwner(ulong roomID, string userID) + { + var __ret = __Internal.ppf_Room_UpdateOwner(roomID, userID); + return __ret; + } + + public static ulong ppf_Room_UpdatePrivateRoomJoinPolicy(ulong roomID, global::Pico.Platform.RoomJoinPolicy newJoinPolicy) + { + var __ret = __Internal.ppf_Room_UpdatePrivateRoomJoinPolicy(roomID, newJoinPolicy); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcGetTokenOptions_Destroy", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcGetTokenOptions_Destroy(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcGetTokenOptions_Create", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcGetTokenOptions_Create(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcGetTokenOptions_SetUserId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcGetTokenOptions_SetUserId(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcGetTokenOptions_SetRoomId", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcGetTokenOptions_SetRoomId(__IntPtr obj, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcGetTokenOptions_SetTtl", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcGetTokenOptions_SetTtl(__IntPtr obj, int value); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcGetTokenOptions_ClearPrivileges", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcGetTokenOptions_ClearPrivileges(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcGetTokenOptions_SetPrivileges", CallingConvention = __CallingConvention.Cdecl)] + internal static extern void ppf_RtcGetTokenOptions_SetPrivileges(__IntPtr obj, global::Pico.Platform.RtcPrivilege k, int v); + } + + public static void ppf_RtcGetTokenOptions_Destroy(__IntPtr obj) + { + __Internal.ppf_RtcGetTokenOptions_Destroy(obj); + } + + public static __IntPtr ppf_RtcGetTokenOptions_Create() + { + var __ret = __Internal.ppf_RtcGetTokenOptions_Create(); + return __ret; + } + + public static void ppf_RtcGetTokenOptions_SetUserId(__IntPtr obj, string value) + { + __Internal.ppf_RtcGetTokenOptions_SetUserId(obj, value); + } + + public static void ppf_RtcGetTokenOptions_SetRoomId(__IntPtr obj, string value) + { + __Internal.ppf_RtcGetTokenOptions_SetRoomId(obj, value); + } + + public static void ppf_RtcGetTokenOptions_SetTtl(__IntPtr obj, int value) + { + __Internal.ppf_RtcGetTokenOptions_SetTtl(obj, value); + } + + public static void ppf_RtcGetTokenOptions_ClearPrivileges(__IntPtr obj) + { + __Internal.ppf_RtcGetTokenOptions_ClearPrivileges(obj); + } + + public static void ppf_RtcGetTokenOptions_SetPrivileges(__IntPtr obj, global::Pico.Platform.RtcPrivilege k, int v) + { + __Internal.ppf_RtcGetTokenOptions_SetPrivileges(obj, k, v); + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_GetToken", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Rtc_GetToken(__IntPtr options); + } + + public static ulong ppf_Rtc_GetToken(__IntPtr options) + { + var __ret = __Internal.ppf_Rtc_GetToken(options); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_Sport_GetDailySummary", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Sport_GetDailySummary(long beginTime, long endTime); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Sport_GetSummary", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Sport_GetSummary(long beginTime, long endTime); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Sport_GetUserInfo", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_Sport_GetUserInfo(); + } + + public static ulong ppf_Sport_GetDailySummary(long beginTime, long endTime) + { + var __ret = __Internal.ppf_Sport_GetDailySummary(beginTime, endTime); + return __ret; + } + + public static ulong ppf_Sport_GetSummary(long beginTime, long endTime) + { + var __ret = __Internal.ppf_Sport_GetSummary(beginTime, endTime); + return __ret; + } + + public static ulong ppf_Sport_GetUserInfo() + { + var __ret = __Internal.ppf_Sport_GetUserInfo(); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_Get", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_Get([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetAccessToken", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_GetAccessToken(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetIdToken", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_GetIdToken(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetLoggedInUser", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_GetLoggedInUser(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetLoggedInUserFriends", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_GetLoggedInUserFriends(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetNextUserArrayPage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_GetNextUserArrayPage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string param); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_LaunchFriendRequestFlow", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_LaunchFriendRequestFlow([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userID); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetLoggedInUserFriendsAndRooms", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_GetLoggedInUserFriendsAndRooms(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetNextUserAndRoomArrayPage", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_GetNextUserAndRoomArrayPage([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string param); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetAuthorizedPermissions", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_GetAuthorizedPermissions(); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_RequestUserPermissions", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_RequestUserPermissions(__IntPtr[]permissions, int size); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetRelations", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_GetRelations(__IntPtr[]userIds, int size); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_EntitlementCheck", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_EntitlementCheck(bool killApp); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_User_GetOrgScopedID", CallingConvention = __CallingConvention.Cdecl)] + internal static extern ulong ppf_User_GetOrgScopedID([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Pico.Platform.UTF8Marshaller))] string userID); + } + + public static ulong ppf_User_Get(string userID) + { + var __ret = __Internal.ppf_User_Get(userID); + return __ret; + } + + public static ulong ppf_User_GetAccessToken() + { + var __ret = __Internal.ppf_User_GetAccessToken(); + return __ret; + } + + public static ulong ppf_User_GetIdToken() + { + var __ret = __Internal.ppf_User_GetIdToken(); + return __ret; + } + + public static ulong ppf_User_GetLoggedInUser() + { + var __ret = __Internal.ppf_User_GetLoggedInUser(); + return __ret; + } + + public static ulong ppf_User_GetLoggedInUserFriends() + { + var __ret = __Internal.ppf_User_GetLoggedInUserFriends(); + return __ret; + } + + public static ulong ppf_User_GetNextUserArrayPage(string param) + { + var __ret = __Internal.ppf_User_GetNextUserArrayPage(param); + return __ret; + } + + public static ulong ppf_User_LaunchFriendRequestFlow(string userID) + { + var __ret = __Internal.ppf_User_LaunchFriendRequestFlow(userID); + return __ret; + } + + public static ulong ppf_User_GetLoggedInUserFriendsAndRooms() + { + var __ret = __Internal.ppf_User_GetLoggedInUserFriendsAndRooms(); + return __ret; + } + + public static ulong ppf_User_GetNextUserAndRoomArrayPage(string param) + { + var __ret = __Internal.ppf_User_GetNextUserAndRoomArrayPage(param); + return __ret; + } + + public static ulong ppf_User_GetAuthorizedPermissions() + { + var __ret = __Internal.ppf_User_GetAuthorizedPermissions(); + return __ret; + } + + public static ulong ppf_User_RequestUserPermissions(__IntPtr[]permissions, int size) + { + var __ret = __Internal.ppf_User_RequestUserPermissions(permissions, size); + return __ret; + } + + public static ulong ppf_User_GetRelations(__IntPtr[]userIds, int size) + { + var __ret = __Internal.ppf_User_GetRelations(userIds, size); + return __ret; + } + + public static ulong ppf_User_EntitlementCheck(bool killApp) + { + var __ret = __Internal.ppf_User_EntitlementCheck(killApp); + return __ret; + } + + public static ulong ppf_User_GetOrgScopedID(string userID) + { + var __ret = __Internal.ppf_User_GetOrgScopedID(userID); + return __ret; + } + } + + public partial class CLIB + { + public partial struct __Internal + { + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrame_GetSampleRate", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcAudioSampleRate ppf_RtcAudioFrame_GetSampleRate(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrame_GetChannel", CallingConvention = __CallingConvention.Cdecl)] + internal static extern global::Pico.Platform.RtcAudioChannel ppf_RtcAudioFrame_GetChannel(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrame_GetTimeStampInUs", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_RtcAudioFrame_GetTimeStampInUs(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrame_GetData", CallingConvention = __CallingConvention.Cdecl)] + internal static extern __IntPtr ppf_RtcAudioFrame_GetData(__IntPtr obj); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_RtcAudioFrame_GetDataSize", CallingConvention = __CallingConvention.Cdecl)] + internal static extern long ppf_RtcAudioFrame_GetDataSize(__IntPtr obj); + } + + public static global::Pico.Platform.RtcAudioSampleRate ppf_RtcAudioFrame_GetSampleRate(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcAudioFrame_GetSampleRate(obj); + return __ret; + } + + public static global::Pico.Platform.RtcAudioChannel ppf_RtcAudioFrame_GetChannel(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcAudioFrame_GetChannel(obj); + return __ret; + } + + public static long ppf_RtcAudioFrame_GetTimeStampInUs(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcAudioFrame_GetTimeStampInUs(obj); + return __ret; + } + + public static __IntPtr ppf_RtcAudioFrame_GetData(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcAudioFrame_GetData(obj); + return __ret; + } + + public static long ppf_RtcAudioFrame_GetDataSize(__IntPtr obj) + { + var __ret = __Internal.ppf_RtcAudioFrame_GetDataSize(obj); + return __ret; + } + } + + /// The type of an add-on. + public enum AddonsType + { + /// Invalid. + Invalid = -1, + /// A durable. The add-on is always available once a user buys it. + Durable = 0, + /// A consumable. The add-on can be consumed by a user and the user can purchase it again after the current add-on is consumed. + Consumable = 1, + /// Subscription add-on. Users need to regularly pay subscription fees. + Subscription = 2 + } + + /// The user's presence status. + public enum UserPresenceStatus + { + /// Unknown status. + Unknown = 0, + /// The user is online. + OnLine = 1, + /// The user is offline. + OffLine = 2 + } + + /// User's gender. + public enum Gender + { + /// Unknown. + Unknown = 0, + /// Male. + Male = 1, + /// Female. + Female = 2 + } + + public enum AsrEngineInitResult + { + Unknown = -999, + Arch32BitNotSupported = -3, + InvalidConfig = -2, + AlreadyInitialized = -1, + Success = 0 + } + + /// The download progress of the DLC file. + public enum AssetFileDownloadCompleteStatus + { + /// The DLC file is being downloaded. + Downloading = 0, + /// The DLC file has been downloaded. + Succeed = 1, + /// Failed to download the DLC file. + Failed = 2 + } + + /// The reason why the subscription is canceled. \ref Pico.Platform.IAPService.GetSubscriptionStatus will return a subscription status structure. The `CancelReason` field describes why the subscription is canceled. + public enum CancelReason + { + /// None. + None = 0, + /// The user canceled automatic renewal. + UserCancelsExpiration = 1, + /// Deduction for automatic renewal failed. + DeductionFailedExpired = 2, + /// The user have not purchased the app. + NoMainApplicationInterest = 3 + } + + /// The strategy proposed to handle the text containing sensitive words and the user that creates the text. It's the result of \ref Pico.Platform.ComplianceService.DetectSensitive. + public enum SensitiveProposal + { + /// Let the text be sent normally as the text does not contain sensitive words. + Pass = 0, + /// Only the user that creates the text can see it. + OnlySelfVisible = 1, + /// Forbid the user from publishing any text for several days. + UserMute = 2, + /// Prevent the user from submitting the text. + RejectSubmit = 3 + } + + /// Indicates the location within the app where text containing sensitive words can be found. Used for \ref Pico.Platform.ComplianceService.DetectSensitive. + public enum DetectSensitiveScene + { + /// Username. + UserName = 1, + /// Room name. + RoomName = 2, + /// In-room-chat message. + RoomChat = 3 + } + + /// The type of the discount + public enum DiscountType + { + /// Invalid. + Invalid = -1, + /// No discount. + Null = 0, + /// Free trial. + FreeTrial = 1, + /// Discount. + Discount = 2 + } + + /// The entitlement status of a subscription add-on. Used by \ref Pico.Platform.IAPService.GetSubscriptionStatus. + public enum EntitlementStatus + { + /// None. + None = 0, + /// The user is entitled to use the subscription add-on. + Valid = 1, + /// The user is not entitled to use the subscription add-on. + Invalid = 2, + /// The subscription is in the grace period. + GracePeriod = 3, + /// The subscription is paused. + Pause = 4, + /// The subscription has expired. + Expired = 5, + /// The user has canceled the subscription. But the current subscription period is still valid. + Cancel = 6 + } + + /// Indicates how an app is launched. You can use it to determine how to parse \ref Pico.Platform.Models.LaunchDetails. See also: \ref Pico.Platform.ApplicationService.GetLaunchDetails. + public enum LaunchType + { + /// Unknown. + Unknown = 0, + /// The user clicks on the app's icon to launch it. + Normal = 1, + /// The user clicks on the room invitation message card to launch the app. + RoomInvite = 2, + /// The user clicks on the presence invitation message card to launch the app. + Deeplink = 4, + /// The user clicks on the challenge invitation message card to launch the app. + ChallengeInvite = 5 + } + + /// The app's 'launch result. + public enum LaunchResult + { + /// Unknown. + Unknown = 0, + /// The app is successfully launched. + Success = 1, + /// Fail to launch the app because the room is full. + FailedRoomFull = 2, + /// Fail to launch the app because the game already starts. + FailedGameAlreadyStarted = 3, + /// Fail to launch the app because the room is not found. + FailedRoomNotFound = 4, + /// Fail to launch the app because the user declines the request. + FailedUserDeclined = 5, + /// Fail to launch the app because of other reasons. + FailedOtherReason = 6 + } + + /// The state of the user's local audio. + public enum RtcMuteState + { + /// Muted. + Off = 0, + /// On. + On = 1 + } + + /// The type of media to pause or resume. + public enum RtcPauseResumeMediaType + { + /// Audio. + Audio = 0, + /// Video. + Video = 1, + /// Audio and video. + AudioAndVideo = 2 + } + + /// The type of media stream. + public enum RtcMediaStreamType + { + /// Audio stream. + Audio = 1, + /// Video stream. + Video = 2, + /// Audio and video stream. + Both = 3 + } + + /// RTC engine initialization result. + public enum RtcEngineInitResult + { + /// Unknown + Unknown = -999, + /// Already initialized. + AlreadyInitialized = -1, + /// Initialization failed due to invalid configuration. + InvalidConfig = -2, + /// Initialization failed because the platform SDK has not been initialized. + SdkNotInitialized = -3, + /// Successfully initialized. + Success = 0 + } + + /// The status of in-ear monitoring mode. + public enum RtcEarMonitorMode + { + /// Off. + Off = 0, + /// On. + On = 1 + } + + /// Stream type. + public enum RtcStreamIndex + { + /// Main stream, which means the video and audio screen captured by the camera and microphone respectively. + Main = 0, + /// Screen stream, which means the video stream from the screen and the audio stream from the sound card. + Screen = 1 + } + + /// The type of stream sync info. The stream sync info will be uploaded to the server with the audio data. + public enum RtcSyncInfoStreamType + { + /// Audio stream info. + Audio = 0 + } + + /// The type of screen stream to capture. + public enum RtcScreenMediaType + { + /// Only capture video streams. + VideoOnly = 0, + /// Only capture audio streams. + AudioOnly = 1, + /// Capture both video and audio streams. + VideoAndAudio = 2 + } + + /// Types of audio scenario. See [here](https://developer-global.pico-interactive.com/document/unity/rtc/#Audio%20management) for more information. + public enum RtcAudioScenarioType + { + /// Music scenario. + Music = 0, + /// High-quality calling scenario. + HighQualityCommunication = 1, + /// Pure call-volume scenario. + Communication = 2, + /// Pure media-volume scenario. + Media = 3, + /// Game streaming scenario. + GameStreaming = 4 + } + + /// The audio playback device. + public enum RtcAudioPlaybackDevice + { + /// Headset. + Headset = 1, + /// Earpiece. + EarPiece = 2, + /// Phone's speaker. + SpeakerPhone = 3, + /// Bluetooth headset. + HeadsetBlueTooth = 4, + /// USB headset. + HeadsetUsb = 5 + } + + /// The type of the room. + public enum RtcRoomProfileType + { + /// Communication room. + Communication = 0, + /// Live broadcasting room. + LiveBroadcasting = 1, + /// Gaming room. + Game = 2, + /// Cloud gaming room. + CloudGame = 3, + /// Low-latency room. + LowLatency = 4 + } + + /// Types of audio source. + public enum RtcAudioSourceType + { + /// Custom audio source (not available yet). + External = 0, + /// The SDK's internal audio source.' + Internal = 1 + } + + /// Audio sample rate. + public enum RtcAudioSampleRate + { + /// Auto. + Auto = -1, + /// 8000 Hz. + F8000 = 8000, + /// 16000 Hz. + F16000 = 16000, + /// 32000 Hz. + F32000 = 32000, + /// 44100 Hz. + F44100 = 44100, + /// 48000 Hz. + F48000 = 48000 + } + + /// The type of the audio channel. + public enum RtcAudioChannel + { + /// Auto (default). + Auto = -1, + /// Mono channel. + Mono = 1, + /// Stereo channel. + Stereo = 2 + } + + /// The color space of video frame. + public enum RtcColorSpace + { + /// Unknown. + Unknown = 0, + /// BT.601 digital encoding standard with a color space of [16-235]. + YCbCrBT601LimitedRange = 1, + /// BT.601 digital encoding standard with a color space of [0-255]. + YCbCrBT601FullRange = 2, + /// BT.7091 digital encoding standard with a color space of [16-235]. + YCbCrBT709LimitedRange = 3, + /// BT.7091 digital encoding standard with a color space of [0-255]. + YCbCrBT709FullRange = 4 + } + + /// (beta feature, don't use it) + public enum MatchmakingStatApproach + { + /// / + Unknown = 0, + /// / + Trailing = 1, + /// / + Swingy = 2 + } + + public enum MessageType + { + Unknown = -1, + PlatformInitializeAndroidAsynchronous = 1, + User_GetLoggedInUser = 10000, + User_GetAccessToken = 10001, + User_Get = 10002, + User_LaunchFriendRequestFlow = 10003, + User_GetLoggedInUserFriends = 10004, + User_GetNextUserArrayPage = 10005, + User_GetLoggedInUserFriendsAndRooms = 10006, + User_GetAuthorizedPermissions = 10007, + User_RequestUserPermissions = 10008, + User_GetRelations = 10009, + User_GetIdToken = 10010, + User_EntitlementCheck = 10011, + User_GetOrgScopedID = 10012, + Notification_Rtc_OnRoomStats = 10200, + Notification_Rtc_OnJoinRoom = 10201, + Notification_Rtc_OnLeaveRoom = 10202, + Notification_Rtc_OnUserLeaveRoom = 10203, + Notification_Rtc_OnUserJoinRoom = 10204, + Notification_Rtc_OnConnectionStateChange = 10205, + Notification_Rtc_OnWarn = 10206, + Notification_Rtc_OnRoomWarn = 10207, + Notification_Rtc_OnRoomError = 10208, + Notification_Rtc_OnError = 10209, + Notification_Rtc_OnUserStartAudioCapture = 10210, + Notification_Rtc_OnAudioPlaybackDeviceChanged = 10211, + Notification_Rtc_OnRemoteAudioPropertiesReport = 10212, + Notification_Rtc_OnLocalAudioPropertiesReport = 10213, + Notification_Rtc_OnUserStopAudioCapture = 10214, + Notification_Rtc_OnUserMuteAudio = 10215, + Notification_Rtc_OnMediaDeviceStateChanged = 10216, + Notification_Rtc_OnRoomMessageReceived = 10217, + Notification_Rtc_OnUserMessageReceived = 10218, + Notification_Rtc_OnTokenWillExpire = 10219, + Notification_Rtc_OnStreamSyncInfoReceived = 10220, + Notification_Rtc_OnVideoDeviceStateChanged = 10221, + Notification_Rtc_OnFirstLocalVideoFrameCaptured = 10222, + Notification_Rtc_OnRoomBinaryMessageReceived = 10223, + Notification_Rtc_OnLocalVideoSizeChanged = 10224, + Notification_Rtc_OnScreenVideoFrameSendStateChanged = 10225, + Notification_Rtc_OnUserBinaryMessageReceived = 10226, + Notification_Rtc_OnLocalVideoStateChanged = 10227, + Notification_Rtc_OnUserMessageSendResult = 10228, + Notification_Rtc_OnUserUnPublishScreen = 10229, + Notification_Rtc_OnRoomMessageSendResult = 10230, + Notification_Rtc_OnUserPublishStream = 10231, + Notification_Rtc_OnUserUnPublishStream = 10232, + Notification_Rtc_OnUserPublishScreen = 10233, + Rtc_GetToken = 10300, + Matchmaking_Browse2 = 10400, + Matchmaking_Browse2CustomPage = 10401, + Matchmaking_Cancel2 = 10402, + Matchmaking_CreateAndEnqueueRoom2 = 10404, + Matchmaking_Enqueue2 = 10408, + Matchmaking_EnqueueRoom2 = 10410, + Matchmaking_GetAdminSnapshot = 10411, + Matchmaking_GetStats = 10412, + Matchmaking_ReportResultInsecure = 10414, + Matchmaking_StartMatch = 10415, + Room_CreateAndJoinPrivate = 10500, + Room_CreateAndJoinPrivate2 = 10501, + Room_Get = 10502, + Room_GetCurrent = 10503, + Room_GetCurrentForUser = 10504, + Room_GetInvitableUsers = 10505, + Room_GetInvitableUsers2 = 10506, + Room_GetModeratedRooms = 10507, + Room_GetNextRoomArrayPage = 10508, + Room_InviteUser = 10509, + Room_Join = 10510, + Room_Join2 = 10511, + Room_KickUser = 10512, + Room_LaunchInvitableUserFlow = 10513, + Room_Leave = 10514, + Room_SetDescription = 10515, + Room_UpdateDataStore = 10516, + Room_UpdateMembershipLockStatus = 10517, + Room_UpdateOwner = 10518, + Room_UpdatePrivateRoomJoinPolicy = 10519, + Room_JoinNamed = 10520, + Room_GetNamedRooms = 10521, + Notification_Matchmaking_MatchFound = 10600, + Notification_Room_InviteAccepted = 10601, + Notification_Room_RoomUpdate = 10603, + Notification_Game_ConnectionEvent = 10604, + Notification_Game_RequestFailed = 10605, + Notification_Game_StateReset = 10606, + Notification_GetNextRoomInviteNotificationArrayPage = 10607, + Notification_GetRoomInvites = 10608, + Notification_MarkAsRead = 10609, + Notification_Challenge_LaunchByInvite = 10610, + PlatformGameInitializeAsynchronous = 10700, + Leaderboard_Get = 10800, + Leaderboard_GetNextLeaderboardArrayPage = 10801, + Leaderboard_GetEntries = 10802, + Leaderboard_GetEntriesAfterRank = 10803, + Leaderboard_GetEntriesByIds = 10804, + Leaderboard_GetNextEntries = 10805, + Leaderboard_GetPreviousEntries = 10806, + Leaderboard_WriteEntry = 10807, + Leaderboard_WriteEntryWithSupplementaryMetric = 10808, + Achievements_AddCount = 10820, + Achievements_AddFields = 10821, + Achievements_GetAllDefinitions = 10822, + Achievements_GetAllProgress = 10823, + Achievements_GetDefinitionsByName = 10824, + Achievements_GetNextAchievementDefinitionArrayPage = 10825, + Achievements_GetNextAchievementProgressArrayPage = 10826, + Achievements_GetProgressByName = 10827, + Achievements_Unlock = 10828, + Challenges_Invite = 10850, + Challenges_Get = 10851, + Challenges_GetList = 10852, + Challenges_GetEntries = 10853, + Challenges_GetEntriesAfterRank = 10854, + Challenges_GetEntriesByIds = 10855, + Challenges_Join = 10856, + Challenges_Leave = 10857, + Challenges_LaunchInvitableUserFlow = 10858, + Application_LaunchOtherApp = 11001, + Presence_GetSentInvites = 11002, + Presence_GetInvitableUsers = 11003, + Presence_SendInvites = 11004, + Presence_GetDestinations = 11005, + Presence_Clear = 11006, + Presence_Set = 11007, + Notification_ApplicationLifecycle_LaunchIntentChanged = 11008, + Notification_Presence_JoinIntentReceived = 11009, + Application_LaunchOtherAppByPresence = 11011, + Application_LaunchOtherAppByMessage = 11013, + Presence_ShareMedia = 11014, + Presence_LaunchInvitePanel = 11015, + Presence_SendCustomInvites = 11016, + Application_LaunchStore = 11017, + Application_GetVersion = 11018, + IAP_GetProductsBySKU = 12001, + IAP_GetViewerPurchases = 12002, + IAP_LaunchCheckoutFlow = 12003, + IAP_ConsumePurchase = 12004, + IAP_GetSubscriptionStatus = 12005, + Sport_GetUserInfo = 12500, + Sport_GetDailySummary = 12501, + Sport_GetSummary = 12502, + AssetFile_DeleteById = 13001, + AssetFile_DeleteByName = 13002, + AssetFile_DownloadById = 13003, + AssetFile_DownloadByName = 13004, + AssetFile_DownloadCancelById = 13005, + AssetFile_DownloadCancelByName = 13006, + AssetFile_GetList = 13007, + AssetFile_StatusById = 13008, + AssetFile_StatusByName = 13009, + AssetFile_GetNextAssetDetailsArrayPage = 13010, + Notification_AssetFile_DownloadUpdate = 13101, + Notification_AssetFile_DeleteForSafety = 13102, + Notification_Speech_OnAsrResult = 14001, + Notification_Speech_OnSpeechError = 14002, + Compliance_DetectSensitive = 15015, + Highlight_StartSession = 15110, + Highlight_CaptureScreen = 15111, + Highlight_StartRecord = 15112, + Highlight_StopRecord = 15113, + Highlight_ListMedia = 15114, + Highlight_SaveMedia = 15115, + Highlight_ShareMedia = 15116, + Notification_Highlight_OnRecordStop = 15150, + CloudStorage_StartNewBackup = 16001, + } + + /// Whether it is the first time that the user has joined the room or if the user is reconnected to the room. + public enum RtcJoinRoomType + { + /// It is the first time that the user has joined the room. + First = 0, + /// The user is reconnected to the room. + Reconnected = 1 + } + + /// The reason why the user leaves the room. + public enum RtcUserLeaveReasonType + { + /// The user quits the room. + Quit = 0, + /// The user drops out of the room. + Dropped = 1 + } + + /// The type of the media device. + public enum RtcMediaDeviceType + { + /// Unknown audio device. + AudioUnknown = -1, + /// Audio renderer. + AudioRenderDevice = 0, + /// Audio capture device. + AudioCaptureDevice = 1 + } + + /// The state of the media device. + public enum RtcMediaDeviceState + { + /// The device starts working. + Started = 1, + /// The device stops working. + Stopped = 2, + /// Runtime error. + RuntimeError = 3, + /// The device is added. + Added = 4, + /// The device is removed. + Removed = 5 + } + + /// Types of media device errors. + public enum RtcMediaDeviceError + { + /// No error. + Ok = 0, + /// No permission to record audio or video. + NoPermission = 1, + /// The device is being used. + DeviceBusy = 2, + /// Device failure. + DeviceFailure = 3, + /// The device is not found. + DeviceNotFound = 4, + /// The device is disconnected. + DeviceDisconnected = 5, + /// The device does not send data to the RTC engine. + DeviceNoCallback = 6, + /// The sampling format is not supported. + UnSupporttedFormat = 7 + } + + /// The reason why the remote stream is removed. + public enum RtcStreamRemoveReason + { + /// The remote user stops publishing streams. + Unpublish = 0, + /// The remote user fails to publish streams. + PublishFailed = 1, + /// Fail to maintain the active state of the stream. + KeepLiveFailed = 2, + /// The remote user is disconnected. + ClientDisconnected = 3, + /// The remote user republishes streams. + Republish = 4, + /// Other reasons. + Other = 5 + } + + /// The events that may take place in networking. + public enum GameConnectionEvent + { + /// Connected. + Connected = 0, + /// Closed. + Closed = 1, + /// Reconnecting. + Lost = 2, + /// Reconnected. + Resumed = 3, + /// Kicked for re-login. + KickedByRelogin = 4, + /// Kicked by the server. + KickedByGameServer = 5, + /// Game logic error. + GameLogicError = 6, + /// Unknown. + Unknown = 7 + } + + /// The reasons for failed requests to the game service. + public enum GameRequestFailedReason + { + /// None. + None = 0, + /// Platform services are not initialized. + NotInitialized = 1, + /// Platform services has been uninitialized. + Uninitialized = 2, + /// The game service is currently unavailable. + CurrentlyUnavailable = 3, + /// Unknown reason. + CurrentlyUnknown = 4 + } + + /// The purpose of sports. + public enum SportTarget + { + /// To lose weight. + LoseFat = 0, + /// To keep fit. + KeepFit = 1 + } + + /// The period type of the subscription. + public enum PeriodType + { + /// Invalid value. + Invalid = -1, + /// None. A default value for non-subscription add-on. + None = 0, + /// Hourly subscription. + Hour = 1, + /// Daily subscription. + Day = 2, + /// Weekly subscription. + Week = 3, + /// Monthly subscription. + Month = 4, + /// Quarterly subscription. + Quarter = 5, + /// Annual subscription. + Year = 6 + } + + /// The relationship between two users. You can call \ref UserService.GetUserRelations to query user relation. + public enum UserRelationType + { + /// Unknown relationship. + Unknown = 0, + /// The queried user is the current user's friend. + IsFriend = 1, + /// The queried user is not the current user's friend and the current user can send a friend request to the queried user. + NotFriend = 2, + /// The queried user is blocked by the current user. + Blocked = 3, + /// The current user is blocked by the queried user, so the current user cannot send a friend request to the queried user. + BlockedBy = 4, + /// The current user has sent a friend request to the queried user. + ApplyingFriend = 5 + } + + /// The initialization result of platform services. + public enum PlatformInitializeResult + { + /// Unknown. + Unknown = -999, + /// Initialization needs to fetch the app's configuration. If the network request fails, this error will occur. + NetError = -6, + /// SDK depends on some system functions. This error means failed to find implementation. + MissingImpl = -5, + /// Load implementation so failed. + LoadImplFailed = -4, + /// Initialization fails because of unclear reason. + InternalError = -3, + /// The `appid` param is invalid. Please check the it. + InvalidParams = -2, + /// The platform SDK has already been initialized. + AlreadyInitialized = -1, + /// The platform SDK is successfully initialized. + Success = 0 + } + + /// The type of media to share. + public enum ShareMediaType + { + /// Videos attached with thumbnails. + Video = 0, + /// Screenshots. + Image = 1 + } + + /// The app which the videos or screenshots are shared to. + public enum ShareAppType + { + /// The [Douyin](https://www.douyin.com/) app. + Douyin = 0 + } + + /// The user needs to pass a token when joining the room. When requesting a token, a map (key-value pair) should be passed. The key is the permission name and the value is the permission's validity time. + public enum RtcPrivilege + { + /// The permission to publish audio and video streams. + PublishStream = 0, + /// The permission to publish audio streams. + PublishAudioStream = 1, + /// The permission to publish video streams. + PublishVideoStream = 2, + /// The permission to subscribe to the streams from others. + SubscribeStream = 3 + } + + /// Indicates whether the local device is connected to the RTC server. + public enum RtcConnectionState + { + /// Disconnected for 12 seconds, and the SDK will try to reconnect. + Disconnected = 1, + /// Connecting. + Connecting = 2, + /// Connected. + Connected = 3, + /// Reconnecting. + Reconnecting = 4, + /// Reconnected. + Reconnected = 5, + /// Remains in the `Disconnected` status for more than 10 seconds and reconnection attempts during this period are unsuccessful, the SDK will continue trying to reconnect. + Lost = 6 + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB.cs.meta new file mode 100644 index 0000000..b998b0b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d10b07d0efa7915488f7ac6e32eb5eb6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB2.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB2.cs new file mode 100644 index 0000000..3086f5f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB2.cs @@ -0,0 +1,118 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace Pico.Platform +{ + public partial class CLIB + { + public static ulong ppf_Achievements_GetProgressByName(string[] names) + { + var namesHandle = new PtrArray(names); + var result = ppf_Achievements_GetProgressByName(namesHandle.a, names.Length); + namesHandle.Free(); + return result; + } + + public static ulong ppf_Achievements_GetDefinitionsByName(string[] names) + { + var namesHandle = new PtrArray(names); + var result = ppf_Achievements_GetDefinitionsByName(namesHandle.a, names.Length); + namesHandle.Free(); + return result; + } + + public static ulong ppf_IAP_GetProductsBySKU(string[] names) + { + var namesHandle = new PtrArray(names); + var result = ppf_IAP_GetProductsBySKU(namesHandle.a, names.Length); + namesHandle.Free(); + return result; + } + + public static ulong ppf_Leaderboard_GetEntriesByIds(string leaderboardName, int pageSize, int pageIdx, LeaderboardStartAt startAt, string[] userIDs) + { + var userIds = new PtrArray(userIDs); + var result = ppf_Leaderboard_GetEntriesByIds(leaderboardName, pageSize, pageIdx, startAt, userIds.a, (uint) userIDs.Length); + userIds.Free(); + return result; + } + + public static ulong ppf_Challenges_GetEntriesByIds(ulong challengeID, LeaderboardStartAt startAt, string[] userIDs, int pageIdx, int pageSize) + { + var userIds = new PtrArray(userIDs); + var result = ppf_Challenges_GetEntriesByIds(challengeID, startAt, userIds.a, (uint) userIDs.Length, pageIdx, pageSize); + userIds.Free(); + return result; + } + + public static ulong ppf_Challenges_Invites(ulong challengeID, string[] userIDs) + { + var userIds = new PtrArray(userIDs); + var result = ppf_Challenges_Invites(challengeID, userIds.a, (uint) userIDs.Length); + userIds.Free(); + return result; + } + + public static ulong ppf_User_RequestUserPermissions(string[] permissions) + { + var ptrs = new PtrArray(permissions); + var result = ppf_User_RequestUserPermissions(ptrs.a, permissions.Length); + ptrs.Free(); + return result; + } + + public static ulong ppf_User_GetRelations(string[] userIds) + { + var ptrs = new PtrArray(userIds); + var result = ppf_User_GetRelations(ptrs.a, userIds.Length); + ptrs.Free(); + return result; + } + + public static ulong ppf_Presence_SendInvites(string[] userIDs) + { + var ptrs = new PtrArray(userIDs); + var result = ppf_Presence_SendInvites(ptrs.a, (uint) userIDs.Length); + ptrs.Free(); + return result; + } + + public static Dictionary DataStoreFromNative(IntPtr ppfDataStore) + { + var map = new Dictionary(); + var size = (int) ppf_DataStore_GetNumKeys(ppfDataStore); + for (var i = 0; i < size; i++) + { + string key = ppf_DataStore_GetKey(ppfDataStore, i); + map[key] = ppf_DataStore_GetValue(ppfDataStore, key); + } + + return map; + } + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate int RtcProcessAudioFrameFunction(IntPtr audioFrameHandle); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_Rtc_RegisterLocalAudioProcessor", CallingConvention = CallingConvention.Cdecl)] + public static extern void ppf_Rtc_RegisterLocalAudioProcessor(RtcProcessAudioFrameFunction rtcProcessAudioFrameFunction, RtcAudioChannel channel, RtcAudioSampleRate sampleRate); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_InitializeAndroid", CallingConvention = CallingConvention.Cdecl)] + public static extern PlatformInitializeResult ppf_InitializeAndroid(string appId, IntPtr activityObj, IntPtr env); + + [DllImport("pxrplatformloader", EntryPoint = "ppf_InitializeAndroidAsynchronous", CallingConvention = CallingConvention.Cdecl)] + public static extern ulong ppf_InitializeAndroidAsynchronous(string appId, IntPtr activityObj, IntPtr env); + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB2.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB2.cs.meta new file mode 100644 index 0000000..80ad484 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/CLIB2.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d8426d258c3f4a19950866175d24fdcf +timeCreated: 1660302689 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/MarshalUtil.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/MarshalUtil.cs new file mode 100644 index 0000000..1791b39 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/MarshalUtil.cs @@ -0,0 +1,171 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +namespace Pico.Platform +{ + public class UTF8Marshaller : ICustomMarshaler + { + public void CleanUpManagedData(object ManagedObj) + { + } + + public void CleanUpNativeData(IntPtr pNativeData) + => Marshal.FreeHGlobal(pNativeData); + + public int GetNativeDataSize() => -1; + + public IntPtr MarshalManagedToNative(object managedObj) + { + if (managedObj == null) + return IntPtr.Zero; + if (!(managedObj is string)) + throw new MarshalDirectiveException("UTF8Marshaler must be used on a string."); + + return MarshalUtil.StringToPtr((string) managedObj); + } + + public object MarshalNativeToManaged(IntPtr str) + { + if (str == IntPtr.Zero) + return null; + return MarshalUtil.PtrToString(str); + } + + public static ICustomMarshaler GetInstance(string pstrCookie) + { + if (marshaler == null) + marshaler = new UTF8Marshaller(); + return marshaler; + } + + private static UTF8Marshaller marshaler; + } + + public class PtrManager + { + public IntPtr ptr; + private bool freed = false; + + public PtrManager(byte[] a) + { + this.ptr = MarshalUtil.ByteArrayToNative(a); + } + + public void Free() + { + if (freed) return; + freed = true; + Marshal.FreeHGlobal(ptr); + } + + ~PtrManager() + { + this.Free(); + } + } + + class PtrArray + { + public IntPtr[] a; + private bool freed = false; + + public PtrArray(string[] a) + { + if (a == null) + { + a = Array.Empty(); + } + + this.a = a.Select(x => MarshalUtil.StringToPtr(x)).ToArray(); + } + + public void Free() + { + if (freed) return; + freed = true; + foreach (var i in a) + { + Marshal.FreeHGlobal(i); + } + } + + ~PtrArray() + { + this.Free(); + } + } + + public static class MarshalUtil + { + public static IntPtr StringToPtr(string s) + { + if (s == null) return IntPtr.Zero; + // not null terminated + byte[] strbuf = Encoding.UTF8.GetBytes(s); + IntPtr buffer = Marshal.AllocHGlobal(strbuf.Length + 1); + Marshal.Copy(strbuf, 0, buffer, strbuf.Length); + + // write the terminating null + Marshal.WriteByte(buffer + strbuf.Length, 0); + return buffer; + } + + public static string PtrToString(IntPtr p) + { + return GetString(Encoding.UTF8, p); + } + + public static string GetString(Encoding encoding, IntPtr str) + { + if (str == IntPtr.Zero) + return null; + + int byteCount = 0; + + if (Equals(encoding, Encoding.UTF32)) + { + while (Marshal.ReadInt32(str, byteCount) != 0) byteCount += sizeof(int); + } + else if (Equals(encoding, Encoding.Unicode) || Equals(encoding, Encoding.BigEndianUnicode)) + { + while (Marshal.ReadInt16(str, byteCount) != 0) byteCount += sizeof(short); + } + else + { + while (Marshal.ReadByte(str, byteCount) != 0) byteCount += sizeof(byte); + } + + var bytes = new byte[byteCount]; + Marshal.Copy(str, bytes, 0, byteCount); + return encoding.GetString(bytes); + } + + public static byte[] ByteArrayFromNative(IntPtr ptr, uint length) + { + var ans = new byte[length]; + Marshal.Copy(ptr, ans, 0, (int) length); + return ans; + } + + public static IntPtr ByteArrayToNative(byte[] a) + { + var ptr = Marshal.AllocHGlobal(a.Length); + Marshal.Copy(a, 0, ptr, a.Length); + return ptr; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/MarshalUtil.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/MarshalUtil.cs.meta new file mode 100644 index 0000000..6e84af6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/CLIB/MarshalUtil.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a97b494aeb644a0f9e1f1dc041b13a4e +timeCreated: 1660145702 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework.meta new file mode 100644 index 0000000..70b8b76 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b9532b7f0304176428dc114e63d9533a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Looper.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Looper.cs new file mode 100644 index 0000000..e3c57c6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Looper.cs @@ -0,0 +1,170 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Concurrent; +using UnityEngine; + +namespace Pico.Platform +{ + public class Looper + { + private static readonly ConcurrentDictionary TaskMap = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary NotifyMap = new ConcurrentDictionary(); + public static readonly ConcurrentDictionary MessageParserMap = new ConcurrentDictionary(); + + public static void ProcessMessages(uint limit = 0) + { + if (limit == 0) + { + while (true) + { + var msg = PopMessage(); + if (msg == null) + { + break; + } + + dispatchMessage(msg); + } + } + else + { + for (var i = 0; i < limit; ++i) + { + var msg = PopMessage(); + if (msg == null) + { + break; + } + + dispatchMessage(msg); + } + } + } + + public static Message PopMessage() + { + if (!CoreService.Initialized) + { + return null; + } + + var handle = CLIB.ppf_PopMessage(); + if (handle == IntPtr.Zero) + { + return null; + } + + MessageType messageType = CLIB.ppf_Message_GetType(handle); + Message msg = MessageQueue.ParseMessage(handle); + if (msg == null) + { + if (MessageParserMap.TryGetValue(messageType, out MessageParser parser)) + { + msg = parser(handle); + } + } + + if (msg == null) + { + Debug.LogError($"Cannot parse message type {messageType}"); + } + + CLIB.ppf_FreeMessage(handle); + return msg; + } + + private static void dispatchMessage(Message msg) + { + if (msg.RequestID != 0) + { + // handle task + if (TaskMap.TryGetValue(msg.RequestID, out var handler)) + { + try + { + handler.DynamicInvoke(msg); + } + catch (Exception e) + { + Debug.LogError($"dispatchMessage failed {e}"); + } + finally + { + TaskMap.TryRemove(msg.RequestID, out handler); + } + } + else + { + Debug.LogError($"No handler for task: requestId={msg.RequestID}, msg.Type = {msg.Type}. You should call `OnComplete()` when use request API."); + } + } + else + { + // handle notification + if (NotifyMap.TryGetValue(msg.Type, out var handler)) + { + handler.DynamicInvoke(msg); + } + else + { + //Debug.LogError($"No handler for notification: msg.Type = {msg.Type}"); + } + } + } + + public static void RegisterTaskHandler(ulong taskId, Delegate handler) + { + if (taskId == 0) + { + Debug.LogError("The task is invalid."); + return; + } + + TaskMap[taskId] = handler; + } + + public static void RegisterNotifyHandler(MessageType type, Delegate handler) + { + if (handler == null) + { + Debug.LogError("Cannot register null notification handler."); + return; + } + + NotifyMap[type] = handler; + } + + public static void RegisterMessageParser(MessageType messageType, MessageParser messageParser) + { + if (messageParser == null) + { + Debug.LogError($"invalid message parser for {messageType}"); + return; + } + + if (MessageParserMap.ContainsKey(messageType)) + { + Debug.LogWarning($"Duplicate register of {messageType}"); + } + + MessageParserMap.TryAdd(messageType, messageParser); + } + + public static void Clear() + { + TaskMap.Clear(); + NotifyMap.Clear(); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Looper.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Looper.cs.meta new file mode 100644 index 0000000..65e7d7b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Looper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 26c0fea4ad144b74f9173e5b4ad26287 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Message.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Message.cs new file mode 100644 index 0000000..106d018 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Message.cs @@ -0,0 +1,117 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Generic; +using Pico.Platform.Models; + +namespace Pico.Platform.Models +{ + public class Error + { + public readonly int Code; + public readonly string Message; + + public Error(int code, string msg) + { + this.Code = code; + this.Message = msg; + } + + public Error(IntPtr handle) + { + this.Code = CLIB.ppf_Error_GetCode(handle); + this.Message = CLIB.ppf_Error_GetMessage(handle); + } + + public override string ToString() + { + return $"Error(Code={this.Code},Message={this.Message})"; + } + } + + public class MessageArray : List + { + /**@brief The next page parameter. It's empty when it doesn't has next page.*/ + public string NextPageParam; + + /**@brief The previous page parameter. It's empty when it doesn't has previous page.*/ + public string PreviousPageParam; + + public bool HasNextPage => !String.IsNullOrEmpty(NextPageParam); + + public bool HasPreviousPage => !String.IsNullOrEmpty(PreviousPageParam); + } +} + +namespace Pico.Platform +{ + public class Message + { + public delegate void Handler(Message message); + + public readonly MessageType Type; + public readonly ulong RequestID; + public readonly Error Error; + + public Message(IntPtr msgPointer) + { + Type = CLIB.ppf_Message_GetType(msgPointer); + RequestID = CLIB.ppf_Message_GetRequestID(msgPointer); + if (CLIB.ppf_Message_IsError(msgPointer)) + { + Error = new Error(CLIB.ppf_Message_GetError(msgPointer)); + } + } + + public bool IsError => Error != null && Error.Code != 0; + + [Obsolete("Use Error instead")] + public Error GetError() + { + return Error; + } + } + + public class Message : Message + { + public new delegate void Handler(Message message); + + public readonly T Data; + + public delegate T GetDataFromMessage(IntPtr msgPointer); + + public Message(IntPtr msgPointer, GetDataFromMessage getData) : base(msgPointer) + { + if (!IsError) + { + Data = getData(msgPointer); + } + } + } + + + public delegate Message MessageParser(IntPtr ptr); + + public static class CommonParsers + { + public static Message StringParser(IntPtr msgPointer) + { + return new Message(msgPointer, ptr => { return CLIB.ppf_Message_GetString(ptr); }); + } + + public static Message VoidParser(IntPtr msgPointer) + { + return new Message(msgPointer); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Message.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Message.cs.meta new file mode 100644 index 0000000..94de465 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Message.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 47be01e871da24aba8e67d2bd8b6646c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/MessageQueue.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/MessageQueue.cs new file mode 100644 index 0000000..8245cde --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/MessageQueue.cs @@ -0,0 +1,923 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using Pico.Platform.Models; + +namespace Pico.Platform +{ + public class MessageQueue + { + public static Message ParseMessage(IntPtr msgPointer) + { + Message msg = null; + MessageType messageType = CLIB.ppf_Message_GetType(msgPointer); + switch (messageType) + { + case MessageType.PlatformInitializeAndroidAsynchronous: + { + msg = new Message(msgPointer, ptr => { return (PlatformInitializeResult) CLIB.ppf_Message_GetInt32(ptr); }); + break; + } + + case MessageType.CloudStorage_StartNewBackup: + { + msg = new Message(msgPointer); + break; + } + + #region speech + + case MessageType.Notification_Speech_OnAsrResult: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAsrResult(ptr); + return new AsrResult(obj); + }); + break; + } + case MessageType.Notification_Speech_OnSpeechError: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetSpeechError(ptr); + return new SpeechError(obj); + }); + break; + } + + #endregion + + #region Highlight + + case MessageType.Highlight_StartSession: + { + msg = new Message(msgPointer, ptr => { return CLIB.ppf_Message_GetString(ptr); }); + break; + } + case MessageType.Highlight_CaptureScreen: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetCaptureInfo(ptr); + if (obj == IntPtr.Zero) return null; + return new CaptureInfo(obj); + }); + break; + } + case MessageType.Highlight_ListMedia: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetSessionMedia(ptr); + if (obj == IntPtr.Zero) return null; + return new SessionMedia(obj); + }); + break; + } + case MessageType.Highlight_SaveMedia: + case MessageType.Highlight_ShareMedia: + case MessageType.Highlight_StartRecord: + + { + msg = new Message(msgPointer); + break; + } + case MessageType.Highlight_StopRecord: + case MessageType.Notification_Highlight_OnRecordStop: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRecordInfo(ptr); + if (obj == IntPtr.Zero) return null; + return new RecordInfo(obj); + }); + break; + } + + #endregion + + #region compliance + + case MessageType.Compliance_DetectSensitive: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetDetectSensitiveResult(ptr); + if (obj == IntPtr.Zero) return null; + return new DetectSensitiveResult(obj); + }); + break; + } + + #endregion + + #region Sport + + case MessageType.Sport_GetSummary: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetSportSummary(ptr); + if (obj == IntPtr.Zero) return null; + return new SportSummary(obj); + }); + break; + } + case MessageType.Sport_GetDailySummary: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetSportDailySummaryArray(ptr); + if (obj == IntPtr.Zero) return null; + return new SportDailySummaryList(obj); + }); + break; + } + case MessageType.Sport_GetUserInfo: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetSportUserInfo(ptr); + if (obj == IntPtr.Zero) return null; + return new SportUserInfo(obj); + }); + break; + } + + #endregion + + #region User + + case MessageType.User_EntitlementCheck: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetEntitlementCheckResult(ptr); + if (obj == IntPtr.Zero) return null; + return new EntitlementCheckResult(obj); + }); + break; + } + case MessageType.User_GetAuthorizedPermissions: + case MessageType.User_RequestUserPermissions: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetPermissionResult(ptr); + if (obj == IntPtr.Zero) return null; + return new PermissionResult(obj); + }); + break; + } + + + case MessageType.User_GetLoggedInUserFriendsAndRooms: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetUserAndRoomArray(ptr); + if (obj == IntPtr.Zero) return null; + var data = new UserRoomList(obj); + return data; + }); + break; + } + case MessageType.Presence_GetSentInvites: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetApplicationInviteArray(ptr); + if (obj == IntPtr.Zero) return null; + var data = new ApplicationInviteList(obj); + return data; + }); + break; + } + case MessageType.Presence_SendInvites: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetSendInvitesResult(ptr); + if (obj == IntPtr.Zero) return null; + var data = new SendInvitesResult(obj); + return data; + }); + break; + } + case MessageType.Presence_GetDestinations: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetDestinationArray(ptr); + if (obj == IntPtr.Zero) return null; + var data = new DestinationList(obj); + return data; + }); + break; + } + case MessageType.User_GetAccessToken: + case MessageType.User_GetIdToken: + case MessageType.Rtc_GetToken: + case MessageType.Notification_Rtc_OnTokenWillExpire: + case MessageType.Notification_Rtc_OnUserStartAudioCapture: + case MessageType.Notification_Rtc_OnUserStopAudioCapture: + case MessageType.Application_LaunchOtherApp: + case MessageType.Application_LaunchStore: + case MessageType.Notification_Room_InviteAccepted: + case MessageType.Notification_Challenge_LaunchByInvite: + case MessageType.Notification_ApplicationLifecycle_LaunchIntentChanged: + { + msg = new Message(msgPointer, ptr => { return CLIB.ppf_Message_GetString(ptr); }); + break; + } + case MessageType.Notification_Presence_JoinIntentReceived: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetPresenceJoinIntent(ptr); + if (obj == IntPtr.Zero) return null; + return new PresenceJoinIntent(obj); + }); + break; + } + case MessageType.Application_GetVersion: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetApplicationVersion(ptr); + if (obj == IntPtr.Zero) return null; + return new ApplicationVersion(obj); + }); + break; + } + + case MessageType.User_GetLoggedInUser: + case MessageType.User_Get: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetUser(ptr); + if (obj == IntPtr.Zero) return null; + return new User(obj); + }); + break; + } + case MessageType.User_GetOrgScopedID: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetOrgScopedID(ptr); + if (obj == IntPtr.Zero) return null; + return new OrgScopedID(obj); + }); + break; + } + case MessageType.User_LaunchFriendRequestFlow: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetLaunchFriendRequestFlowResult(ptr); + if (obj == IntPtr.Zero) return null; + return new LaunchFriendResult(obj); + }); + break; + } + case MessageType.User_GetLoggedInUserFriends: + case MessageType.Room_GetInvitableUsers2: + case MessageType.Presence_GetInvitableUsers: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetUserArray(ptr); + if (obj == IntPtr.Zero) return null; + return new UserList(obj); + }); + break; + } + + case MessageType.User_GetRelations: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetUserRelationResult(ptr); + if (obj == IntPtr.Zero) return null; + return new UserRelationResult(obj); + }); + break; + } + + #endregion + + #region RTC + + case MessageType.Notification_Rtc_OnRoomMessageReceived: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcRoomMessageReceived(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcRoomMessageReceived(obj); + }); + break; + } + case MessageType.Notification_Rtc_OnUserMessageReceived: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcUserMessageReceived(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcUserMessageReceived(obj); + }); + break; + } + case MessageType.Notification_Rtc_OnRoomMessageSendResult: + case MessageType.Notification_Rtc_OnUserMessageSendResult: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcMessageSendResult(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcMessageSendResult(obj); + }); + break; + } + case MessageType.Notification_Rtc_OnRoomBinaryMessageReceived: + case MessageType.Notification_Rtc_OnUserBinaryMessageReceived: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcBinaryMessageReceived(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcBinaryMessageReceived(obj); + }); + break; + } + case MessageType.Notification_Rtc_OnUserPublishScreen: + case MessageType.Notification_Rtc_OnUserPublishStream: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcUserPublishInfo(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcUserPublishInfo(ptr); + }); + break; + } + case MessageType.Notification_Rtc_OnUserUnPublishScreen: + case MessageType.Notification_Rtc_OnUserUnPublishStream: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcUserUnPublishInfo(ptr); + if (obj == IntPtr.Zero) + { + return null; + } + + return new RtcUserUnPublishInfo(obj); + }); + break; + } + + case MessageType.Notification_Rtc_OnStreamSyncInfoReceived: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcStreamSyncInfo(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcStreamSyncInfo(obj); + }); + break; + } + case MessageType.Notification_Rtc_OnVideoDeviceStateChanged: + { + break; + } + case MessageType.Notification_Rtc_OnRoomError: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcRoomError(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcRoomError(obj); + }); + break; + } + case MessageType.Notification_Rtc_OnRoomWarn: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcRoomWarn(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcRoomWarn(obj); + }); + break; + } + case MessageType.Notification_Rtc_OnConnectionStateChange: + { + msg = new Message(msgPointer, ptr => { return (RtcConnectionState) CLIB.ppf_Message_GetInt32(ptr); }); + break; + } + case MessageType.Notification_Rtc_OnError: + case MessageType.Notification_Rtc_OnWarn: + { + msg = new Message(msgPointer, ptr => { return CLIB.ppf_Message_GetInt32(ptr); }); + break; + } + case MessageType.Notification_Rtc_OnRoomStats: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcRoomStats(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcRoomStats(obj); + }); + break; + } + case MessageType.Notification_Rtc_OnJoinRoom: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcJoinRoomResult(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcJoinRoomResult(obj); + }); + break; + } + case MessageType.Notification_Rtc_OnLeaveRoom: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcLeaveRoomResult(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcLeaveRoomResult(obj); + }); + break; + } + + case MessageType.Notification_Rtc_OnUserLeaveRoom: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcUserLeaveInfo(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcUserLeaveInfo(obj); + }); + break; + } + + case MessageType.Notification_Rtc_OnUserJoinRoom: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcUserJoinInfo(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcUserJoinInfo(obj); + }); + break; + } + + case MessageType.Notification_Rtc_OnAudioPlaybackDeviceChanged: + { + msg = new Message(msgPointer, ptr => { return (RtcAudioPlaybackDevice) CLIB.ppf_Message_GetInt32(ptr); }); + break; + } + + case MessageType.Notification_Rtc_OnMediaDeviceStateChanged: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcMediaDeviceChangeInfo(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcMediaDeviceChangeInfo(obj); + }); + break; + } + + case MessageType.Notification_Rtc_OnLocalAudioPropertiesReport: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcLocalAudioPropertiesReport(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcLocalAudioPropertiesReport(obj); + }); + break; + } + + case MessageType.Notification_Rtc_OnRemoteAudioPropertiesReport: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcRemoteAudioPropertiesReport(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcRemoteAudioPropertiesReport(obj); + }); + break; + } + + case MessageType.Notification_Rtc_OnUserMuteAudio: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRtcMuteInfo(ptr); + if (obj == IntPtr.Zero) return null; + return new RtcMuteInfo(obj); + }); + break; + } + + #endregion + + #region IAP + + case MessageType.IAP_GetViewerPurchases: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetPurchaseArray(ptr); + if (obj == IntPtr.Zero) return null; + return new PurchaseList(obj); + }); + break; + } + case MessageType.IAP_GetSubscriptionStatus: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetSubscriptionStatus(ptr); + if (obj == IntPtr.Zero) return null; + return new SubscriptionStatus(obj); + }); + break; + } + case MessageType.IAP_LaunchCheckoutFlow: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetPurchase(ptr); + if (obj == IntPtr.Zero) return null; + return new Purchase(obj); + }); + break; + } + case MessageType.IAP_GetProductsBySKU: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetProductArray(ptr); + if (obj == IntPtr.Zero) return null; + return new ProductList(obj); + }); + break; + } + + #endregion + + #region DLC + + case MessageType.AssetFile_DeleteById: + case MessageType.AssetFile_DeleteByName: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAssetFileDeleteResult(ptr); + if (obj == IntPtr.Zero) return null; + return new AssetFileDeleteResult(obj); + }); + break; + } + case MessageType.AssetFile_DownloadById: + case MessageType.AssetFile_DownloadByName: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAssetFileDownloadResult(ptr); + if (obj == IntPtr.Zero) return null; + return new AssetFileDownloadResult(obj); + }); + break; + } + case MessageType.AssetFile_DownloadCancelById: + case MessageType.AssetFile_DownloadCancelByName: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAssetFileDownloadCancelResult(ptr); + if (obj == IntPtr.Zero) return null; + return new AssetFileDownloadCancelResult(obj); + }); + break; + } + case MessageType.AssetFile_GetList: + case MessageType.AssetFile_GetNextAssetDetailsArrayPage: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAssetDetailsArray(ptr); + if (obj == IntPtr.Zero) return null; + return new AssetDetailsList(obj); + }); + break; + } + case MessageType.AssetFile_StatusById: + case MessageType.AssetFile_StatusByName: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAssetStatus(ptr); + if (obj == IntPtr.Zero) return null; + return new AssetStatus(obj); + }); + break; + } + case MessageType.Notification_AssetFile_DownloadUpdate: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAssetFileDownloadUpdate(ptr); + if (obj == IntPtr.Zero) return null; + return new AssetFileDownloadUpdate(obj); + }); + break; + } + case MessageType.Notification_AssetFile_DeleteForSafety: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAssetFileDeleteForSafety(ptr); + if (obj == IntPtr.Zero) return null; + return new AssetFileDeleteForSafety(obj); + }); + break; + } + + #endregion + + #region stark game + + case MessageType.Matchmaking_Cancel2: + case MessageType.Matchmaking_ReportResultInsecure: + case MessageType.Matchmaking_StartMatch: + case MessageType.Room_LaunchInvitableUserFlow: + case MessageType.Challenges_LaunchInvitableUserFlow: + case MessageType.Room_UpdateOwner: + case MessageType.Notification_MarkAsRead: + case MessageType.Notification_Game_StateReset: + case MessageType.Presence_Clear: + case MessageType.Presence_Set: + case MessageType.IAP_ConsumePurchase: + case MessageType.Presence_LaunchInvitePanel: + case MessageType.Presence_ShareMedia: + { + msg = new Message(msgPointer); + break; + } + case MessageType.Matchmaking_GetAdminSnapshot: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetMatchmakingAdminSnapshot(ptr); + return new MatchmakingAdminSnapshot(obj); + }); + break; + } + case MessageType.Matchmaking_Browse2: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetMatchmakingBrowseResult(ptr); + return new MatchmakingBrowseResult(obj); + }); + break; + } + case MessageType.Matchmaking_Browse2CustomPage: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetMatchmakingBrowseCustomPageResult(ptr); + return new MatchmakingBrowseResult(obj); + }); + break; + } + case MessageType.Matchmaking_Enqueue2: + case MessageType.Matchmaking_EnqueueRoom2: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetMatchmakingEnqueueResult(ptr); + return new MatchmakingEnqueueResult(obj); + }); + break; + } + case MessageType.Matchmaking_CreateAndEnqueueRoom2: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetMatchmakingEnqueueResultAndRoom(ptr); + return new MatchmakingEnqueueResultAndRoom(obj); + }); + break; + } + + case MessageType.Matchmaking_GetStats: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetMatchmakingStats(ptr); + return new MatchmakingStats(obj); + }); + break; + } + case MessageType.Room_GetCurrent: + case MessageType.Room_GetCurrentForUser: + case MessageType.Notification_Room_RoomUpdate: + case MessageType.Room_CreateAndJoinPrivate: + case MessageType.Room_CreateAndJoinPrivate2: + case MessageType.Room_InviteUser: + case MessageType.Room_Join: + case MessageType.Room_Join2: + case MessageType.Room_JoinNamed: + case MessageType.Room_KickUser: + case MessageType.Room_Leave: + case MessageType.Room_SetDescription: + case MessageType.Room_UpdateDataStore: + case MessageType.Room_UpdateMembershipLockStatus: + case MessageType.Room_UpdatePrivateRoomJoinPolicy: + case MessageType.Notification_Matchmaking_MatchFound: + case MessageType.Room_Get: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRoom(ptr); + return new Room(obj); + }); + break; + } + case MessageType.Room_GetModeratedRooms: + case MessageType.Room_GetNamedRooms: + case MessageType.Room_GetNextRoomArrayPage: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRoomArray(ptr); + return new RoomList(obj); + }); + break; + } + case MessageType.PlatformGameInitializeAsynchronous: + { + msg = new Message(msgPointer, ptr => + { + var objHandle = CLIB.ppf_Message_GetPlatformGameInitialize(ptr); + var obj = CLIB.ppf_PlatformGameInitialize_GetResult(objHandle); + return obj; + }); + break; + } + case MessageType.Notification_Game_ConnectionEvent: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetGameConnectionEvent(ptr); + return obj; + }); + break; + } + case MessageType.Notification_Game_RequestFailed: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetGameRequestFailedReason(ptr); + return obj; + }); + break; + } + case MessageType.Leaderboard_Get: + case MessageType.Leaderboard_GetNextLeaderboardArrayPage: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetLeaderboardArray(ptr); + return new LeaderboardList(obj); + }); + break; + } + + case MessageType.Leaderboard_GetEntries: + case MessageType.Leaderboard_GetEntriesAfterRank: + case MessageType.Leaderboard_GetEntriesByIds: + case MessageType.Leaderboard_GetNextEntries: + case MessageType.Leaderboard_GetPreviousEntries: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetLeaderboardEntryArray(ptr); + return new LeaderboardEntryList(obj); + }); + break; + } + case MessageType.Leaderboard_WriteEntry: + case MessageType.Leaderboard_WriteEntryWithSupplementaryMetric: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetLeaderboardUpdateStatus(ptr); + return CLIB.ppf_LeaderboardUpdateStatus_GetDidUpdate(obj); + }); + break; + } + + case MessageType.Achievements_GetAllDefinitions: + case MessageType.Achievements_GetDefinitionsByName: + case MessageType.Achievements_GetNextAchievementDefinitionArrayPage: + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAchievementDefinitionArray(ptr); + return new AchievementDefinitionList(obj); + }); + break; + + case MessageType.Achievements_GetAllProgress: + case MessageType.Achievements_GetNextAchievementProgressArrayPage: + case MessageType.Achievements_GetProgressByName: + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAchievementProgressArray(ptr); + return new AchievementProgressList(obj); + }); + break; + + case MessageType.Achievements_AddCount: + case MessageType.Achievements_AddFields: + case MessageType.Achievements_Unlock: + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetAchievementUpdate(ptr); + return new AchievementUpdate(obj); + }); + break; + case MessageType.Notification_GetNextRoomInviteNotificationArrayPage: + case MessageType.Notification_GetRoomInvites: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetRoomInviteNotificationArray(ptr); + return new RoomInviteNotificationList(obj); + }); + break; + } + case MessageType.Challenges_Invite: + case MessageType.Challenges_Get: + case MessageType.Challenges_Join: + case MessageType.Challenges_Leave: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetChallenge(ptr); + return new Challenge(obj); + }); + break; + } + case MessageType.Challenges_GetList: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetChallengeArray(ptr); + return new ChallengeList(obj); + }); + break; + } + case MessageType.Challenges_GetEntries: + case MessageType.Challenges_GetEntriesAfterRank: + case MessageType.Challenges_GetEntriesByIds: + { + msg = new Message(msgPointer, ptr => + { + var obj = CLIB.ppf_Message_GetChallengeEntryArray(ptr); + return new ChallengeEntryList(obj); + }); + break; + } + + #endregion stark game + + default: + break; + } + + return msg; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/MessageQueue.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/MessageQueue.cs.meta new file mode 100644 index 0000000..a54e176 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/MessageQueue.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fe58099ac2904f4991b8ba3b7810910c +timeCreated: 1666324189 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/PXR_PlatformSetting.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/PXR_PlatformSetting.cs new file mode 100644 index 0000000..80da1ff --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/PXR_PlatformSetting.cs @@ -0,0 +1,77 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace Unity.XR.PXR +{ +#if UNITY_EDITOR + [InitializeOnLoad] +#endif + public sealed class PXR_PlatformSetting : ScriptableObject + { + public enum simulationType + { + Null, + Invalid, + Valid + } + + [SerializeField] public bool entitlementCheckSimulation; + [SerializeField] public bool startTimeEntitlementCheck; + [SerializeField] public string appID; + [SerializeField] public bool useHighlight = true; + + public List deviceSN = new List(); + + private static PXR_PlatformSetting instance; + + public static PXR_PlatformSetting Instance + { + get + { + if (instance == null) + { + instance = Resources.Load("PXR_PlatformSetting"); +#if UNITY_EDITOR + string path = Application.dataPath + "/Resources"; + if (!Directory.Exists(path)) + { + AssetDatabase.CreateFolder("Assets", "Resources"); + if (instance == null) + { + instance = CreateInstance(); + AssetDatabase.CreateAsset(instance, "Assets/Resources/PXR_PlatformSetting.asset"); + } + } + else + { + if (instance == null) + { + instance = CreateInstance(); + AssetDatabase.CreateAsset(instance, "Assets/Resources/PXR_PlatformSetting.asset"); + } + } + +#endif + } + + return instance; + } + + set { instance = value; } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/PXR_PlatformSetting.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/PXR_PlatformSetting.cs.meta new file mode 100644 index 0000000..1bac2ac --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/PXR_PlatformSetting.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 508edb944d24e574595a91425051a8e4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Runner.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Runner.cs new file mode 100644 index 0000000..d656a3d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Runner.cs @@ -0,0 +1,53 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using UnityEngine; + +namespace Pico.Platform.Framework +{ + public class Runner : MonoBehaviour + { + public static void RegisterGameObject() + { + var name = "Pico.Platform.Runner"; + GameObject g = GameObject.Find(name); + if (g == null) + { + g = new GameObject(name); + } + + if (g.GetComponent() == null) + { + g.AddComponent(); + } + } + + void Awake() + { + DontDestroyOnLoad(gameObject); + } + + void Update() + { + Looper.ProcessMessages(); + } + + void OnApplicationQuit() + { + Looper.Clear(); + if (Application.isEditor || Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor) + { + CLIB.ppf_PcUnInitialize(); + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Runner.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Runner.cs.meta new file mode 100644 index 0000000..91ea8f2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Runner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 995e5a6d1a26dd847ab40cf7d49cbe44 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Task.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Task.cs new file mode 100644 index 0000000..faac29c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Task.cs @@ -0,0 +1,97 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System.Threading.Tasks; +using UnityEngine; + +namespace Pico.Platform +{ + public class Task + { + public readonly ulong TaskId; + public bool HasSetCallback = false; + + public Task(ulong taskId) + { + this.TaskId = taskId; + } + + public Task OnComplete(Message.Handler handler) + { + if (handler == null) + { + throw new UnityException("call Task.Oncomplete with null handler."); + } + + if (HasSetCallback) + { + throw new UnityException("OnComplete() or Async() can call only once time."); + } + + HasSetCallback = true; + Looper.RegisterTaskHandler(TaskId, handler); + return this; + } + + public System.Threading.Tasks.Task Async() + { + if (HasSetCallback) + { + throw new UnityException("OnComplete() or Async() can call only once time."); + } + + HasSetCallback = true; + TaskCompletionSource x = new TaskCompletionSource(); + Message.Handler fun = msg => { x.SetResult(msg); }; + Looper.RegisterTaskHandler(this.TaskId, fun); + return x.Task; + } + } + + public class Task : Task + { + public Task(ulong taskId) : base(taskId) + { + } + + public Task OnComplete(Message.Handler handler) + { + if (handler == null) + { + throw new UnityException("call Task.Oncomplete with null handler."); + } + + if (HasSetCallback) + { + throw new UnityException("OnComplete() or Async() can call only once time."); + } + + HasSetCallback = true; + Looper.RegisterTaskHandler(TaskId, handler); + return this; + } + + public new System.Threading.Tasks.Task> Async() + { + if (HasSetCallback) + { + throw new UnityException("OnComplete() or Async() can call only once time."); + } + + HasSetCallback = true; + TaskCompletionSource> x = new TaskCompletionSource>(); + Message.Handler fun = msg => { x.SetResult(msg); }; + Looper.RegisterTaskHandler(this.TaskId, fun); + return x.Task; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Task.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Task.cs.meta new file mode 100644 index 0000000..4346caf --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/Task.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ef1d06cfc9dd85546b917ec0d259ff35 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/TimeUtil.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/TimeUtil.cs new file mode 100644 index 0000000..2d5d5d7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/TimeUtil.cs @@ -0,0 +1,51 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform +{ + public class TimeUtil + { + public static DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); + + public static int GetUtcSeconds() + { + return DateTimeToSeconds(DateTime.Now); + } + + public static long GetUtcMilliSeconds() + { + return DateTimeToMilliSeconds(DateTime.Now); + } + + public static int DateTimeToSeconds(DateTime t) + { + return (int) (t.ToUniversalTime() - UnixEpoch).TotalSeconds; + } + + public static long DateTimeToMilliSeconds(DateTime t) + { + return (long) (t.ToUniversalTime() - UnixEpoch).TotalMilliseconds; + } + + public static DateTime MilliSecondsToDateTime(long milliSeconds) + { + return UnixEpoch.AddMilliseconds(milliSeconds).ToLocalTime(); + } + + public static DateTime SecondsToDateTime(long seconds) + { + return UnixEpoch.AddSeconds(seconds).ToLocalTime(); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/TimeUtil.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/TimeUtil.cs.meta new file mode 100644 index 0000000..ef1abfb --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Framework/TimeUtil.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9526d9f6bdb74495807e3f0f81ca6b86 +timeCreated: 1659948411 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models.meta new file mode 100644 index 0000000..50ce4b5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b0d84e8a0a284315a65f4d42754492a4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Achievement.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Achievement.cs new file mode 100644 index 0000000..dc04bbd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Achievement.cs @@ -0,0 +1,182 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Runtime.InteropServices; + +namespace Pico.Platform.Models +{ + + /// Achievement update info. + public class AchievementUpdate + { + /// Whether the achievement is unlocked in this time. + public readonly bool JustUnlocked; + + /// Achievement name. + public readonly string Name; + + public AchievementUpdate(IntPtr o) + { + JustUnlocked = CLIB.ppf_AchievementUpdate_GetJustUnlocked(o); + Name = CLIB.ppf_AchievementUpdate_GetName(o); + } + } + + /// Achievement info. + public class AchievementDefinition + { + /// Achievement type. + public readonly AchievementType Type; + + /// Achievement name. + public readonly string Name; + + /// The target to reach for unlocking a bitfield achievement. + public readonly uint BitfieldLength; + + /// The target to reach for unlocking a count achievement. + public readonly long Target; + + /// Achievement description. + public readonly string Description; + + /// Achievement title. + public readonly string Title; + + /// Whether the achievement is archieved. + public readonly bool IsArchived; + + /// Whether the achievement is a secret achievement. If so, it can be visible after being unlocked only. + public readonly bool IsSecret; + + /// Achievement ID. + public readonly ulong ID; + + /// The description shown to users when unlocking the achievement. + public readonly string UnlockedDescription; + + /// The write policy of the achievement. + public readonly AchievementWritePolicy WritePolicy; + + /// The URL of the image displayed when the achievement is still locked. + public readonly string LockedImageURL; + + /// The URL of the image displayed when the achievement is unlocked. + public readonly string UnlockedImageURL; + + public AchievementDefinition(IntPtr o) + { + Type = CLIB.ppf_AchievementDefinition_GetType(o); + Name = CLIB.ppf_AchievementDefinition_GetName(o); + BitfieldLength = CLIB.ppf_AchievementDefinition_GetBitfieldLength(o); + Target = CLIB.ppf_AchievementDefinition_GetTarget(o); + Description = CLIB.ppf_AchievementDefinition_GetDescription(o); + Title = CLIB.ppf_AchievementDefinition_GetTitle(o); + IsArchived = CLIB.ppf_AchievementDefinition_IsArchived(o); + IsSecret = CLIB.ppf_AchievementDefinition_IsSecret(o); + ID = CLIB.ppf_AchievementDefinition_GetID(o); + UnlockedDescription = CLIB.ppf_AchievementDefinition_GetUnlockedDescription(o); + WritePolicy = CLIB.ppf_AchievementDefinition_GetWritePolicy(o); + LockedImageURL = CLIB.ppf_AchievementDefinition_GetLockedImageURL(o); + UnlockedImageURL = CLIB.ppf_AchievementDefinition_GetUnlockedImageURL(o); + } + } + + /// Achievement definition list. + /// Each element is \ref AchievementDefinition. + /// + public class AchievementDefinitionList : MessageArray + { + /// The total number of `AchievementDefinition`. + public readonly ulong TotalSize; + + public AchievementDefinitionList(IntPtr a) + { + TotalSize = (ulong) CLIB.ppf_AchievementDefinitionArray_GetTotalSize(a); + var count = (int) CLIB.ppf_AchievementDefinitionArray_GetSize(a); + this.Capacity = count; + for (uint i = 0; i < count; i++) + { + this.Add(new AchievementDefinition(CLIB.ppf_AchievementDefinitionArray_GetElement(a, (UIntPtr) i))); + } + + NextPageParam = CLIB.ppf_AchievementDefinitionArray_HasNextPage(a) ? "true" : string.Empty; + } + } + + /// Achievement progress info. + public class AchievementProgress + { + /// Achievement ID. + public readonly ulong ID; + + /// The progress of a bitfield achievement. `1` represents a completed bit. + public readonly string Bitfield; + + /// The progress of a count achievement. + public readonly long Count; + + /// Whether the achievement is unlocked + public readonly bool IsUnlocked; + + /// Achievement name. + public readonly string Name; + + /// The time when the achievement is unlocked. + public readonly DateTime UnlockTime; + + /// Additional info, no more than 2KB. + public readonly byte[] ExtraData; + + + public AchievementProgress(IntPtr o) + { + ID = CLIB.ppf_AchievementProgress_GetID(o); + Bitfield = CLIB.ppf_AchievementProgress_GetBitfield(o); + Count = CLIB.ppf_AchievementProgress_GetCount(o); + IsUnlocked = CLIB.ppf_AchievementProgress_GetIsUnlocked(o); + Name = CLIB.ppf_AchievementProgress_GetName(o); + + uint size = CLIB.ppf_AchievementProgress_GetExtraDataLength(o); + ExtraData = new byte[size]; + Marshal.Copy(CLIB.ppf_AchievementProgress_GetExtraData(o), ExtraData, 0, (int) size); + var unlockTime = CLIB.ppf_AchievementProgress_GetUnlockTime(o); + if (unlockTime != 0) + { + UnlockTime = TimeUtil.SecondsToDateTime((long) unlockTime); + } + } + } + + /// The list of achievements with their progress info. + /// Each element is \ref AchievementProgress. + /// + public class AchievementProgressList : MessageArray + { + /// The total number of achievements with progress info. + public readonly ulong TotalSize; + + public AchievementProgressList(IntPtr a) + { + TotalSize = (ulong) CLIB.ppf_AchievementProgressArray_GetTotalSize(a); + var count = (int) CLIB.ppf_AchievementProgressArray_GetSize(a); + this.Capacity = count; + for (uint i = 0; i < count; i++) + { + this.Add(new AchievementProgress(CLIB.ppf_AchievementProgressArray_GetElement(a, (UIntPtr) i))); + } + + NextPageParam = CLIB.ppf_AchievementProgressArray_HasNextPage(a) ? "true" : string.Empty; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Achievement.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Achievement.cs.meta new file mode 100644 index 0000000..66734d0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Achievement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d92845d996c24a5e858d06fe078a5997 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Application.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Application.cs new file mode 100644 index 0000000..a09d224 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Application.cs @@ -0,0 +1,133 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + /// App launch details. + public class LaunchDetails + { + /// How the app was launched: + /// * `Normal`: launched by clicking the app's icon + /// * `RoomInvite`: launched by clicking the room invitation message card + /// * `Deeplink`: launched by clicking the presence invitation message card or calling \ref ApplicationService.LaunchApp + /// * `ChallengeInvite`: launched by clicking the challenge invitation message card + /// + public readonly LaunchType LaunchType; + + /// Deeplink message. You can pass a deeplink when you call \ref ApplicationService.LaunchApp, + /// and the other app will receive the deeplink.This field will have a value only when `LaunchType` is `LaunchApp`. + public readonly string DeeplinkMessage; + + /// Destination API name configured on the PICO Developer Platform.For a presence invitation, the inviters' + /// presence data will contain this field which will be passed when the invitee clicks on the message card. + public readonly string DestinationApiName; + + /// The lobby session ID that identifies a group or team. + /// For a presence invitation, the inviters' presence data will contain this field which will be passed + /// when the invitee clicks on the message card. + public readonly string LobbySessionID; + + /// The match session ID that identifies a competition. + /// For a presence invitation, the inviters' presence data will contain this field which will be passed when the invitee clicks on the message card. + public readonly string MatchSessionID; + + /** The customized extra presence info. + * For a presence invitation, the inviters' presence data will contain this field which will be passed when the invitee clicks on the message card. + * You can use this field to add self-defined presence data. The data size cannot exceed 2MB. + */ + public readonly string Extra; + + /// Room ID.For a room invitation, after calling \ref RoomService.InviteUser, this field will be passed when the invitee clicks on the message card. + public readonly UInt64 RoomID; + + /// For a challenge invitation, after calling \ref ChallengesService.Invite, this field will be passed when the invitee clicks on the message card. + public readonly UInt64 ChallengeID; + + /// Tracking ID. + public readonly string TrackingID; + + public LaunchDetails(IntPtr o) + { + DeeplinkMessage = CLIB.ppf_LaunchDetails_GetDeeplinkMessage(o); + DestinationApiName = CLIB.ppf_LaunchDetails_GetDestinationApiName(o); + LobbySessionID = CLIB.ppf_LaunchDetails_GetLobbySessionID(o); + MatchSessionID = CLIB.ppf_LaunchDetails_GetMatchSessionID(o); + Extra = CLIB.ppf_LaunchDetails_GetExtra(o); + RoomID = CLIB.ppf_LaunchDetails_GetRoomID(o); + ChallengeID = CLIB.ppf_LaunchDetails_GetChallengeID(o); + TrackingID = CLIB.ppf_LaunchDetails_GetTrackingID(o); + LaunchType = CLIB.ppf_LaunchDetails_GetLaunchType(o); + } + } + + /// + /// The system information of the device. + /// + public class SystemInfo + { + /** The current ROM version (i.e., system version) of the device, such as "5.5.0" and "5.6.0".*/ + public readonly string ROMVersion; + + /** The locale of the device. Locale is combined with language and country code. Such as "zh-CN" and "en-US".*/ + public readonly string Locale; + + /** The product name of the device, such as "PICO 4".*/ + public readonly string ProductName; + + /** Whether the device's ROM is CN version. PICO provides different ROM versions in different countries/regions.*/ + public readonly bool IsCnDevice; + + /** The Matrix's version name. Matrix is a system app which provides system functions for platform services.*/ + public readonly string MatrixVersionName; + + /** The Matrix's version code. */ + public readonly long MatrixVersionCode; + + public SystemInfo(IntPtr o) + { + ROMVersion = CLIB.ppf_SystemInfo_GetROMVersion(o); + Locale = CLIB.ppf_SystemInfo_GetLocale(o); + ProductName = CLIB.ppf_SystemInfo_GetProductName(o); + IsCnDevice = CLIB.ppf_SystemInfo_GetIsCnDevice(o); + MatrixVersionName = CLIB.ppf_SystemInfo_GetMatrixVersionName(o); + MatrixVersionCode = CLIB.ppf_SystemInfo_GetMatrixVersionCode(o); + } + } + + /// + /// App's version info. + /// + public class ApplicationVersion + { + /// The current version code of the installed app. + public readonly long CurrentCode; + + /// The current version name of the installed app. + public readonly string CurrentName; + + /// The latest version code of the app in the PICO Store. + public readonly long LatestCode; + + /// The latest version name of the app in the PICO Store. + public readonly string LatestName; + + public ApplicationVersion(IntPtr o) + { + CurrentCode = CLIB.ppf_ApplicationVersion_GetCurrentCode(o); + CurrentName = CLIB.ppf_ApplicationVersion_GetCurrentName(o); + LatestCode = CLIB.ppf_ApplicationVersion_GetLatestCode(o); + LatestName = CLIB.ppf_ApplicationVersion_GetLatestName(o); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Application.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Application.cs.meta new file mode 100644 index 0000000..d36f34e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Application.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 821a71a2140642259ab07bb49f9ae2c0 +timeCreated: 1665579240 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/AssetFile.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/AssetFile.cs new file mode 100644 index 0000000..8fe75e7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/AssetFile.cs @@ -0,0 +1,258 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + public static class DownloadStatus + { + public const string Downloaded = "downloaded"; + public const string Available = "available"; + public const string InProgress = "in-progress"; + } + + /// + /// Constants indicates whether the user purchased the in-app product. + /// + public static class IapStatus + { + /// Purchased + public const string Entitled = "entitled"; + + /// Not purchased. + public const string NotEntitled = "not-entitled"; + } + + /// Indicates where the DLC file is displayed. + public static class AssetType + { + /// The DLC file is displayed in the PICO Store and the app. + public const string Store = "store"; + + /// The DLC file is displayed in the app only. + public const string Default = "default"; + } + + public class AssetDetails + { + /// The unique identifier of DLC file. + public ulong AssetId; + + /** Some DLC files can be displayed in the PICO Store. Now it has two values: `default` or `store`. + * You can refer to \ref AssetType for details. + */ + public string AssetType; + + /// One of `downloaded`, `available`, and `in-progress`. You can refer to \ref DownloadStatus for details. + public string DownloadStatus; + + /// The path to the downloaded DLC file. For a non-downloaded DLC file, this field will be empty. + public string Filepath; + + /// The meta info of the DLC file. + public string Metadata; + + /// The name of the DLC file. + public string Filename; + + /// The version of the DLC file. + public int Version; + + /// One of `entitled`, `not-entitled`. You can refer to \ref IapStatus for details. + public string IapStatus; + + /// The SKU of the in-app product that the DLC file associated with. + public string IapSku; + + /// The name of the in-app product that the DLC fiel associated with. + public string IapName; + + /// The price of this DLC file. + public string IapPrice; + + /// The currency required for purchasing the DLC file. + public string IapCurrency; + + /// The description of the in-app product that the DLC file associated with. + public string IapDescription; + + /// The icon of the in-app product that the DLC file associated with. + public string IapIcon; + + public AssetDetails(IntPtr o) + { + AssetId = CLIB.ppf_AssetDetails_GetAssetId(o); + AssetType = CLIB.ppf_AssetDetails_GetAssetType(o); + DownloadStatus = CLIB.ppf_AssetDetails_GetDownloadStatus(o); + IapStatus = CLIB.ppf_AssetDetails_GetIapStatus(o); + Filepath = CLIB.ppf_AssetDetails_GetFilepath(o); + Metadata = CLIB.ppf_AssetDetails_GetMetadata(o); + Filename = CLIB.ppf_AssetDetails_GetFilename(o); + Version = CLIB.ppf_AssetDetails_GetVersion(o); + IapSku = CLIB.ppf_AssetDetails_GetIapSku(o); + IapName = CLIB.ppf_AssetDetails_GetIapName(o); + IapPrice = CLIB.ppf_AssetDetails_GetIapPrice(o); + IapCurrency = CLIB.ppf_AssetDetails_GetIapCurrency(o); + IapDescription = CLIB.ppf_AssetDetails_GetIapDescription(o); + IapIcon = CLIB.ppf_AssetDetails_GetIapIcon(o); + } + } + + /// + /// Each element is \ref AssetDetails + /// + public class AssetDetailsList : MessageArray + { + public AssetDetailsList(IntPtr a) + { + var count = (int) CLIB.ppf_AssetDetailsArray_GetSize(a); + this.Capacity = count; + for (int i = 0; i < count; i++) + { + this.Add(new AssetDetails(CLIB.ppf_AssetDetailsArray_GetElement(a, (UIntPtr) i))); + } + + NextPageParam = CLIB.ppf_AssetDetailsArray_GetNextPageParam(a); + } + } + + /// + /// If the downloaded DLC file is different from the original one, + /// the DLC file will be automatically removed, and the app will receive a notification. + /// + public class AssetFileDeleteForSafety + { + /// The ID of the DLC file. + public readonly ulong AssetId; + + /// The description for why this asset file is deleted. + public readonly string Reason; + + public AssetFileDeleteForSafety(IntPtr o) + { + AssetId = CLIB.ppf_AssetFileDeleteForSafety_GetAssetId(o); + Reason = CLIB.ppf_AssetFileDeleteForSafety_GetReason(o); + } + } + + /// + /// The callback for \ref AssetFileService.DeleteById and \ref AssetFileService.DeleteByName. + /// + public class AssetFileDeleteResult + { + /// The path to the DLC file. + public readonly string Filepath; + + /// Whether the DLC file is deleted successfully. + public readonly bool Success; + + /// The ID of the DLC file. + public readonly ulong AssetId; + + public AssetFileDeleteResult(IntPtr o) + { + Filepath = CLIB.ppf_AssetFileDeleteResult_GetFilepath(o); + Success = CLIB.ppf_AssetFileDeleteResult_GetSuccess(o); + AssetId = CLIB.ppf_AssetFileDeleteResult_GetAssetId(o); + } + } + + /// Indicates whether the download of the DLC file is successfully canceled. + public class AssetFileDownloadCancelResult + { + /// The path to the DLC file. + public readonly string Filepath; + + /// Whether the download is successfully canceled. + public readonly bool Success; + + /// The ID of the DLC file. + public readonly ulong AssetId; + + public AssetFileDownloadCancelResult(IntPtr o) + { + Filepath = CLIB.ppf_AssetFileDownloadCancelResult_GetFilepath(o); + Success = CLIB.ppf_AssetFileDownloadCancelResult_GetSuccess(o); + AssetId = CLIB.ppf_AssetFileDownloadCancelResult_GetAssetId(o); + } + } + + /// The result returned after calling \ref AssetFileService.DownloadById or \ref AssetFileService.DownloadByName. + public class AssetFileDownloadResult + { + /// The ID of the DLC file. + public readonly ulong AssetId; + + /// The path to the DLC file. + public readonly string Filepath; + + public AssetFileDownloadResult(IntPtr o) + { + AssetId = CLIB.ppf_AssetFileDownloadResult_GetAssetId(o); + Filepath = CLIB.ppf_AssetFileDownloadResult_GetFilepath(o); + } + } + + /// + /// You will receive this message periodically once you call \ref AssetFileService.DownloadById + /// or \ref AssetFileService.DownloadByName. + /// + public class AssetFileDownloadUpdate + { + /// The ID of the DLC file. + public readonly ulong AssetId; + + /// The total bytes of the DLC file. + public readonly ulong BytesTotal; + + /// The transferred bytes of the DLC file. + public readonly long BytesTransferred; + + /// The download status of the DLC file. + public readonly AssetFileDownloadCompleteStatus CompleteStatus; + + public AssetFileDownloadUpdate(IntPtr o) + { + AssetId = CLIB.ppf_AssetFileDownloadUpdate_GetAssetId(o); + BytesTotal = CLIB.ppf_AssetFileDownloadUpdate_GetBytesTotal(o); + BytesTransferred = CLIB.ppf_AssetFileDownloadUpdate_GetBytesTransferred(o); + CompleteStatus = CLIB.ppf_AssetFileDownloadUpdate_GetCompleteStatus(o); + } + } + + /// + /// The callback for \ref AssetFileService.StatusById or \ref AssetFileService.StatusByName. + /// + public class AssetStatus + { + /// The ID of the DLC file. + public readonly ulong AssetId; + + /// The name of the DLC file. + public readonly string Filename; + + /// The path to the DLC file. + public readonly string Filepath; + + /// The download status of the DLC file. You can refer to \ref DownloadStatus for details. + public readonly string DownloadStatus; + + public AssetStatus(IntPtr o) + { + AssetId = CLIB.ppf_AssetStatus_GetAssetId(o); + Filename = CLIB.ppf_AssetStatus_GetFilename(o); + Filepath = CLIB.ppf_AssetStatus_GetFilepath(o); + DownloadStatus = CLIB.ppf_AssetStatus_GetDownloadStatus(o); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/AssetFile.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/AssetFile.cs.meta new file mode 100644 index 0000000..58320c2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/AssetFile.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fa00ebe2dc4b4ccab93a18d008dece77 +timeCreated: 1661769967 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Challenge.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Challenge.cs new file mode 100644 index 0000000..57efadf --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Challenge.cs @@ -0,0 +1,268 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using UnityEngine; + +namespace Pico.Platform.Models +{ + /// Challenge setting options. + public class ChallengeOptions + { + /// For creating challenge options + public ChallengeOptions() + { + Handle = CLIB.ppf_ChallengeOptions_Create(); + } + + /// Set the end date. Currently, not used. + public void SetEndDate(DateTime value) + { + CLIB.ppf_ChallengeOptions_SetEndDate(Handle, Convert.ToUInt64(TimeUtil.DateTimeToSeconds(value))); + } + + /// Set whether to get active challenges. + public void SetIncludeActiveChallenges(bool value) + { + CLIB.ppf_ChallengeOptions_SetIncludeActiveChallenges(Handle, value); + } + + /// Set whether to get future challenges whose start dates are latter than the current time. + public void SetIncludeFutureChallenges(bool value) + { + CLIB.ppf_ChallengeOptions_SetIncludeFutureChallenges(Handle, value); + } + + /// Set whether to get past challenges whose end dates are earlier than the current time. + public void SetIncludePastChallenges(bool value) + { + CLIB.ppf_ChallengeOptions_SetIncludePastChallenges(Handle, value); + } + + /// (Optional) Set the name of the leaderboard that the challenges associated with. + public void SetLeaderboardName(string value) + { + CLIB.ppf_ChallengeOptions_SetLeaderboardName(Handle, value); + } + + /// Set the start date. Currently, not used. + public void SetStartDate(DateTime value) + { + CLIB.ppf_ChallengeOptions_SetStartDate(Handle, Convert.ToUInt64(TimeUtil.DateTimeToSeconds(value))); + } + + /// Set the challenge title. Currently, not used. + public void SetTitle(string value) + { + CLIB.ppf_ChallengeOptions_SetTitle(Handle, value); + } + + /// Set the filter for quering specified challenges. + public void SetViewerFilter(ChallengeViewerFilter value) + { + CLIB.ppf_ChallengeOptions_SetViewerFilter(Handle, value); + } + + /// Set to get the challenges of a specific visibility type. + public void SetVisibility(ChallengeVisibility value) + { + CLIB.ppf_ChallengeOptions_SetVisibility(Handle, value); + } + + public static explicit operator IntPtr(ChallengeOptions options) + { + return options != null ? options.Handle : IntPtr.Zero; + } + + ~ChallengeOptions() + { + CLIB.ppf_ChallengeOptions_Destroy(Handle); + } + + IntPtr Handle; + + public IntPtr GetHandle() + { + return Handle; + } + } + + /// Challenge info. + public class Challenge + { + /// The creator of the challenge. + public readonly ChallengeCreationType CreationType; + + /// Challenge ID + public readonly UInt64 ID; + + /// Challenge's start date. + public readonly DateTime StartDate; + + /// Challenge's end date. + public readonly DateTime EndDate; + + /// Participants of the challenge, which might be null. Should check if it is null before use. + public readonly UserList ParticipantsOptional; + + /// Users invited to the challenge, which might be null. Should check if it is null before use. + public readonly UserList InvitedUsersOptional; + + /// The info about the leaderboard that the challenge associated with. + public readonly Leaderboard Leaderboard; + + /// Challenge's title. + public readonly string Title; + + /// Challenge's visibility. + public readonly ChallengeVisibility Visibility; + + + public Challenge(IntPtr o) + { + CreationType = CLIB.ppf_Challenge_GetCreationType(o); + + try + { + EndDate = TimeUtil.SecondsToDateTime((long) CLIB.ppf_Challenge_GetEndDate(o)); + } + catch (Exception e) + { + Debug.LogWarning($"Challenge Set EndDate: ppf_Challenge_GetEndDate(o) = {CLIB.ppf_Challenge_GetEndDate(o)}, Exception: {e}"); + } + + ID = CLIB.ppf_Challenge_GetID(o); + { + var pointer = CLIB.ppf_Challenge_GetInvitedUsers(o); + if (pointer == IntPtr.Zero) + { + InvitedUsersOptional = null; + } + else + { + InvitedUsersOptional = new UserList(pointer); + } + } + Leaderboard = new Leaderboard(CLIB.ppf_Challenge_GetLeaderboard(o)); + { + var pointer = CLIB.ppf_Challenge_GetParticipants(o); + if (pointer == IntPtr.Zero) + { + ParticipantsOptional = null; + } + else + { + ParticipantsOptional = new UserList(pointer); + } + } + try + { + StartDate = TimeUtil.SecondsToDateTime((long) CLIB.ppf_Challenge_GetStartDate(o)); + } + catch (Exception e) + { + Debug.LogWarning($"Challenge Set StartDate: ppf_Challenge_GetStartDate(o) = {CLIB.ppf_Challenge_GetStartDate(o)}, Exception: {e}"); + } + + Title = CLIB.ppf_Challenge_GetTitle(o); + Visibility = CLIB.ppf_Challenge_GetVisibility(o); + } + } + + /// Challenge list. Each Element is \ref Challenge. + public class ChallengeList : MessageArray + { + public ChallengeList(IntPtr a) + { + TotalCount = CLIB.ppf_ChallengeArray_GetTotalCount(a); + NextPageParam = CLIB.ppf_ChallengeArray_HasNextPage(a) ? "true" : string.Empty; + PreviousPageParam = CLIB.ppf_ChallengeArray_HasPreviousPage(a) ? "true" : String.Empty; + int count = (int) CLIB.ppf_ChallengeArray_GetSize(a); + this.Capacity = count; + for (uint i = 0; i < count; i++) + { + this.Add(new Challenge(CLIB.ppf_ChallengeArray_GetElement(a, (UIntPtr) i))); + } + } + + /// The total number of challenges in the list. + public readonly ulong TotalCount; + } + + /// Challenge entry info. + public class ChallengeEntry + { + /// The entry's display score. + public readonly string DisplayScore; + + /// The entry's additional info, no more than 2KB. + public readonly byte[] ExtraData; + + /// The ID of the challenge that the entry belongs to. + public readonly UInt64 ID; + + /// The rank of the entry. + public readonly int Rank; + + /// The score of the entry. + public readonly long Score; + + /// The time when the entry was written. + public readonly DateTime Timestamp; + + /// The user the entry belongs to. + public readonly User User; + + + public ChallengeEntry(IntPtr o) + { + DisplayScore = CLIB.ppf_ChallengeEntry_GetDisplayScore(o); + var extraDataPtr = CLIB.ppf_ChallengeEntry_GetExtraData(o); + var extraDataSize = CLIB.ppf_ChallengeEntry_GetExtraDataLength(o); + ExtraData = MarshalUtil.ByteArrayFromNative(extraDataPtr, extraDataSize); + ID = CLIB.ppf_ChallengeEntry_GetID(o); + Rank = CLIB.ppf_ChallengeEntry_GetRank(o); + Score = CLIB.ppf_ChallengeEntry_GetScore(o); + + try + { + Timestamp = TimeUtil.SecondsToDateTime((long) CLIB.ppf_ChallengeEntry_GetTimestamp(o)); + } + catch (Exception e) + { + Debug.LogWarning($"ChallengeEntry Set Timestamp: ppf_ChallengeEntry_GetTimestamp(o) = {CLIB.ppf_ChallengeEntry_GetTimestamp(o)}, Exception: {e}"); + } + + User = new User(CLIB.ppf_ChallengeEntry_GetUser(o)); + } + } + + /// Challenge entry list. Each element is \ref ChallengeEntry. + public class ChallengeEntryList : MessageArray + { + public ChallengeEntryList(IntPtr a) + { + TotalCount = CLIB.ppf_ChallengeEntryArray_GetTotalCount(a); + NextPageParam = CLIB.ppf_ChallengeEntryArray_HasNextPage(a) ? "true" : string.Empty; + PreviousPageParam = CLIB.ppf_ChallengeEntryArray_HasPreviousPage(a) ? "true" : string.Empty; + int count = (int) CLIB.ppf_ChallengeEntryArray_GetSize(a); + this.Capacity = count; + for (uint i = 0; i < count; i++) + { + this.Add(new ChallengeEntry(CLIB.ppf_ChallengeEntryArray_GetElement(a, (UIntPtr) i))); + } + } + + /// The total number of entries in the list. + public readonly ulong TotalCount; + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Challenge.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Challenge.cs.meta new file mode 100644 index 0000000..23e23bb --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Challenge.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e107cf0bdc434409aaf2cf952cc37436 +timeCreated: 1664352647 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Common.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Common.cs new file mode 100644 index 0000000..0b8309d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Common.cs @@ -0,0 +1,115 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + public class KVPairArray + { + public uint Size { get; private set; } + IntPtr Handle; + + public IntPtr GetHandle() + { + return Handle; + } + + public KVPairArray(uint size) + { + Size = size; + Handle = CLIB.ppf_KeyValuePairArray_Create((UIntPtr) size); + } + + ~KVPairArray() + { + CLIB.ppf_KeyValuePairArray_Destroy(Handle); + Handle = IntPtr.Zero; + } + + public KVPair GetElement(uint index) + { + return new KVPair(CLIB.ppf_KeyValuePairArray_GetElement(Handle, (UIntPtr) index)); + } + } + + public class KVPair + { + IntPtr Handle; + bool destroyable = true; + + public KVPair() + { + Handle = CLIB.ppf_KeyValuePair_Create(); + } + + public KVPair(IntPtr o) + { + Handle = o; + destroyable = false; + } + + public void SetIntValue(int value) + { + CLIB.ppf_KeyValuePair_SetIntValue(Handle, value); + } + + public void SetStringValue(string value) + { + CLIB.ppf_KeyValuePair_SetStringValue(Handle, value); + } + + public void SetDoubleValue(double value) + { + CLIB.ppf_KeyValuePair_SetDoubleValue(Handle, value); + } + + public int GetIntValue() + { + return CLIB.ppf_KeyValuePair_GetIntValue(Handle); + } + + public string GetStringValue() + { + return CLIB.ppf_KeyValuePair_GetStringValue(Handle); + } + + public double GetDoubleValue() + { + return CLIB.ppf_KeyValuePair_GetDoubleValue(Handle); + } + + public void SetKey(string key) + { + CLIB.ppf_KeyValuePair_SetKey(Handle, key); + } + + public string GetKey() + { + return CLIB.ppf_KeyValuePair_GetKey(Handle); + } + + public KVPairType GetValueType() + { + return (KVPairType) CLIB.ppf_KeyValuePair_GetValueType(Handle); + } + + ~KVPair() + { + if (destroyable) + { + CLIB.ppf_KeyValuePair_Destroy(Handle); + Handle = IntPtr.Zero; + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Common.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Common.cs.meta new file mode 100644 index 0000000..ddd79e5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Common.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: af96c3f14f761724db9f93a693fbad2e +timeCreated: 1523486800 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Compliance.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Compliance.cs new file mode 100644 index 0000000..b431344 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Compliance.cs @@ -0,0 +1,31 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + public class DetectSensitiveResult + { + /// The filtered text is a string which replace sensitive words with `*`. + public readonly string FilteredText; + + /// The proposed strategy to handle user operation. + public readonly SensitiveProposal Proposal; + + public DetectSensitiveResult(IntPtr o) + { + FilteredText = CLIB.ppf_DetectSensitiveResult_GetFilteredText(o); + Proposal = CLIB.ppf_DetectSensitiveResult_GetProposal(o); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Compliance.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Compliance.cs.meta new file mode 100644 index 0000000..5fa1256 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Compliance.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3b2e5ad6aabe48df833647b8ce43f0b3 +timeCreated: 1679567051 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Highlight.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Highlight.cs new file mode 100644 index 0000000..b677521 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Highlight.cs @@ -0,0 +1,110 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + /// + /// Information about screen capturing. + /// + public class CaptureInfo + { + /// + /// The path where the image is located. + /// + public readonly string ImagePath; + /// + /// The ID of the screen-capturing task. + /// + public readonly string JobId; + + public CaptureInfo(IntPtr o) + { + ImagePath = CLIB.ppf_CaptureInfo_GetImagePath(o); + JobId = CLIB.ppf_CaptureInfo_GetJobId(o); + } + } + + + /// + /// Information about screen recording. + /// + public class RecordInfo + { + /// + /// The path where the video is located. + /// + public readonly string VideoPath; + /// + /// The duration of the video. Unit: milliseconds. + /// + public readonly int DurationInMilliSeconds; + /// + /// The width of the video. + /// + public readonly int Width; + /// + /// The height of the video. + /// + public readonly int Height; + /// + /// The ID of the screen-recording task. + /// + public readonly string JobId; + + public RecordInfo(IntPtr o) + { + VideoPath = CLIB.ppf_RecordInfo_GetVideoPath(o); + DurationInMilliSeconds = CLIB.ppf_RecordInfo_GetDurationInMilliSeconds(o); + Width = CLIB.ppf_RecordInfo_GetWidth(o); + Height = CLIB.ppf_RecordInfo_GetHeight(o); + JobId = CLIB.ppf_RecordInfo_GetJobId(o); + } + } + + + /// + /// Information about the images captured and videos recorded in a session. + /// + public class SessionMedia + { + /// + /// Image information, including image paths and job IDs. + /// + public readonly CaptureInfo[] Images; + /// + /// Video information, including video paths, video durations, video sizes, and job IDs. + /// + public readonly RecordInfo[] Videos; + + public SessionMedia(IntPtr o) + { + { + int sz = (int) CLIB.ppf_SessionMedia_GetImagesSize(o); + Images = new CaptureInfo[sz]; + for (int i = 0; i < sz; i++) + { + Images[i] = new CaptureInfo(CLIB.ppf_SessionMedia_GetImages(o, (UIntPtr) i)); + } + } + { + int sz = (int) CLIB.ppf_SessionMedia_GetVideosSize(o); + Videos = new RecordInfo[sz]; + for (int i = 0; i < sz; i++) + { + Videos[i] = new RecordInfo(CLIB.ppf_SessionMedia_GetVideos(o, (UIntPtr) i)); + } + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Highlight.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Highlight.cs.meta new file mode 100644 index 0000000..665cab8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Highlight.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6effacd11a404d7983207e0418286b47 +timeCreated: 1686138789 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/IAP.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/IAP.cs new file mode 100644 index 0000000..6314558 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/IAP.cs @@ -0,0 +1,225 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + /// + /// The add-on that can be purchased in the app. + /// + /// You can create in-app products on the PICO Developer Platform. + /// + public class Product + { + /// The description of the add-on. + public readonly string Description; + + /// The detailed description of the add-on. + public readonly string DetailDescription; + + /// The price of the add-on, which is a number string. + public readonly string Price; + + /// The currency required for purchasing the add-on. + public readonly string Currency; + + /// The name of the add-on. + public readonly string Name; + + /// The unique identifier of the add-on. + public readonly string SKU; + + /// The icon of the add-on, which is an image URL. + public readonly string Icon; + + /// The type of the add-on + public readonly AddonsType AddonsType; + + /// The period type for the subscription add-on. Only valid when it's a subscription add-on. + public readonly PeriodType PeriodType; + + /// The trial period unit for the subscription add-on. Only valid when it's a subscription add-on. + public readonly PeriodType TrialPeriodUnit; + + /// The trial period value for the subscription add-on. Only valid when it's a subscription add-on. + public readonly int TrialPeriodValue; + + /// The original price of the add-on, which means the price without discount. + public readonly string OriginalPrice; + + /// The order ID of the subscription. Only valid when it's a subscription add-on. + public readonly string OuterId; + + /// Whether the subscription is auto renewed. Only valid when it's a subscription add-on. + public readonly bool IsContinuous; + + public Product(IntPtr o) + { + Description = CLIB.ppf_Product_GetDescription(o); + DetailDescription = CLIB.ppf_Product_GetDetailDescription(o); + Price = CLIB.ppf_Product_GetPrice(o); + Currency = CLIB.ppf_Product_GetCurrency(o); + Name = CLIB.ppf_Product_GetName(o); + SKU = CLIB.ppf_Product_GetSKU(o); + Icon = CLIB.ppf_Product_GetIcon(o); + AddonsType = CLIB.ppf_Product_GetAddonsType(o); + PeriodType = CLIB.ppf_Product_GetPeriodType(o); + TrialPeriodUnit = CLIB.ppf_Product_GetTrialPeriodUnit(o); + TrialPeriodValue = CLIB.ppf_Product_GetTrialPeriodValue(o); + OuterId = CLIB.ppf_Product_GetOuterId(o); + OriginalPrice = CLIB.ppf_Product_GetOriginalPrice(o); + IsContinuous = CLIB.ppf_Product_IsContinuous(o); + } + } + + /// + /// Each element is \ref Product. + /// + public class ProductList : MessageArray + { + public ProductList(IntPtr a) + { + var count = (int) CLIB.ppf_ProductArray_GetSize(a); + this.Capacity = count; + for (int i = 0; i < count; i++) + { + this.Add(new Product(CLIB.ppf_ProductArray_GetElement(a, (UIntPtr) i))); + } + + NextPageParam = CLIB.ppf_ProductArray_GetNextPageParam(a); + } + } + + + /// + /// The add-on that the current user has purchased. + /// + public class Purchase + { + /// The expiration time. Only valid when it's a subscription add-on. + public readonly DateTime ExpirationTime; + + /// The grant time. Only valid when it's a subscription add-on. + public readonly DateTime GrantTime; + + /// The ID of the purchase order. + public readonly string ID; + + /// The unique identifier of the add-on in the purchase order. + public readonly string SKU; + + /// The icon of the add-on. + public readonly string Icon; + + /// The type of the purchased add-on. + public readonly AddonsType AddonsType; + + /// The order ID of the subscription. Only valid when it's a subscription add-on. + public readonly string OuterId; + + /// The current period type of subscription. Only valid when it's a subscription add-on. + public readonly PeriodType CurrentPeriodType; + + /// The next period type of subscription. Only valid when it's a subscription add-on. + public readonly PeriodType NextPeriodType; + + /// The next pay time of subscription. Only valid when it's a subscription add-on. + public readonly DateTime NextPayTime; + + /// The discount info of the purchase. + public readonly DiscountType DiscountType; + + /// The comment for the order. Developers can add order comment to a purchase. See also: \ref IAPService.LaunchCheckoutFlow3 + public readonly string OrderComment; + + public Purchase(IntPtr o) + { + ExpirationTime = TimeUtil.MilliSecondsToDateTime(CLIB.ppf_Purchase_GetExpirationTime(o)); + GrantTime = TimeUtil.MilliSecondsToDateTime(CLIB.ppf_Purchase_GetGrantTime(o)); + ID = CLIB.ppf_Purchase_GetID(o); + SKU = CLIB.ppf_Purchase_GetSKU(o); + Icon = CLIB.ppf_Purchase_GetIcon(o); + AddonsType = CLIB.ppf_Purchase_GetAddonsType(o); + OuterId = CLIB.ppf_Purchase_GetOuterId(o); + CurrentPeriodType = CLIB.ppf_Purchase_GetCurrentPeriodType(o); + NextPeriodType = CLIB.ppf_Purchase_GetNextPeriodType(o); + NextPayTime = TimeUtil.MilliSecondsToDateTime(CLIB.ppf_Purchase_GetNextPayTime(o)); + DiscountType = CLIB.ppf_Purchase_GetDiscountType(o); + OrderComment = CLIB.ppf_Purchase_GetOrderComment(o); + } + } + + /// + /// Each element is \ref Purchase. + /// + public class PurchaseList : MessageArray + { + public PurchaseList(IntPtr a) + { + var count = (int) CLIB.ppf_PurchaseArray_GetSize(a); + this.Capacity = count; + for (int i = 0; i < count; i++) + { + this.Add(new Purchase(CLIB.ppf_PurchaseArray_GetElement(a, (UIntPtr) i))); + } + + NextPageParam = CLIB.ppf_PurchaseArray_GetNextPageParam(a); + } + } + + /// + /// \ref IAPService.GetSubscriptionStatus returns the subscription status of a subscription add-on. + /// + public class SubscriptionStatus + { + /// The SKU of the add-on. SKU is the add-on's unique identifier. + public readonly string SKU; + + /// The order ID of the subscription. Only valid when it's a subscription add-on. + public readonly string OuterId; + + /// The start time of the subscription. + public readonly DateTime StartTime; + + /// The end time of the subscription. + public readonly DateTime EndTime; + + /// The period type of the subscription. + public readonly PeriodType PeriodType; + + /// The entitlement status of the add-on, which indicates whether the user is entitled to use the add-on. + public readonly EntitlementStatus EntitlementStatus; + + /// If `EntitlementStatus` is `Cancel`, `CancelReason` indicates why the subscription has been canceled. + public readonly CancelReason CancelReason; + + /// Whether the subscription is in free trial. + public readonly bool IsFreeTrial; + + /// The next period of the subscription. + public readonly int NextPeriod; + + public SubscriptionStatus(IntPtr o) + { + SKU = CLIB.ppf_SubscriptionStatus_GetSKU(o); + OuterId = CLIB.ppf_SubscriptionStatus_GetOuterId(o); + StartTime = TimeUtil.MilliSecondsToDateTime(CLIB.ppf_SubscriptionStatus_GetStartTime(o)); + EndTime = TimeUtil.MilliSecondsToDateTime(CLIB.ppf_SubscriptionStatus_GetEndTime(o)); + PeriodType = CLIB.ppf_SubscriptionStatus_GetPeriodType(o); + EntitlementStatus = CLIB.ppf_SubscriptionStatus_GetEntitlementStatus(o); + CancelReason = CLIB.ppf_SubscriptionStatus_GetCancelReason(o); + IsFreeTrial = CLIB.ppf_SubscriptionStatus_GetIsFreeTrial(o); + NextPeriod = CLIB.ppf_SubscriptionStatus_GetNextPeriod(o); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/IAP.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/IAP.cs.meta new file mode 100644 index 0000000..7526be6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/IAP.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2178942333fc436ab70032c2073b63bb +timeCreated: 1655278125 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Leaderboard.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Leaderboard.cs new file mode 100644 index 0000000..8e4b3a8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Leaderboard.cs @@ -0,0 +1,146 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + + /// Leaderboard info. + public class Leaderboard + { + /// The unique identifier of the leaderboard, which is configured on the PICO Developer Platform. + public readonly string ApiName; + + /// Leaderboard ID. + public readonly ulong ID; + + /** Associate a destination to the leaderboard so that users can be directed to a specific location in the app. + * If the leaderboard for that challenge is associated with a destination, the app will be launched, and the user will be directed to the destination. + * If the leaderboard for that challenge is not associated with any destination, the app will be launched, and the user will be directed to the Home page. + */ + public readonly Destination DestinationOptional; + + public Leaderboard(IntPtr o) + { + ApiName = CLIB.ppf_Leaderboard_GetApiName(o); + ID = CLIB.ppf_Leaderboard_GetID(o); + var pointer = CLIB.ppf_Leaderboard_GetDestination(o); + if (pointer == IntPtr.Zero) + DestinationOptional = null; + else + DestinationOptional = new Destination(pointer); + } + } + + /// Leaderboard list. Each element is \ref Leaderboard. + public class LeaderboardList : MessageArray + { + /// The total number of leaderboards in the list. + public readonly ulong TotalCount; + public LeaderboardList(IntPtr a) + + { + TotalCount = CLIB.ppf_LeaderboardArray_GetTotalCount(a); + NextPageParam = CLIB.ppf_LeaderboardArray_HasNextPage(a) ? "true" : string.Empty; + var count = (int) CLIB.ppf_LeaderboardArray_GetSize(a); + this.Capacity = count; + for (var i = 0; i < count; i++) + { + Add(new Leaderboard(CLIB.ppf_LeaderboardArray_GetElement(a, (UIntPtr) i))); + } + } + } + + /// Supplementary metric. + public class SupplementaryMetric + { + /// The ID of the supplementary metric. + public readonly UInt64 ID; + /// The value of the supplementary metric. + public readonly long Metric; + + + public SupplementaryMetric(IntPtr o) + { + ID = CLIB.ppf_SupplementaryMetric_GetID(o); + Metric = CLIB.ppf_SupplementaryMetric_GetMetric(o); + } + } + + /// Leaderboard entry info. + public class LeaderboardEntry + { + /// The entry's display score. + public readonly string DisplayScore; + /// Additional info, no more than 2KB. + public readonly byte[] ExtraData; + /// Entry ID. + public readonly UInt64 ID; + /// The entry's ranking on the leaderboard. For example, returns `1` for top1. + public readonly int Rank; + /// The score used to rank the entry. + public readonly long Score; + /// The supplementary metric used for tiebreakers. This field can be null. Need to check whether it is null before use. + public readonly SupplementaryMetric SupplementaryMetricOptional; + /// The time when the entry was written to the leaderboard. + public readonly DateTime Timestamp; + /// The user the entry belongs to. + public readonly User User; + + + public LeaderboardEntry(IntPtr o) + { + DisplayScore = CLIB.ppf_LeaderboardEntry_GetDisplayScore(o); + var extraDataPtr = CLIB.ppf_LeaderboardEntry_GetExtraData(o); + var extraDataSize = CLIB.ppf_LeaderboardEntry_GetExtraDataLength(o); + ExtraData = MarshalUtil.ByteArrayFromNative(extraDataPtr, extraDataSize); + ID = CLIB.ppf_LeaderboardEntry_GetID(o); + Rank = CLIB.ppf_LeaderboardEntry_GetRank(o); + Score = CLIB.ppf_LeaderboardEntry_GetScore(o); + Timestamp = TimeUtil.SecondsToDateTime((long) CLIB.ppf_LeaderboardEntry_GetTimestamp(o)); + User = new User(CLIB.ppf_LeaderboardEntry_GetUser(o)); + { + var pointer = CLIB.ppf_LeaderboardEntry_GetSupplementaryMetric(o); + if (pointer == IntPtr.Zero) + { + SupplementaryMetricOptional = null; + } + else + { + SupplementaryMetricOptional = new SupplementaryMetric(pointer); + } + } + } + } + + /// Leaderboard entry list. Each element is \ref LeaderboardEntry. + public class LeaderboardEntryList : MessageArray + { + /// The total number of entries on the leaderboard. + public readonly ulong TotalCount; + + public LeaderboardEntryList(IntPtr a) + { + NextPageParam = CLIB.ppf_LeaderboardEntryArray_HasNextPage(a) ? "true" : string.Empty; + PreviousPageParam = CLIB.ppf_LeaderboardEntryArray_HasPreviousPage(a) ? "true" : string.Empty; + var count = (int) CLIB.ppf_LeaderboardEntryArray_GetSize(a); + this.Capacity = count; + for (uint i = 0; i < count; i++) + { + this.Add(new LeaderboardEntry(CLIB.ppf_LeaderboardEntryArray_GetElement(a, (UIntPtr) i))); + } + + TotalCount = CLIB.ppf_LeaderboardEntryArray_GetTotalCount(a); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Leaderboard.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Leaderboard.cs.meta new file mode 100644 index 0000000..18d52c8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Leaderboard.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 457e9a7eddbc4d46ab8add0d8ebc03d6 +timeCreated: 1655221465 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Matchmaking.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Matchmaking.cs new file mode 100644 index 0000000..d38396e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Matchmaking.cs @@ -0,0 +1,202 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + + /// Matchmaking admin snapshot. You will receive this after calling \ref MatchmakingService.GetAdminSnapshot. + public class MatchmakingAdminSnapshot + { + /// List of matchmaking candidates + public readonly MatchmakingAdminSnapshotCandidateList CandidateList; + /// The current matching threshold. + public readonly double MyCurrentThreshold; + + public MatchmakingAdminSnapshot(IntPtr o) + { + CandidateList = new MatchmakingAdminSnapshotCandidateList(CLIB.ppf_MatchmakingAdminSnapshot_GetCandidates(o)); + MyCurrentThreshold = CLIB.ppf_MatchmakingAdminSnapshot_GetMyCurrentThreshold(o); + } + } + + /// Matchmaking candidate. + public class MatchmakingAdminSnapshotCandidate + { + /// Whether me and the other user can be matched. + public readonly bool CanMatch; + /// My matching threshold. + public readonly double MyTotalScore; + /// The other user's matching threshold. + public readonly double TheirCurrentThreshold; + + public MatchmakingAdminSnapshotCandidate(IntPtr o) + { + CanMatch = CLIB.ppf_MatchmakingAdminSnapshotCandidate_GetCanMatch(o); + MyTotalScore = CLIB.ppf_MatchmakingAdminSnapshotCandidate_GetMyTotalScore(o); + TheirCurrentThreshold = CLIB.ppf_MatchmakingAdminSnapshotCandidate_GetTheirCurrentThreshold(o); + } + } + /// + /// Each element is \ref MatchmakingAdminSnapshotCandidate. + /// + public class MatchmakingAdminSnapshotCandidateList : MessageArray + { + /// The total number of MatchmakingAdminSnapshotCandidate in the list. + public readonly ulong TotalCount; + public MatchmakingAdminSnapshotCandidateList(IntPtr a) + { + var count = (int) CLIB.ppf_MatchmakingAdminSnapshotCandidateArray_GetSize(a); + this.Capacity = count; + TotalCount = (ulong)CLIB.ppf_MatchmakingAdminSnapshotCandidateArray_GetTotalCount(a); + for (int i = 0; i < count; i++) + { + this.Add(new MatchmakingAdminSnapshotCandidate(CLIB.ppf_MatchmakingAdminSnapshotCandidateArray_GetElement(a, (UIntPtr) i))); + } + } + } + + /// Matchmaking browse result. You will receive the result after calling \ref MatchmakingService.Browse2. + public class MatchmakingBrowseResult + { + /// Matchmaking enqueue result. + public readonly MatchmakingEnqueueResult EnqueueResult; + /// The list of matchmaking rooms. + public readonly MatchmakingRoomList MatchmakingRooms; + + public MatchmakingBrowseResult(IntPtr o) + { + EnqueueResult = new MatchmakingEnqueueResult(CLIB.ppf_MatchmakingBrowseResult_GetEnqueueResult(o)); + MatchmakingRooms = new MatchmakingRoomList(CLIB.ppf_MatchmakingBrowseResult_GetRooms(o)); + } + } + + /// Matchmaking enqueue result. + public class MatchmakingEnqueueResult + { + /// Matchmaking snapshot options. Used for debugging only. + public readonly MatchmakingAdminSnapshot AdminSnapshotOptional; + /// The average waiting time. + public readonly uint AverageWait; + /// The number of matches made in the last hour. + public readonly uint MatchesInLastHourCount; + /// The expected longest waiting time. + public readonly uint MaxExpectedWait; + /// Matchmaking pool name. + public readonly string Pool; + /// Match rate. + public readonly uint RecentMatchPercentage; + + + public MatchmakingEnqueueResult(IntPtr o) + { + { + var pointer = CLIB.ppf_MatchmakingEnqueueResult_GetAdminSnapshot(o); + if (pointer == IntPtr.Zero) + { + AdminSnapshotOptional = null; + } + else + { + AdminSnapshotOptional = new MatchmakingAdminSnapshot(pointer); + } + } + + AverageWait = CLIB.ppf_MatchmakingEnqueueResult_GetAverageWait(o); + MatchesInLastHourCount = CLIB.ppf_MatchmakingEnqueueResult_GetMatchesInLastHourCount(o); + MaxExpectedWait = CLIB.ppf_MatchmakingEnqueueResult_GetMaxExpectedWait(o); + Pool = CLIB.ppf_MatchmakingEnqueueResult_GetPool(o); + RecentMatchPercentage = CLIB.ppf_MatchmakingEnqueueResult_GetRecentMatchPercentage(o); + } + } + + /// Matchmaking enqueue result and room info. You will receive this after calling \ref MatchmakingService.CreateAndEnqueueRoom2. + public class MatchmakingEnqueueResultAndRoom + { + /// Matchmaking enqueue result. + public readonly MatchmakingEnqueueResult MatchmakingEnqueueResult; + /// Matchmaking room info. + public readonly Room Room; + + public MatchmakingEnqueueResultAndRoom(IntPtr o) + { + MatchmakingEnqueueResult = new MatchmakingEnqueueResult(CLIB.ppf_MatchmakingEnqueueResultAndRoom_GetMatchmakingEnqueueResult(o)); + Room = new Room(CLIB.ppf_MatchmakingEnqueueResultAndRoom_GetRoom(o)); + } + } + + /// Matchmaking room. + public class MatchmakingRoom + { + /// Room info. + public readonly Models.Room Room; + /// Currently, always `0`. + public readonly uint PingTime; + /// Currently, always `false`. + public readonly bool HasPingTime; + + + public MatchmakingRoom(IntPtr o) + { + this.PingTime = CLIB.ppf_MatchmakingRoom_GetPingTime(o); + this.Room = new Models.Room(CLIB.ppf_MatchmakingRoom_GetRoom(o)); + this.HasPingTime = CLIB.ppf_MatchmakingRoom_HasPingTime(o); + } + } + /** + * Each element is \ref MatchmakingRoom + */ + public class MatchmakingRoomList : MessageArray + { + /// The total number. + public readonly int TotalCount; + public MatchmakingRoomList(IntPtr a) + { + TotalCount = CLIB.ppf_MatchmakingRoomArray_GetTotalCount(a); + int count = (int) CLIB.ppf_MatchmakingRoomArray_GetSize(a); + this.Capacity = count; + for (uint i = 0; i < count; i++) + { + this.Add(new MatchmakingRoom(CLIB.ppf_MatchmakingRoomArray_GetElement(a, (UIntPtr) i))); + } + } + } + + /// Matchmaking statistics. Will receive this after calling \ref MatchmakingService.GetStats. + public class MatchmakingStats + { + /// The current user's number of draws. + public readonly uint DrawCount; + /// The current user's number of losses. + public readonly uint LossCount; + /// The current user's skill level for the current matchmaking pool. + public readonly uint SkillLevel; + /// The average of all skill levels for the current matchmaking pool. + public readonly double SkillMean; + /// The standard deviation of all skill levels for the current matchmaking pool + public readonly double SkillStandardDeviation; + /// The current user's number of wins. + public readonly uint WinCount; + + + public MatchmakingStats(IntPtr o) + { + DrawCount = CLIB.ppf_MatchmakingStats_GetDrawCount(o); + LossCount = CLIB.ppf_MatchmakingStats_GetLossCount(o); + SkillLevel = CLIB.ppf_MatchmakingStats_GetSkillLevel(o); + SkillMean = CLIB.ppf_MatchmakingStats_GetSkillMean(o); + SkillStandardDeviation = CLIB.ppf_MatchmakingStats_GetSkillStandardDeviation(o); + WinCount = CLIB.ppf_MatchmakingStats_GetWinCount(o); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Matchmaking.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Matchmaking.cs.meta new file mode 100644 index 0000000..208691c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Matchmaking.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ad76d09e01dbdf749a00f0dfd0ed3c1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Notification.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Notification.cs new file mode 100644 index 0000000..15bf45e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Notification.cs @@ -0,0 +1,69 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using UnityEngine; + +namespace Pico.Platform.Models +{ + /// + /// Invitation notificiation. + /// + public class RoomInviteNotification + { + /// Invitation ID. + public readonly UInt64 ID; + /// Room ID. + public readonly UInt64 RoomID; + /// Inviter's user ID. + public readonly string SenderID; + /// The time when the invitation is sent. + public readonly DateTime SentTime; + + + public RoomInviteNotification(IntPtr o) + { + ID = CLIB.ppf_RoomInviteNotification_GetID(o); + RoomID = CLIB.ppf_RoomInviteNotification_GetRoomID(o); + SenderID = CLIB.ppf_RoomInviteNotification_GetSenderID(o); + SentTime = new DateTime(); + try + { + SentTime = TimeUtil.SecondsToDateTime((long) CLIB.ppf_RoomInviteNotification_GetSentTime(o)); + } + catch (UnityException ex) + { + Debug.LogWarning($"RoomInviteNotification get SentTime fail {ex}"); + throw; + } + } + } + /// + /// Each element is \ref RoomInviteNotification + /// + public class RoomInviteNotificationList : MessageArray + { + /// The total number. + public readonly int TotalCount; + public RoomInviteNotificationList(IntPtr a) + { + TotalCount = CLIB.ppf_RoomInviteNotificationArray_GetTotalCount(a); + NextPageParam = CLIB.ppf_RoomInviteNotificationArray_HasNextPage(a) ? "true" : string.Empty; + int count = (int) CLIB.ppf_RoomInviteNotificationArray_GetSize(a); + this.Capacity = count; + for (uint i = 0; i < count; i++) + { + this.Add(new RoomInviteNotification(CLIB.ppf_RoomInviteNotificationArray_GetElement(a, (UIntPtr)i))); + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Notification.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Notification.cs.meta new file mode 100644 index 0000000..ee3e639 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Notification.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0945c228a6a840e0b4046d70ed08ea25 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Packet.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Packet.cs new file mode 100644 index 0000000..32738f5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Packet.cs @@ -0,0 +1,91 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +namespace Pico.Platform.Models +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The information about the message packet. + /// + public sealed class Packet : IDisposable + { + /// The size of the message packet. + private readonly ulong size; + /// The handler of the message packet. + private readonly IntPtr handler; + + public Packet(IntPtr handler) + { + this.handler = handler; + this.size = (ulong) CLIB.ppf_Packet_GetSize(handler); + } + + /// Get message content. + public ulong GetBytes(byte[] dest) + { + if ((ulong) dest.LongLength >= size) + { + Marshal.Copy(CLIB.ppf_Packet_GetBytes(handler), dest, 0, (int) size); + return size; + } + else + { + throw new ArgumentException($"Dest array can't hold {size} bytes"); + } + } + + /// Get message content. + public string GetBytes() + { + if (size > 0) + { + byte[] bytes = new byte[size]; + Marshal.Copy(CLIB.ppf_Packet_GetBytes(handler), bytes, 0, (int) size); + return System.Text.Encoding.UTF8.GetString(bytes); + } + else + { + return string.Empty; + } + } + + /// Get the ID of the message sender. + public string SenderId + { + get { return CLIB.ppf_Packet_GetSenderID(handler); } + } + /// Get message size. + public ulong Size + { + get { return size; } + } + + + #region IDisposable + + ~Packet() + { + Dispose(); + } + + + public void Dispose() + { + CLIB.ppf_Packet_Free(handler); + GC.SuppressFinalize(this); + } + + #endregion + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Packet.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Packet.cs.meta new file mode 100644 index 0000000..73c5b99 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Packet.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 351ba01c3b9b64a2f99b84ec5e4202b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Presence.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Presence.cs new file mode 100644 index 0000000..197870a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Presence.cs @@ -0,0 +1,156 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + + /// + /// Destination is a location in the app. + /// You can configure destinations for your app on the PICO Developer Platform. + /// + public class Destination + { + /// The destination's API name. + public readonly string ApiName; + + /// The destination's deeplink message. + public readonly string DeeplinkMessage; + + /// The destination's display name. + public readonly string DisplayName; + + public Destination(IntPtr o) + { + ApiName = CLIB.ppf_Destination_GetApiName(o); + DeeplinkMessage = CLIB.ppf_Destination_GetDeeplinkMessage(o); + DisplayName = CLIB.ppf_Destination_GetDisplayName(o); + } + } + + /// + /// Each element is \ref Destination + /// + public class DestinationList : MessageArray + { + public DestinationList(IntPtr a) + { + var count = (int) CLIB.ppf_DestinationArray_GetSize(a); + this.Capacity = count; + for (int i = 0; i < count; i++) + { + this.Add(new Destination(CLIB.ppf_DestinationArray_GetElement(a, (UIntPtr) i))); + } + + NextPageParam = CLIB.ppf_DestinationArray_GetNextPageParam(a); + } + } + + + /// + /// App's invitation info. + /// + public class ApplicationInvite + { + /// The destination where the user is directed to after accepting the invitation. + public readonly Destination Destination; + + /// Invited users. + public readonly User Recipient; + + /// Invitation ID. + public readonly UInt64 ID; + + /// If the user clicks the invitation message, this field will be `true`. + public readonly bool IsActive; + + /// The lobby session ID that identifies a group or team. + public readonly string LobbySessionId; + + /// The match session ID that identifies a competition. + public readonly string MatchSessionId; + + public ApplicationInvite(IntPtr o) + { + Destination = new Destination(CLIB.ppf_ApplicationInvite_GetDestination(o)); + Recipient = new User(CLIB.ppf_ApplicationInvite_GetRecipient(o)); + ID = CLIB.ppf_ApplicationInvite_GetID(o); + IsActive = CLIB.ppf_ApplicationInvite_GetIsActive(o); + LobbySessionId = CLIB.ppf_ApplicationInvite_GetLobbySessionId(o); + MatchSessionId = CLIB.ppf_ApplicationInvite_GetMatchSessionId(o); + } + } + + /// + /// Each element is \ref ApplicationInvite. + /// + public class ApplicationInviteList : MessageArray + { + public ApplicationInviteList(IntPtr a) + { + var count = (int) CLIB.ppf_ApplicationInviteArray_GetSize(a); + this.Capacity = count; + for (int i = 0; i < count; i++) + { + this.Add(new ApplicationInvite(CLIB.ppf_ApplicationInviteArray_GetElement(a, (UIntPtr) i))); + } + + NextPageParam = CLIB.ppf_ApplicationInviteArray_GetNextPageParam(a); + } + } + + + /// + /// The result returned after calling \ref PresenceService.SendInvites. + /// + public class SendInvitesResult + { + public readonly ApplicationInviteList Invites; + + public SendInvitesResult(IntPtr o) + { + Invites = new ApplicationInviteList(CLIB.ppf_SendInvitesResult_GetInvites(o)); + } + } + + + /// + /// When user click the invitation message, the app will be launched and you will receive a message with presence info. + /// + public class PresenceJoinIntent + { + /// The deeplink message of the destination. + public readonly string DeeplinkMessage; + + /// The destination api name of the destination. + public readonly string DestinationApiName; + + /// The lobby session id which is configured by the sender. + public readonly string LobbySessionId; + + /// The match session id which is configured by the sender. + public readonly string MatchSessionId; + + /// The extra info of the presence. + public readonly string Extra; + + public PresenceJoinIntent(IntPtr o) + { + DeeplinkMessage = CLIB.ppf_PresenceJoinIntent_GetDeeplinkMessage(o); + DestinationApiName = CLIB.ppf_PresenceJoinIntent_GetDestinationApiName(o); + LobbySessionId = CLIB.ppf_PresenceJoinIntent_GetLobbySessionId(o); + MatchSessionId = CLIB.ppf_PresenceJoinIntent_GetMatchSessionId(o); + Extra = CLIB.ppf_PresenceJoinIntent_GetExtra(o); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Presence.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Presence.cs.meta new file mode 100644 index 0000000..0be21f5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Presence.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cefd599deefe0d44294c1b825693cdff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/RTC.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/RTC.cs new file mode 100644 index 0000000..db3eac5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/RTC.cs @@ -0,0 +1,557 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Runtime.InteropServices; + +namespace Pico.Platform.Models +{ + /// + /// The binary message received in a RTC room. + /// + public class RtcBinaryMessageReceived + { + /// The message sender's user ID. + public readonly string UserId; + + /// The binary data of the message. + public readonly byte[] Data; + + /// The ID of the room that the message is sent to. + public readonly string RoomId; + + public RtcBinaryMessageReceived(IntPtr o) + { + UserId = CLIB.ppf_RtcBinaryMessageReceived_GetUserId(o); + var ptr = CLIB.ppf_RtcBinaryMessageReceived_GetData(o); + var sz = CLIB.ppf_RtcBinaryMessageReceived_GetLength(o); + Data = MarshalUtil.ByteArrayFromNative(ptr, (uint) sz); + RoomId = CLIB.ppf_RtcBinaryMessageReceived_GetRoomId(o); + } + } + + + /// + /// The audio frame is several frames of RTC recorded audio. + /// + public class RtcAudioFrame + { + /// The type of the audio channel for this audio frame. + public readonly RtcAudioChannel Channel; + + /// The data pointer of the audio frame. + public readonly IntPtr Data; + + /// The size of the data. + public readonly long DataSize; + + /// The sample rate of the data. + public readonly RtcAudioSampleRate SampleRate; + + /// The timestamp.Its value is always 0. So don't use it. + public readonly long TimeStampInUs; + + public RtcAudioFrame(IntPtr o) + { + Channel = CLIB.ppf_RtcAudioFrame_GetChannel(o); + DataSize = CLIB.ppf_RtcAudioFrame_GetDataSize(o); + SampleRate = CLIB.ppf_RtcAudioFrame_GetSampleRate(o); + TimeStampInUs = CLIB.ppf_RtcAudioFrame_GetTimeStampInUs(o); + Data = CLIB.ppf_RtcAudioFrame_GetData(o); + } + + public byte[] GetData() + { + return MarshalUtil.ByteArrayFromNative(this.Data, (uint) this.DataSize); + } + + public void SetData(byte[] data) + { + Marshal.Copy(data, 0, this.Data, (int) this.DataSize); + } + } + + + /// + /// The message sending result that indicates whether the message is successfully sent. + /// + public class RtcMessageSendResult + { + /// The message ID. + public readonly long MessageId; + + /// The error code returned in the result. `200` means success. + public readonly int Error; + + /// The ID of the room that the message is sent to. + public readonly string RoomId; + + public RtcMessageSendResult(IntPtr o) + { + MessageId = CLIB.ppf_RtcMessageSendResult_GetMessageId(o); + Error = CLIB.ppf_RtcMessageSendResult_GetError(o); + RoomId = CLIB.ppf_RtcMessageSendResult_GetRoomId(o); + } + } + + + /// + /// When the remote user canceled publshing stream to the room, you will receive a notification. + /// + public class RtcUserUnPublishInfo + { + /// The ID of the remote user. + public readonly string UserId; + + /// The stream type. + public readonly RtcMediaStreamType MediaStreamType; + + /// The reason why the remote user canceled publishing stream. + public readonly RtcStreamRemoveReason Reason; + + /// The ID of the room that the remote user is in. + public readonly string RoomId; + + public RtcUserUnPublishInfo(IntPtr o) + { + UserId = CLIB.ppf_RtcUserUnPublishInfo_GetUserId(o); + MediaStreamType = CLIB.ppf_RtcUserUnPublishInfo_GetMediaStreamType(o); + Reason = CLIB.ppf_RtcUserUnPublishInfo_GetReason(o); + RoomId = CLIB.ppf_RtcUserUnPublishInfo_GetRoomId(o); + } + } + + + /// + /// The publish stream info. + /// If the remote user publishes stream, you will receive a notification. + /// + public class RtcUserPublishInfo + { + /// The ID of the remote user. + public readonly string UserId; + + /// The stream type. + public readonly RtcMediaStreamType MediaStreamType; + + /// The ID of the room that the remote user is in. + public readonly string RoomId; + + public RtcUserPublishInfo(IntPtr o) + { + UserId = CLIB.ppf_RtcUserPublishInfo_GetUserId(o); + MediaStreamType = CLIB.ppf_RtcUserPublishInfo_GetMediaStreamType(o); + RoomId = CLIB.ppf_RtcUserPublishInfo_GetRoomId(o); + } + } + + + /// + /// The message received by a certain room. + /// The remote users can send messages to the room and you will receive this message. + /// + public class RtcRoomMessageReceived + { + /// The ID of the message sender. + public readonly string UserId; + + /// The message. + public readonly string Message; + + /// The ID of the room that the message was sent to. + public readonly string RoomId; + + public RtcRoomMessageReceived(IntPtr o) + { + UserId = CLIB.ppf_RtcRoomMessageReceived_GetUserId(o); + Message = CLIB.ppf_RtcRoomMessageReceived_GetMessage(o); + RoomId = CLIB.ppf_RtcRoomMessageReceived_GetRoomId(o); + } + } + + + /// + /// The message sent to you by a certain user. You will receive a notification. + /// + public class RtcUserMessageReceived + { + /// The ID of the message sender. + public readonly string UserId; + + /// The message. + public readonly string Message; + + /// The ID of the room that the message sender and recipient are in. + public readonly string RoomId; + + public RtcUserMessageReceived(IntPtr o) + { + UserId = CLIB.ppf_RtcUserMessageReceived_GetUserId(o); + Message = CLIB.ppf_RtcUserMessageReceived_GetMessage(o); + RoomId = CLIB.ppf_RtcUserMessageReceived_GetRoomId(o); + } + } + + + /// + /// The stream sync info sent to your room. You will receive a notification, + /// + public class RtcStreamSyncInfo + { + /// The key of the stream. + public readonly RtcRemoteStreamKey StreamKey; + + /// The type of the stream. + public readonly RtcSyncInfoStreamType StreamType; + + /// The stream sync info + public readonly byte[] Data; + + public RtcStreamSyncInfo(IntPtr o) + { + StreamKey = new RtcRemoteStreamKey(CLIB.ppf_RtcStreamSyncInfo_GetStreamKey(o)); + StreamType = CLIB.ppf_RtcStreamSyncInfo_GetStreamType(o); + var ptr = CLIB.ppf_RtcStreamSyncInfo_GetData(o); + var sz = CLIB.ppf_RtcStreamSyncInfo_GetLength(o); + Data = MarshalUtil.ByteArrayFromNative(ptr, (uint) sz); + } + } + + + /// + /// If you enable audio properties report, you will periodically receive audio property info. + /// + public class RtcAudioPropertyInfo + { + /// The volume detected. It's a value between `0` and `255`. + public readonly int Volume; + + public RtcAudioPropertyInfo(IntPtr o) + { + Volume = CLIB.ppf_RtcAudioPropertyInfo_GetVolume(o); + } + } + + + /// + /// You will receive this message after you call \ref RtcService.JoinRoom. + /// + public class RtcJoinRoomResult + { + /// The ID of the room that the user joined. + public readonly string RoomId; + + /// The ID of the user. + public readonly string UserId; + + /// The error code. `0` indicates success. + public readonly int ErrorCode; + + /// The time from calling \ref RtcService.JoinRoom to receiving the result. + public readonly int Elapsed; + + /// Whether it is the first time that the user has joined the room or if the user is reconnected to the room. + public readonly RtcJoinRoomType JoinType; + + public RtcJoinRoomResult(IntPtr o) + { + RoomId = CLIB.ppf_RtcJoinRoomResult_GetRoomId(o); + UserId = CLIB.ppf_RtcJoinRoomResult_GetUserId(o); + ErrorCode = CLIB.ppf_RtcJoinRoomResult_GetErrorCode(o); + Elapsed = CLIB.ppf_RtcJoinRoomResult_GetElapsed(o); + JoinType = CLIB.ppf_RtcJoinRoomResult_GetJoinType(o); + } + } + + + /// + /// You will receive this message after you call \ref RtcService.LeaveRoom. + /// + public class RtcLeaveRoomResult + { + /// The ID of the room that the user left. + public readonly string RoomId; + + public RtcLeaveRoomResult(IntPtr o) + { + RoomId = CLIB.ppf_RtcLeaveRoomResult_GetRoomId(o); + } + } + + + /// + /// The local audio properties info. + /// You will periodically receive this message after you + /// call \ref RtcService.EnableAudioPropertiesReport. + /// + public class RtcLocalAudioPropertiesInfo + { + /// The stream index info. + public readonly RtcStreamIndex StreamIndex; + + /// The audio property details. + public readonly RtcAudioPropertyInfo AudioPropertyInfo; + + public RtcLocalAudioPropertiesInfo(IntPtr o) + { + StreamIndex = CLIB.ppf_RtcLocalAudioPropertiesInfo_GetStreamIndex(o); + AudioPropertyInfo = new RtcAudioPropertyInfo(CLIB.ppf_RtcLocalAudioPropertiesInfo_GetAudioPropertyInfo(o)); + } + } + + + /// + /// The local audio properties report. + /// You will periodically receive this message after you + /// call \ref RtcService.EnableAudioPropertiesReport. + /// + public class RtcLocalAudioPropertiesReport + { + public readonly RtcLocalAudioPropertiesInfo[] AudioPropertiesInfos; + + public RtcLocalAudioPropertiesReport(IntPtr o) + { + ulong total = (ulong) CLIB.ppf_RtcLocalAudioPropertiesReport_GetAudioPropertiesInfosSize(o); + AudioPropertiesInfos = new RtcLocalAudioPropertiesInfo[total]; + for (uint i = 0; i < total; i++) + { + AudioPropertiesInfos[i] = new RtcLocalAudioPropertiesInfo(CLIB.ppf_RtcLocalAudioPropertiesReport_GetAudioPropertiesInfos(o, (UIntPtr) i)); + } + } + } + + + /// + /// The media device change info. + /// RTC engine will send this message if media device change is detected. + /// + public class RtcMediaDeviceChangeInfo + { + /// + /// Device ID. + /// + public readonly string DeviceId; + /// + /// Device type. + /// + public readonly RtcMediaDeviceType DeviceType; + /// + /// Device state. + /// + public readonly RtcMediaDeviceState DeviceState; + /// + /// Device error. + /// + public readonly RtcMediaDeviceError DeviceError; + + public RtcMediaDeviceChangeInfo(IntPtr o) + { + DeviceId = CLIB.ppf_RtcMediaDeviceChangeInfo_GetDeviceId(o); + DeviceType = CLIB.ppf_RtcMediaDeviceChangeInfo_GetDeviceType(o); + DeviceState = CLIB.ppf_RtcMediaDeviceChangeInfo_GetDeviceState(o); + DeviceError = CLIB.ppf_RtcMediaDeviceChangeInfo_GetDeviceError(o); + } + } + + + /// + /// You will receive this notification if the remote user call \ref RtcService.MuteLocalAudio. + /// + public class RtcMuteInfo + { + /// The ID of the remote user who muted audio. + public readonly string UserId; + + /// The state of audio muting: muted or canceled. + public readonly RtcMuteState MuteState; + + public RtcMuteInfo(IntPtr o) + { + UserId = CLIB.ppf_RtcMuteInfo_GetUserId(o); + MuteState = CLIB.ppf_RtcMuteInfo_GetMuteState(o); + } + } + + + /// + /// The remote audio properties info. + /// You can check who is speaking by this method. + /// + public class RtcRemoteAudioPropertiesInfo + { + public readonly RtcRemoteStreamKey StreamKey; + public readonly RtcAudioPropertyInfo AudioPropertiesInfo; + + public RtcRemoteAudioPropertiesInfo(IntPtr o) + { + StreamKey = new RtcRemoteStreamKey(CLIB.ppf_RtcRemoteAudioPropertiesInfo_GetStreamKey(o)); + AudioPropertiesInfo = new RtcAudioPropertyInfo(CLIB.ppf_RtcRemoteAudioPropertiesInfo_GetAudioPropertiesInfo(o)); + } + } + + + /// + /// You will receive remote user's audio info if you call \ref RtcService.EnableAudioPropertiesReport. + /// + public class RtcRemoteAudioPropertiesReport + { + public readonly RtcRemoteAudioPropertiesInfo[] AudioPropertiesInfos; + + /// The total volume of remote users in the room. + public readonly int TotalRemoteVolume; + + public RtcRemoteAudioPropertiesReport(IntPtr o) + { + AudioPropertiesInfos = new RtcRemoteAudioPropertiesInfo[(int) CLIB.ppf_RtcRemoteAudioPropertiesReport_GetAudioPropertiesInfosSize(o)]; + for (uint i = 0; i < AudioPropertiesInfos.Length; i++) + { + AudioPropertiesInfos[i] = new RtcRemoteAudioPropertiesInfo(CLIB.ppf_RtcRemoteAudioPropertiesReport_GetAudioPropertiesInfos(o, (UIntPtr) i)); + } + + TotalRemoteVolume = CLIB.ppf_RtcRemoteAudioPropertiesReport_GetTotalRemoteVolume(o); + } + } + + + /// + /// RtcRemoteStreamKey indicates the stream index of a remote user. + /// + public class RtcRemoteStreamKey + { + /// The ID of the room that the remote user is in. + public readonly string RoomId; + + /// The ID of the remote user. + public readonly string UserId; + + /// Indicates whether the stream is main stream or screen stream. + public readonly RtcStreamIndex RtcStreamIndex; + + public RtcRemoteStreamKey(IntPtr o) + { + RoomId = CLIB.ppf_RtcRemoteStreamKey_GetRoomId(o); + UserId = CLIB.ppf_RtcRemoteStreamKey_GetUserId(o); + RtcStreamIndex = CLIB.ppf_RtcRemoteStreamKey_GetStreamIndex(o); + } + } + + + /// + /// You will receive an error code when an error occurred in the room. + /// + public class RtcRoomError + { + /// The error code. + public readonly int Code; + + /// The ID of the room where the error occurred. + public readonly string RoomId; + + public RtcRoomError(IntPtr o) + { + Code = CLIB.ppf_RtcRoomError_GetCode(o); + RoomId = CLIB.ppf_RtcRoomError_GetRoomId(o); + } + } + + + /// + /// You will periodically receive this message after you successfully join a room. + /// + public class RtcRoomStats + { + /// The time elapsed since you joined the room . + public readonly int TotalDuration; + + /// The number of users in the room. + public readonly int UserCount; + + /// The ID of the room you joined. + public readonly string RoomId; + + public RtcRoomStats(IntPtr o) + { + TotalDuration = CLIB.ppf_RtcRoomStats_GetTotalDuration(o); + UserCount = CLIB.ppf_RtcRoomStats_GetUserCount(o); + RoomId = CLIB.ppf_RtcRoomStats_GetRoomId(o); + } + } + + + /// + /// The warning info of the room. + /// + public class RtcRoomWarn + { + /// The error code. + public readonly int Code; + + /// The ID of the room that the warning info comes from. + public readonly string RoomId; + + public RtcRoomWarn(IntPtr o) + { + Code = CLIB.ppf_RtcRoomWarn_GetCode(o); + RoomId = CLIB.ppf_RtcRoomWarn_GetRoomId(o); + } + } + + + /// + /// You will receive this message after a remote user joins the room. + /// + public class RtcUserJoinInfo + { + /// The ID of the user. + public readonly string UserId; + + /// If the remote user set the `UserExtra` field when calling \ref RtcService.JoinRoom with extra info. + public readonly string UserExtra; + + /// The time used for the remote user to join the room. + public readonly int Elapsed; + + /// The ID of the room that the remote user joined. + public readonly string RoomId; + + public RtcUserJoinInfo(IntPtr o) + { + UserId = CLIB.ppf_RtcUserJoinInfo_GetUserId(o); + UserExtra = CLIB.ppf_RtcUserJoinInfo_GetUserExtra(o); + Elapsed = CLIB.ppf_RtcUserJoinInfo_GetElapsed(o); + RoomId = CLIB.ppf_RtcUserJoinInfo_GetRoomId(o); + } + } + + + /// + /// You will receive this message when the remote user leaves the room. + /// + public class RtcUserLeaveInfo + { + /// The ID of the user. + public readonly string UserId; + + /// The reason why the user left the room, which can be network error or proactive quit. + public readonly RtcUserLeaveReasonType OfflineReason; + + /// The ID of the room that the user left. + public readonly string RoomId; + + public RtcUserLeaveInfo(IntPtr o) + { + UserId = CLIB.ppf_RtcUserLeaveInfo_GetUserId(o); + OfflineReason = CLIB.ppf_RtcUserLeaveInfo_GetOfflineReason(o); + RoomId = CLIB.ppf_RtcUserLeaveInfo_GetRoomId(o); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/RTC.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/RTC.cs.meta new file mode 100644 index 0000000..d77ca63 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/RTC.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df80498d870b6584980cc5a5d3bb404f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Room.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Room.cs new file mode 100644 index 0000000..87933b4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Room.cs @@ -0,0 +1,111 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace Pico.Platform.Models +{ + + /// + /// Room info. + /// + public class Room + { + /// The datastore that stores a room's metadata. The maximum datastore key length is 32 bytes and the maximum datastore value length is 64 bytes. + public readonly Dictionary DataStore; + /// Room description. The maximum length is 128 bytes. + public readonly string Description; + /// Room ID. + public readonly UInt64 RoomId; + /// Whether the room is locked. + public readonly bool IsMembershipLocked; + /// Room's join policy. + public readonly RoomJoinPolicy RoomJoinPolicy; + /// Room's joinability. + public readonly RoomJoinability RoomJoinability; + /// The maximum number of users allowed to join a room, which is `100`. + public readonly uint MaxUsers; + /// Room owner. This field can be null. Need to check whether it is null before use. + public readonly User OwnerOptional; + /// Room type. + public readonly RoomType RoomType; + /// Room members. This field can be null. Need to check whether it is null before use. + public readonly UserList UsersOptional; + /// Room name. + public readonly string Name; + /// The Num of the users in room. + public readonly uint PlayerNumber; + + public Room(IntPtr o) + { + PlayerNumber = CLIB.ppf_Room_GetPlayerNumber(o); + DataStore = CLIB.DataStoreFromNative(CLIB.ppf_Room_GetDataStore(o)); + Description = CLIB.ppf_Room_GetDescription(o); + RoomId = CLIB.ppf_Room_GetID(o); + IsMembershipLocked = CLIB.ppf_Room_GetIsMembershipLocked(o); + RoomJoinPolicy = (RoomJoinPolicy) CLIB.ppf_Room_GetJoinPolicy(o); + RoomJoinability = (RoomJoinability) CLIB.ppf_Room_GetJoinability(o); + MaxUsers = CLIB.ppf_Room_GetMaxUsers(o); + Name = CLIB.ppf_Room_GetName(o); + RoomType = (RoomType) CLIB.ppf_Room_GetType(o); + { + var ptr = CLIB.ppf_Room_GetOwner(o); + if (ptr == IntPtr.Zero) + { + OwnerOptional = null; + } + else + { + OwnerOptional = new User(ptr); + } + } + + { + var ptr = CLIB.ppf_Room_GetUsers(o); + if (ptr == IntPtr.Zero) + { + UsersOptional = null; + } + else + { + UsersOptional = new UserList(ptr); + } + } + } + } + + /// Room list info. Each element is \ref Room. + public class RoomList : MessageArray + { + /// The total number of rooms. + public readonly int TotalCount; + /// The current page idex from which the list begins. + public int CurIndex; + /// The number of rooms given on each page. + public int PageSize; + + public RoomList(IntPtr a) + { + TotalCount = CLIB.ppf_RoomArray_GetTotalCount(a); + CurIndex = CLIB.ppf_RoomArray_GetPageIndex(a); + PageSize = CLIB.ppf_RoomArray_GetPageSize(a); + NextPageParam = CLIB.ppf_RoomArray_HasNextPage(a) ? "true" : string.Empty; + int count = (int) CLIB.ppf_RoomArray_GetSize(a); + this.Capacity = count; + for (uint i = 0; i < count; i++) + { + this.Add(new Room(CLIB.ppf_RoomArray_GetElement(a, (UIntPtr)i))); + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Room.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Room.cs.meta new file mode 100644 index 0000000..9a77a1b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Room.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b3b9396dfcf9db14a896b58160a9954f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Speech.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Speech.cs new file mode 100644 index 0000000..78bf2f1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Speech.cs @@ -0,0 +1,65 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + /// + /// The automatic speech recognition result. + /// + public class AsrResult + { + /// + /// The text recognized. + /// + public readonly string Text; + /// + /// Whether this is the final result: + /// * `true`: yes + /// * `false`: no + /// + public readonly bool IsFinalResult; + + public AsrResult(IntPtr o) + { + Text = CLIB.ppf_AsrResult_GetText(o); + IsFinalResult = CLIB.ppf_AsrResult_GetIsFinalResult(o); + } + } + + /// + /// Information about the automatic speech recognition error. + /// + public class SpeechError + { + /// + /// Error message. + /// + public readonly string Message; + /// + /// The ID of the session where the error occurred. + /// + public readonly string SessionId; + /// + /// Error code. + /// + public readonly int Code; + + public SpeechError(IntPtr o) + { + Message = CLIB.ppf_SpeechError_GetMessage(o); + Code = CLIB.ppf_SpeechError_GetCode(o); + SessionId = CLIB.ppf_SpeechError_GetSessionId(o); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Speech.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Speech.cs.meta new file mode 100644 index 0000000..538763d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Speech.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 869552f8209743b5af9b39415c131ee7 +timeCreated: 1679484910 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Sport.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Sport.cs new file mode 100644 index 0000000..f6aeae8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Sport.cs @@ -0,0 +1,134 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; + +namespace Pico.Platform.Models +{ + + /// + /// The summary of daily sport info. + /// Users' daily sports info is recorded in the local database. This structure indicates the sports info generated someday. + /// + public class SportDailySummary + { + /// The ID of the summary. + public readonly long Id; + + /// The date when the summary was generated. + public readonly DateTime Date; + + /// The sport duration (in seconds). + public readonly int DurationInSeconds; + + /// The planned sport duration (in seconds). + public readonly int PlanDurationInMinutes; + + /// The actual calorie burnt (in kilo calorie). + public readonly double Calorie; + + /// The planned calorie to burn. + public readonly double PlanCalorie; + + public SportDailySummary(IntPtr o) + { + Id = CLIB.ppf_SportDailySummary_GetId(o); + Date = TimeUtil.MilliSecondsToDateTime(CLIB.ppf_SportDailySummary_GetDate(o)); + DurationInSeconds = CLIB.ppf_SportDailySummary_GetDurationInSeconds(o); + PlanDurationInMinutes = CLIB.ppf_SportDailySummary_GetPlanDurationInMinutes(o); + Calorie = CLIB.ppf_SportDailySummary_GetCalorie(o); + PlanCalorie = CLIB.ppf_SportDailySummary_GetPlanCalorie(o); + } + } + + /// + /// Each element is \ref SportDailySummary + /// + public class SportDailySummaryList : MessageArray + { + public SportDailySummaryList(IntPtr a) + { + var count = (int) CLIB.ppf_SportDailySummaryArray_GetSize(a); + this.Capacity = count; + for (int i = 0; i < count; i++) + { + this.Add(new SportDailySummary(CLIB.ppf_SportDailySummaryArray_GetElement(a, (UIntPtr) i))); + } + } + } + + /// + /// User's sport summary of today. + /// + public class SportSummary + { + /// The sport duration (in seconds). + public readonly int DurationInSeconds; + + /// The calorie burnt (in kilo calorie). + public readonly double Calorie; + + /// The time when the user started playing sport. + public readonly DateTime StartTime; + + /// The time when the user stopped playing sport. + public readonly DateTime EndTime; + + public SportSummary(IntPtr o) + { + DurationInSeconds = (int) CLIB.ppf_SportSummary_GetDurationInSeconds(o); + Calorie = CLIB.ppf_SportSummary_GetCalorie(o); + StartTime = TimeUtil.MilliSecondsToDateTime(CLIB.ppf_SportSummary_GetStartTime(o)); + EndTime = TimeUtil.MilliSecondsToDateTime(CLIB.ppf_SportSummary_GetEndTime(o)); + } + } + + /// + /// The user's sport info. + /// User can set sport goal in the Sport Center app. + /// + public class SportUserInfo + { + public readonly Gender Gender; + public readonly DateTime Birthday; + + /// The height of the user (in cm). + public readonly int Stature; + + /// The weight of the user (in kg). + public readonly int Weight; + + /// The sport level that indicates the intensity of the sport. + public readonly int SportLevel; + + /// The planned daily sport duration (in minutes). + public readonly int DailyDurationInMinutes; + + /// The planned weekly sport days. + public readonly int DaysPerWeek; + + /// The sport purpose, such as `keep fit` and `lose weight`. + public readonly SportTarget SportTarget; + + public SportUserInfo(IntPtr o) + { + Gender = CLIB.ppf_SportUserInfo_GetGender(o); + Birthday = TimeUtil.MilliSecondsToDateTime(CLIB.ppf_SportUserInfo_GetBirthday(o)); + Stature = CLIB.ppf_SportUserInfo_GetStature(o); + Weight = CLIB.ppf_SportUserInfo_GetWeight(o); + SportLevel = CLIB.ppf_SportUserInfo_GetSportLevel(o); + DailyDurationInMinutes = CLIB.ppf_SportUserInfo_GetDailyDurationInMinutes(o); + DaysPerWeek = CLIB.ppf_SportUserInfo_GetDaysPerWeek(o); + SportTarget = CLIB.ppf_SportUserInfo_GetSportTarget(o); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Sport.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Sport.cs.meta new file mode 100644 index 0000000..b6fc0c4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/Sport.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: fb62290b60b54d6297318c9a437b7269 +timeCreated: 1657617406 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/User.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/User.cs new file mode 100644 index 0000000..a0fbdf0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/User.cs @@ -0,0 +1,286 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace Pico.Platform.Models +{ + /// + /// The User info structure. + /// Basic fields, such as `DisplayName` and `ImageUrl`, are always valid. + /// Some fields, such as presence-related fields, are valid only when you call presence-related APIs. + /// See also: \ref UserService.GetLoggedInUser + /// + public class User + { + /// User's display name. + public readonly string DisplayName; + + ///The URL of user's profile photo. The image size is 300x300. + public readonly string ImageUrl; + + /// The URL of the user's small profile photo. The image size is 128x128. + public readonly string SmallImageUrl; + + /// User's openID. The same user has different openIDs in different apps. + public readonly string ID; + + /// User's presence status which indicates whether the user is online. + public readonly UserPresenceStatus PresenceStatus; + + /// User's gender. + public readonly Gender Gender; + + /// User's presence information. + public readonly string Presence; + + /// The deeplink message. + public readonly string PresenceDeeplinkMessage; + + /// The destination's API name. + public readonly string PresenceDestinationApiName; + + /// The lobby session ID which identifies a group or team. + public readonly string PresenceLobbySessionId; + + /// The match session ID which identifies a competition. + public readonly string PresenceMatchSessionId; + + /// User's extra presence information. + public readonly string PresenceExtra; + + /// Whether the user can be joined by others. + public readonly bool PresenceIsJoinable; + + /// The user's invite token. + public readonly string InviteToken; + + /// The user's registration country/region. Returns a country/region code. + public readonly string StoreRegion; + + public User(IntPtr obj) + { + DisplayName = CLIB.ppf_User_GetDisplayName(obj); + ImageUrl = CLIB.ppf_User_GetImageUrl(obj); + ID = CLIB.ppf_User_GetID(obj); + InviteToken = CLIB.ppf_User_GetInviteToken(obj); + PresenceStatus = CLIB.ppf_User_GetPresenceStatus(obj); + Gender = CLIB.ppf_User_GetGender(obj); + Presence = CLIB.ppf_User_GetPresence(obj); + PresenceDeeplinkMessage = CLIB.ppf_User_GetPresenceDeeplinkMessage(obj); + PresenceDestinationApiName = CLIB.ppf_User_GetPresenceDestinationApiName(obj); + PresenceLobbySessionId = CLIB.ppf_User_GetPresenceLobbySessionId(obj); + PresenceMatchSessionId = CLIB.ppf_User_GetPresenceMatchSessionId(obj); + PresenceExtra = CLIB.ppf_User_GetPresenceExtra(obj); + PresenceIsJoinable = CLIB.ppf_User_GetPresenceIsJoinable(obj); + SmallImageUrl = CLIB.ppf_User_GetSmallImageUrl(obj); + InviteToken = CLIB.ppf_User_GetInviteToken(obj); + StoreRegion = CLIB.ppf_User_GetStoreRegion(obj); + } + } + + /// + /// Each element is \ref User. + /// + public class UserList : MessageArray + { + public UserList(IntPtr a) + { + var count = (int) CLIB.ppf_UserArray_GetSize(a); + this.Capacity = count; + for (int i = 0; i < count; i++) + { + this.Add(new User(CLIB.ppf_UserArray_GetElement(a, (UIntPtr) i))); + } + + NextPageParam = CLIB.ppf_UserArray_GetNextPageParam(a); + } + } + + /// + /// The user's organization ID. + /// + public class OrgScopedID + { + /// + /// The organization ID. + /// + public readonly string ID; + + public OrgScopedID(IntPtr o) + { + ID = CLIB.ppf_OrgScopedID_GetID(o); + } + } + + /// + /// Indicates whether the friend request is canceled or successfully sent. + /// + public class LaunchFriendResult + { + /// Whether the request is canceled by the user. + public readonly bool DidCancel; + + /// Whether the request is successfully sent. + public readonly bool DidSendRequest; + + public LaunchFriendResult(IntPtr obj) + { + DidCancel = CLIB.ppf_LaunchFriendRequestFlowResult_GetDidCancel(obj); + DidSendRequest = CLIB.ppf_LaunchFriendRequestFlowResult_GetDidSendRequest(obj); + } + } + + + /// + /// The info returned after calling \ref UserService.GetFriendsAndRooms. + /// + public class UserRoom + { + public readonly User User; + public readonly Room Room; + + public UserRoom(IntPtr o) + { + User = new User(CLIB.ppf_UserAndRoom_GetUser(o)); + var ptr = CLIB.ppf_UserAndRoom_GetRoom(o); + if (ptr != IntPtr.Zero) + { + Room = new Room(ptr); + } + } + } + + /// + /// Each element is \ref UserRoom. + /// + public class UserRoomList : MessageArray + { + public UserRoomList(IntPtr a) + { + var count = (int) CLIB.ppf_UserAndRoomArray_GetSize(a); + this.Capacity = count; + for (int i = 0; i < count; i++) + { + this.Add(new UserRoom(CLIB.ppf_UserAndRoomArray_GetElement(a, (UIntPtr) i))); + } + + NextPageParam = CLIB.ppf_UserAndRoomArray_GetNextPageParam(a); + } + } + + + /// + /// User permissions list. + /// + public static class Permissions + { + /// + /// The permission to get the user's registration information, including the user's nickname, gender, profile photo, and more. + /// + public const string UserInfo = "user_info"; + /// + /// The permission to get users' friend relations. + /// + public const string FriendRelation = "friend_relation"; + /// + /// The permission to get the user's information, including the user's gender, birthday, stature, weight, and more, on the PICO Fitness app. + /// + public const string SportsUserInfo = "sports_userinfo"; + /// + /// The permission to get users' exercise data from the PICO Fitness app. + /// + public const string SportsSummaryData = "sports_summarydata"; + /// + /// The permission to capture or record the screen, which is required when using the highlight service. + /// + public const string RecordHighlight = "record_highlight"; + } + + + /// + /// The result returned after calling \ref UserService.RequestUserPermissions or \ref UserService.GetAuthorizedPermissions. + /// + public class PermissionResult + { + /// The authorized permissions. + public readonly string[] AuthorizedPermissions; + + /// The access token. It has a value only after you call \ref UserService.RequestUserPermissions. + public readonly string AccessToken; + + /// The current user's ID. + public readonly string UserID; + + public PermissionResult(IntPtr o) + { + { + int sz = (int) CLIB.ppf_PermissionResult_GetAuthorizedPermissionsSize(o); + AuthorizedPermissions = new string[sz]; + for (int i = 0; i < sz; i++) + { + AuthorizedPermissions[i] = CLIB.ppf_PermissionResult_GetAuthorizedPermissions(o, (UIntPtr) i); + } + } + + AccessToken = CLIB.ppf_PermissionResult_GetAccessToken(o); + UserID = CLIB.ppf_PermissionResult_GetUserID(o); + } + } + + + /// + /// The result returned after calling \ref UserService.GetUserRelations. + /// + /// This class derives from Dictionary. The key is userId and value is + /// \ref UserRelationType. + /// + public class UserRelationResult : Dictionary + { + public UserRelationResult(IntPtr o) + { + { + int sz = (int) CLIB.ppf_UserRelationResult_GetRelationsSize(o); + for (int i = 0; i < sz; i++) + { + string userId = CLIB.ppf_UserRelationResult_GetRelationsKey(o, i); + UserRelationType relation = CLIB.ppf_UserRelationResult_GetRelationsValue(o, i); + Add(userId, relation); + } + } + } + } + + + /// + /// The result returned after calling \ref UserService.EntitlementCheck + /// + public class EntitlementCheckResult + { + /// Whether the user is entitled to use the current app. + public readonly bool HasEntitlement; + + /// The status code for entitlement check. + public readonly int StatusCode; + + /// The status message for entitlement check. You can show this message to user if the user does not pass the entitlement check. + public readonly string StatusMessage; + + public EntitlementCheckResult(IntPtr o) + { + HasEntitlement = CLIB.ppf_EntitlementCheckResult_GetHasEntitlement(o); + StatusCode = CLIB.ppf_EntitlementCheckResult_GetStatusCode(o); + StatusMessage = CLIB.ppf_EntitlementCheckResult_GetStatusMessage(o); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/User.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/User.cs.meta new file mode 100644 index 0000000..3477c1c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Models/User.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4aae686bf05693c4db87bb0d2875cb40 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service.meta new file mode 100644 index 0000000..80d5a6d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f129e135c079ff744a1c426c0798e843 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Achievements.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Achievements.cs new file mode 100644 index 0000000..f36af01 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Achievements.cs @@ -0,0 +1,339 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Runtime.InteropServices; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + * + * The Achievements service can help build a "positive feedback mechanism" + * in your games. You can create prizes such as trophies and badges and + * distribute them to players when they hit a goal, like completing the + * beginner tutorial or reaching level x. Advanced achievements such as + * completing a hidden level/task should be closely integrated with game + * content design and, meanwhile, collaborate with prizes like diamonds + * or props to make your games more challenging and further enhance players' + * engagement. + */ + public static class AchievementsService + { + /// Adds a count to a specified count achievement. The count will be added to the current count. For example, + /// if the current count is 1 and the count you would like to add is 7, the final count will be 8 if the request succeeds. + /// @note Available to count achievements only. + /// + /// The API name of the achievement. + /// The count you want to add. The largest count supported by this function is the maximum + /// value of a signed 64-bit integer. If the count is larger than that, it is + /// clamped to that maximum value before being passed to the servers. + /// + /// Custom extension fields that can be used to record key information when unlocking achievements. + /// The request ID of this async function. + /// | Error Code| Error Message | + /// |---|---| + /// |10729|invalid api name| + /// |10733|invalid count| + /// |10725|extra data too long| + /// |10720|achievement is not exist| + /// |10723|load achievement data failed| + /// |10726|achievement is unreleased| + /// |10727|achievement is archived| + /// |10722|no write permission| + /// |10736|invalid parameter| + /// |10735|invalid extra data| + /// |10734|operation is not allowed on the type| + /// |10728|achievement is unlocked| + /// |10724|save achievement data failed| + /// + /// A message of type `MessageType.Achievements_AddCount` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `AchievementUpdate`. + /// Extract the payload from the message handle with `Message.Data`. + /// + /// `AchievementUpdate` contains the following: + /// * `JustUnlocked`: Whether the achievement has been successfully unlocked. + /// * `Name`: The API name of the achievement. + /// + public static Task AddCount(string name, long count, byte[] extraData) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + GCHandle hobj = GCHandle.Alloc(extraData, GCHandleType.Pinned); + IntPtr pobj = hobj.AddrOfPinnedObject(); + var result = new Task(CLIB.ppf_Achievements_AddCount(name, count, pobj, (uint) (extraData != null ? extraData.Length : 0))); + if (hobj.IsAllocated) + hobj.Free(); + return result; + } + + /// Unlocks the bit(s) of a specified bitfield achievement. The status of the bit(s) is then unchangeable. + /// @note Available to bitfield achievements only. + /// + /// The API name of the achievement to unlock bit(s) for. + /// A string containing either the `0` or `1` characters, for example, `100011`. Every `1` will unlock a bit in the corresponding position of a bitfield. + /// Custom extension fields that can be used to record key information when unlocking achievements. + /// The request ID of this async function. + /// | Error Code| Error Message | + /// |---|---| + /// |10729|invalid api name| + /// |10731|invalid field| + /// |10725|extra data too long| + /// |10720|achievement is not exist| + /// |10723|load achievement data failed| + /// |10726|achievement is unreleased| + /// |10727|achievement is archived| + /// |10722|no write permission| + /// |10736|invalid parameter| + /// |10735|invalid extra data| + /// |10734|operation is not allowed on the type| + /// |10728|achievement is unlocked| + /// |10724|save achievement data failed| + /// + /// A message of type `MessageType.Achievements_AddFields` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `AchievementUpdate`. + /// Extract the payload from the message handle with `Message.Data`. + /// + /// `AchievementUpdate` contains the following: + /// * `JustUnlocked`: Whether the achievement has been successfully unlocked. + /// * `Name`: The API name of the achievement. + /// + public static Task AddFields(string name, string fields, byte[] extraData) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + GCHandle hobj = GCHandle.Alloc(extraData, GCHandleType.Pinned); + IntPtr pobj = hobj.AddrOfPinnedObject(); + var result = new Task(CLIB.ppf_Achievements_AddFields(name, fields, pobj, (uint) (extraData != null ? extraData.Length : 0))); + if (hobj.IsAllocated) + hobj.Free(); + return result; + } + + /// Gets the information about all achievements, including API names, descriptions, types, + /// the targets which must be reached to unlock those achievements, and more. + /// Defines which page of achievements to return. The first page index is `0`. + /// The size of the page. + /// The request ID of this async function. + /// | Error Code| Error Message | + /// |---|---| + /// |10721|invalid api name| + /// |10736|invalid parameter| + /// |10720|achievement is not exist| + /// |10723|load achievement data failed| + /// + /// A message of type `MessageType.Achievements_GetAllDefinitions` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `AchievementDefinitionList`. + /// Extract the payload from the message handle with `Message.Data`. + /// + /// `AchievementDefinitionList` contains the following: + /// * `Type`: The type of the achievement. + /// * `Name`: The API name of the achievement. + /// * `BitfieldLength`: The total bits in the bitfield. For bitfield achievements only. + /// * `Target`: The number of events to complete for unlocking the achievement. For count or bitfield achievements only. + /// * `Description`: The description of the achievement. + /// * `Title`: The display name of the achievement that users see. + /// * `IsArchived`: Whether the achievement is archived. Archiving will not delete the achievement or users' progress on it. + /// * `IsSecret`: Whether the achievement is hidden until it is unlocked by users. + /// * `ID`: The data ID. + /// * `UnlockedDescription`: The message displayed to users when they unlock the achievement. + /// * `WritePolicy`: Who are able to write achievement progress. + /// * `LockedImageURL`: The local path to the image displayed to users before they unlock the achievement. + /// * `UnlockedImageURL`: The local path to the image displayed to users after they unlock the achievement. + /// + public static Task GetAllDefinitions(int pageIdx, int pageSize) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Achievements_GetAllDefinitions(pageIdx, pageSize)); + } + + /// Gets the user's progress on all achievements, including API names, + /// whether or not the achievements are unlocked, the time at which they were unlocked, + /// achievement types and, depending on the type, the progress made towards unlocking them, and more. + /// Defines which page of achievements to return. The first page index is `0`. + /// The size of the page. + /// The request ID of this async function. + /// | Error Code| Error Message | + /// |---|---| + /// |10721|invalid api name| + /// |10723|load achievement data failed| + /// + /// A message of type `MessageType.Achievements_GetAllProgress` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `AchievementProgressList`. + /// Extract the payload from the message handle with `Message.Data`. + /// + /// `AchievementProgressList` contains the following: + /// * `ID`: The data ID. + /// * `Bitfield`: A bitfield displaying the bits unlocked for a bitfield achievement, for example, `1110001`. + /// * `Count`: The number of events completed for unlocking a count achievement. + /// * `IsUnlocked`: Whether the achievement is unlocked. + /// * `Name`: The API name of the achievement. + /// * `UnlockTime`: The time at which the achievement was unlocked. + /// * `ExtraData`: The key information recorded when unlocking the achievement. + /// + public static Task GetAllProgress(int pageIdx, int pageSize) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Achievements_GetAllProgress(pageIdx, pageSize)); + } + + /// Gets the information about specified achievements, including API names, descriptions, types, + /// the targets which must be reached to unlock those achievements, and more. + /// The API names of the achievements. + /// The request ID of this async function. + /// | Error Code| Error Message | + /// |---|---| + /// |10729|invalid api name| + /// |10730|too many api names| + /// |10721|invalid request| + /// |10736|invalid parameter| + /// |10720|achievement is not exist| + /// |10723|load achievement data failed| + /// + /// A message of type `MessageType.Achievements_GetDefinitionsByName` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `AchievementDefinitionList`. + /// Extract the payload from the message handle with `Message.Data`. + /// + /// `AchievementDefinitionList` contains the following: + /// * `Type`: The type of the achievement. + /// * `Name`: The API name of the achievement. + /// * `BitfieldLength`: The total bits in the bitfield. For bitfield achievements only. + /// * `Target`: The number of events to complete for unlocking the achievement. For count or bitfield achievements only. + /// * `Description`: The description of the achievement. + /// * `Title`: The display name of the achievement that users see. + /// * `IsArchived`: Whether the achievement is archived. Archiving will not delete the achievement or users' progress on it. + /// * `IsSecret`: Whether the achievement is hidden until it is unlocked by users. + /// * `ID`: The data ID. + /// * `UnlockedDescription`: The message displayed to users when they unlock the achievement. + /// * `WritePolicy`: Who are able to write achievement progress. + /// * `LockedImageURL`: The local path to the image displayed to users before they unlock the achievement. + /// * `UnlockedImageURL`: The local path to the image displayed to users after they unlock the achievement. + /// + public static Task GetDefinitionsByName(string[] names) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Achievements_GetDefinitionsByName(names)); + } + + /// Gets the user's progress on specified achievements, including API names, + /// whether or not the achievements are unlocked, the time at which they were unlocked, + /// achievement types and, depending on the type, the progress made towards unlocking them, and more. + /// The API names of the achievements. + /// The request ID of this async function. + /// | Error Code| Error Message | + /// |---|---| + /// |10729|invalid api name| + /// |10730|too many api names| + /// |10721|invalid request| + /// |10723|load achievement data failed| + /// + /// A message of type `MessageType.Achievements_GetProgressByName` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `AchievementProgressList`. + /// Extract the payload from the message handle with `Message.Data`. + /// + /// `AchievementProgressList` contains the following: + /// * `ID`: The data ID. + /// * `Bitfield`: A bitfield displaying the bits unlocked for a bitfield achievement, for example, `1110001`. + /// * `Count`: The number of events completed for unlocking a count achievement. + /// * `IsUnlocked`: Whether the achievement is unlocked. + /// * `Name`: The API name of the achievement. + /// * `UnlockTime`: The time at which the achievement was unlocked. + /// * `ExtraData`: Records the key information when unlocking the achievement. + /// + public static Task GetProgressByName(string[] names) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Achievements_GetProgressByName(names)); + } + + /// Unlocks a specified achievement of any type even if the target for + /// unlocking this achievement is not reached. + /// + /// The API name of the achievement to unlock. + /// Custom extension fields that can be used to record key information when unlocking achievements. + /// The request ID of this async function. + /// | Error Code| Error Message | + /// |---|---| + /// |10729|invalid api name| + /// |10725|extra data too long| + /// |10720|achievement is not exist| + /// |10723|load achievement data failed| + /// |10726|achievement is unreleased| + /// |10727|achievement is archived| + /// |10722|no write permission| + /// |10736|invalid parameter| + /// |10735|invalid extra data| + /// |10728|achievement is unlocked| + /// |10724|save achievement data failed| + /// + /// A message of type `MessageType.Achievements_Unlock` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `AchievementUpdate`. + /// Extract the payload from the message handle with `Message.Data`. + /// + /// `AchievementUpdate` contains the following: + /// * `JustUnlocked`: Whether the achievement has been successfully unlocked. + /// * `Name`: The API name of the achievement. + /// + public static Task Unlock(string name, byte[] extraData) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + GCHandle hobj = GCHandle.Alloc(extraData, GCHandleType.Pinned); + IntPtr pobj = hobj.AddrOfPinnedObject(); + var result = new Task(CLIB.ppf_Achievements_Unlock(name, pobj, (uint) (extraData != null ? extraData.Length : 0))); + if (hobj.IsAllocated) + hobj.Free(); + return result; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Achievements.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Achievements.cs.meta new file mode 100644 index 0000000..b75e14a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Achievements.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cc57c56aed09492bb5ddfa820fcd982c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Application.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Application.cs new file mode 100644 index 0000000..308e86e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Application.cs @@ -0,0 +1,209 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using Pico.Platform.Models; +using UnityEngine; +using SystemInfo = Pico.Platform.Models.SystemInfo; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + * + * ApplicationService provides functions like launch other application,jump to store, get launch details. + */ + public static class ApplicationService + { + /// + /// Launches another app by app package name. + /// @note If the user does not have that app installed, the user will be directed to the app's download page on the PICO Store. + /// + /// The package name of the to-be-launched app. + /// The options for launching the app. Pass `null` or leave this parameter empty. + /// If something goes wrong, a description message will be returned. + public static Task LaunchApp(string packageName, ApplicationOptions options = null) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Application_LaunchOtherApp(packageName, (IntPtr) options)); + } + + /// + /// Launches another app by app ID. + /// @note If the user does not have that app installed, the user will be directed to the app's download page on the PICO Store. + /// + /// The ID of the to-be-launched app. + /// The options for launching the app. Pass `null` or leave this parameter empty. + /// If something goes wrong, a description message will be returned. + public static Task LaunchAppByAppId(string appId, ApplicationOptions options = null) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Application_LaunchOtherAppByAppID(appId, (IntPtr) options)); + } + + /// + /// Launches the PICO Store app and go to the current app's details page. + /// + /// You can direct user to the PICO Store to upgrade the installed app by this + /// method. To judge whether there is a new version in the PICO Store, you can call + /// \ref GetVersion. + /// + /// @note + /// * If the current app has never published in the PICO Store, the response error code is non-zero. + /// * The current app will quit once the PICO Store app is launched. + /// + /// + /// A string that describes the launch info. + public static Task LaunchStore() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Application_LaunchStore()); + } + + /// + /// Gets the app's current version info and the latest version info. + /// + /// You can compare the current version info and the latest version info, and + /// then decide whether to call \ref LaunchStore to direct users to the current app's details page to upgrade the app. + /// + /// The response will contain the latest version info in the PICO Store + /// and the app's current version info. + /// + public static Task GetVersion() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Application_GetVersion()); + } + + /// + /// Gets the details about an app launch event. + /// + /// App launch details, including `LaunchResult` and `LaunchType`: + /// * `LaunchResult`: + /// * `0`: Unknown + /// * `1`: Success + /// * `2`: FailedRoomFull + /// * `3`: FailedGameAlreadyStarted + /// * `4`: FailedRoomNotFound + /// * `5`: FailedUserDeclined + /// * `6`: FailedOtherReason + /// * `LaunchType`: + /// * `0`: Unknown + /// * `1`: Normal + /// * `2`: Invite + /// * `3`: Coordinated + /// * `4`: Deeplink + /// + public static LaunchDetails GetLaunchDetails() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new LaunchDetails(CLIB.ppf_ApplicationLifecycle_GetLaunchDetails()); + } + + /// + /// Gets the device's system information synchronously. + /// + /// A structure contains the device's system information, including the device's system version, language code, + /// country/region code, product name, and more. + public static SystemInfo GetSystemInfo() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new SystemInfo(CLIB.ppf_Application_GetSystemInfo()); + } + + /// + /// Logs whether a user has been successfully directed to the desired destination via a deep link. + /// + /// The tracking ID of the app launch event. + /// The app launch result: + /// * `0`: Unknown + /// * `1`: Success + /// * `2`: FailedRoomFull + /// * `3`: FailedGameAlreadyStarted + /// * `4`: FailedRoomNotFound + /// * `5`: FailedUserDeclined + /// * `6`: FailedOtherReason + /// + public static void LogDeeplinkResult(string trackId, LaunchResult result) + { + CLIB.ppf_ApplicationLifecycle_LogDeeplinkResult(trackId, result); + } + + /// + /// When the launch intent is changed, you will receive this notification. + /// Then you can call \ref GetLaunchDetails to retrieve the launch details. + /// + /// The callback function. + public static void SetLaunchIntentChangedCallback(Message.Handler callback) + { + Looper.RegisterNotifyHandler(MessageType.Notification_ApplicationLifecycle_LaunchIntentChanged, callback); + } + } + + + public class ApplicationOptions + { + public ApplicationOptions() + { + Handle = CLIB.ppf_ApplicationOptions_Create(); + } + + + public void SetDeeplinkMessage(string value) + { + CLIB.ppf_ApplicationOptions_SetDeeplinkMessage(Handle, value); + } + + /// For passing to native C + public static explicit operator IntPtr(ApplicationOptions options) + { + return options?.Handle ?? IntPtr.Zero; + } + + ~ApplicationOptions() + { + CLIB.ppf_ApplicationOptions_Destroy(Handle); + } + + readonly IntPtr Handle; + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Application.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Application.cs.meta new file mode 100644 index 0000000..2d8ca85 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Application.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d95f2760768458048bb7e3ea645369ef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/AssetFile.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/AssetFile.cs new file mode 100644 index 0000000..c57299e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/AssetFile.cs @@ -0,0 +1,251 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + * + * Downloadable content (DLC) represents the contents/files such as expansion packs that users can purchase and download, which can help grow your revenue. Each DLC is associated with an add-on and has an individual SKU as its unique identifier. Users must purchase the app before purchasing the DLCs provided in it. DLCs are downloadable in apps only. + * + * DLC enables you to update your app in a more flexible and lightweight way. Once you want to update the content for a published app, you only need to upload new resources such as levels and cosmetics as DLCs on the PICO Developer Platform, but do not need to upload a new build. Users can thereby purchase, download, and experience the latest resources without having to update or reinstall your app. + */ + public static class AssetFileService + { + /// + /// Deletes an installed asset file by asset file ID. The corresponding + /// asset file will be removed from the device. + /// + /// The ID of the asset file to delete. + /// + /// An object containing the asset file ID, asset file name, and a success flag. + /// + public static Task DeleteById(ulong assetFileId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_AssetFile_DeleteById(assetFileId)); + } + + /// + /// Deletes an installed asset file by asset file name. The corresponding + /// asset file will be removed from the device. + /// + /// The name of the asset file to delete. + /// + /// An object containing the asset file ID, asset file name, and a success flag. + /// + public static Task DeleteByName(string assetFileName) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_AssetFile_DeleteByName(assetFileName)); + } + + /// + /// Downloads an asset file by asset file ID. + /// + /// The ID of the asset file to download. + /// + /// An object containing the asset file ID and asset file name. + /// + /// If the response returns code `0`, the download will start and + /// the system will periodically push information about the download progress. + /// If the user has not purchased the asset file, a non-zero error code will be returned. + /// + public static Task DownloadById(ulong assetFileId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_AssetFile_DownloadById(assetFileId)); + } + + /// + /// Downloads an asset file by asset file name. + /// + /// The name of the asset file to download. + /// + /// An object containing the asset file ID and asset file name. + /// + /// If the response returns code `0`, the download will start and + /// the system will periodically push information about the download progress. + /// If the user has not purchased the asset file, a non-zero error code will be returned. + /// + public static Task DownloadByName(string assetFileName) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_AssetFile_DownloadByName(assetFileName)); + } + + /// + /// Cancels the download of an asset file by asset file ID. + /// + /// + /// The ID of the asset file to cancel download for. + /// + /// An object contains the asset file ID, asset file name, and a success flag. + /// + public static Task DownloadCancelById(ulong assetFileId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_AssetFile_DownloadCancelById(assetFileId)); + } + + /// + /// Cancels the download of an asset file by asset file name. + /// + /// + /// The name of the asset file to cancel download for. + /// + /// An object contains the asset file ID, asset file name, and a success flag. + /// + public static Task DownloadCancelByName(string assetFileName) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_AssetFile_DownloadCancelByName(assetFileName)); + } + + /// + /// Gets the download status of an asset file by asset file ID. + /// + /// The ID of the asset file to get the download status for. + /// + /// An object containing the asset file ID, asset file name, and whether the asset file is downloaded. + /// + public static Task StatusById(ulong assetId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_AssetFile_StatusById(assetId)); + } + + /// + /// Gets the download status of an asset file by asset file name. + /// + /// The name of the asset file to get the download status for. + /// + /// An object containing the asset file ID, asset file name, and whether the asset file is downloaded. + /// + public static Task StatusByName(string assetFileName) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_AssetFile_StatusByName(assetFileName)); + } + + /// + /// Gets the asset file list. + /// + /// + /// An asset file list. Each `AssetDetails` contains fields indicating + /// whether an asset file is purchased or downloaded. + /// + public static Task GetList() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_AssetFile_GetList()); + } + + /// + /// Gets the next page of the asset file list. + /// + /// The current page of the asset file list. + /// The next page of the asset file list. + public static Task GetNextAssetDetailsListPage(AssetDetailsList list) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (!list.HasNextPage) + { + Debug.LogWarning("GetNextAssetDetailsListPage: List has no next page"); + return null; + } + + if (String.IsNullOrEmpty(list.NextPageParam)) + { + Debug.LogWarning("GetNextAssetDetailsListPage: list.NextPageParam is empty"); + return null; + } + + return new Task(CLIB.ppf_AssetFile_GetNextAssetDetailsArrayPage(list.NextPageParam)); + } + + /// + /// This notification is used to track the download progress of asset file. + /// The `Transferred` field indicates the number of bytes downloaded. + /// The `CompleteStatus` field indicates the download status. + /// + /// The callback function. + public static void SetOnDownloadUpdateCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_AssetFile_DownloadUpdate, handler); + } + + /// + /// If the downloaded asset file is different from the original one, + /// the asset file will be automatically removed, and the app will receive a notification. + /// + /// The callback function. + public static void SetOnDeleteForSafetyCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_AssetFile_DeleteForSafety, handler); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/AssetFile.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/AssetFile.cs.meta new file mode 100644 index 0000000..485f26e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/AssetFile.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1b713a81e59d43a3a50d0dc59b3fda40 +timeCreated: 1661772509 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Challenges.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Challenges.cs new file mode 100644 index 0000000..85c3077 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Challenges.cs @@ -0,0 +1,232 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + * + * Challenges create fun-to-join competitions among users, which + * can therefore provide users with more opportunities to interact + * with others. Challenges are asynchronous events, so users do not + * have to be online and do challenges at the same time. + + * Both you and your app's users are able to create challenges, + * configure challenge settings (including name, visibility, start + * time, and end time), and invite friends to join challenges to + * have fun together. Users can also join the challenges created + * by PICO. + */ + public static class ChallengesService + { + /// Invites specified user(s). + /// The ID of the challenge to which user(s) are invited. + /// The ID(s) of the user(s) to invite. + /// Returns the `Challenge` struct that contains the information about the challenge, + /// such as challenge ID, the leaderboard the challenge belongs to, the challenge's end date and start date, etc. + public static Task Invite(UInt64 challengeID, string[] userID) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Challenges_Invites(challengeID, userID)); + } + + + /// Gets the information for a specified challenge. + /// The ID of the challenge to get information for. + /// Returns the `Challenge` struct that contains the information about the challenge, + /// such as challenge ID, the leaderboard the challenge belongs to, the challenge's end date and start date, etc. + public static Task Get(UInt64 challengeID) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Challenges_Get(challengeID)); + } + + /// Gets a list of challenge entries. + /// The ID of the challenge whose entries are to be returned. + /// Restricts the scope of entries to return: + /// * `0`: None (returns all entries of the specified leaderboard) + /// * `1`: Friends (returns the entries of the friends of the current logged-in user) + /// * `2`: Unknown (returns no entry) + /// * `3`: UserIds (returns the entries of specified users) + /// + /// Defines where to start returning challenge entries, the enumerations are: + /// * `0`: Top (return entries from top 1) + /// * `1`: CenteredOnViewer (place the current logged-in user's entry in the middle of the list on the first page. + /// For example, if the total number of entries is 10, `pageSize` is set to `5`, and the user's rank is top 5, the ranks displayed + /// on the first page will be top 3, 4, 5, 6, and 7. Top 1 and 2 will not be displayed, and top 8, 9, and 10 will be + /// displayed on the second page) + /// * `2`: CenteredOnViewerOrTop (place the current logged-in user's entry on the top of the list on the first page. + /// For example, if the total number of entries is 10, `pageSize` is set to `5`, and the user's rank is top 5, + /// the ranks displayed on the first page will be top 5, 6, 7, 8, and 9. Top 1, 2, 3, and 4 will not be displayed, + /// and top 10 will be displayed on the second page) + /// * `3`: Unknown (returns an empty list) + /// + /// Defines which page of entries to return. The first page index is `0`. + /// For example, if you want to get the first page of entries, pass `0`; if you want to get the second page of entries, pass `1`. + /// + /// Defines the number of entries to return on the page. + /// Returns a list of matching entries. + public static Task GetEntries(UInt64 challengeID, + LeaderboardFilterType filter, LeaderboardStartAt startAt, int pageIdx, int pageSize) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task( + CLIB.ppf_Challenges_GetEntries(challengeID, filter, startAt, pageIdx, pageSize)); + } + + /// Gets a list of challenge entries after a specified rank. + /// The ID of the challenge whose entries are to be returned. + /// Defines the rank after which the entries are to be returned. + /// Defines which page of entries to return. The first page index is `0`. + /// For example, if you want to get the first page of entries, pass `0`; if you want to get the second page of entries, pass `1`. + /// + /// Defines the number of entries to return on each page. + /// Returns a list of matching entries. + public static Task GetEntriesAfterRank(UInt64 challengeID, + ulong afterRank, int pageIdx, int pageSize) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task( + CLIB.ppf_Challenges_GetEntriesAfterRank(challengeID, afterRank, pageIdx, pageSize)); + } + + /// Gets a list of challenge entries for specified users. + /// The ID of the challenge whose entries are to be returned. + /// Defines where to start returning challenge entries, the enumerations are: + /// * `0`: Top (return entries from top 1) + /// * `1`: CenteredOnViewer (place the current logged-in user's entry in the middle of the list on the first page. + /// For example, if the total number of entries is 10, `pageSize` is set to `5`, and the user's rank is top 5, the ranks displayed + /// on the first page will be top 3, 4, 5, 6, and 7. Top 1 and 2 will not be displayed, and top 8, 9, and 10 will be + /// displayed on the second page) + /// * `2`: CenteredOnViewerOrTop (place the current logged-in user's entry on the top of the list on the first page. + /// For example, if the total number of entries is 10, `pageSize` is set to `5`, and the user's rank is top 5, + /// the ranks displayed on the first page will be top 5, 6, 7, 8, and 9. Top 1, 2, 3, and 4 will not be displayed, + /// and top 10 will be displayed on the second page) + /// * `3`: Unknown (returns an empty list) + /// + /// Defines a list of user IDs to get entries for. + /// Defines which page of entries to return. The first page index is `0`. + /// For example, if you want to get the first page of entries, pass `0`; if you want to get the second page of entries, pass `1`. + /// + /// Defines the number of entries to return on each page. + /// Returns a list of matching entries. + public static Task GetEntriesByIds(UInt64 challengeID, + LeaderboardStartAt startAt, string[] userIDs, int pageIdx, int pageSize) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Challenges_GetEntriesByIds(challengeID, startAt, userIDs, pageIdx, pageSize)); + } + + /// Gets a list of challenges. + /// Restricts the scope of challenges to return. You can define the start date and + /// end date of challenges, the leaderboard the challenges belong to, etc. + /// + /// Defines which page of challenges to return. The first page index is `0`. + /// For example, if you want to get the first page of entries, pass `0`; if you want to get the second page of entries, pass `1`. + /// + /// Defines the number of challenges to return on each page. + /// Returns a list of matching challenges. + public static Task GetList(ChallengeOptions challengeOptions, int pageIdx, int pageSize) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Challenges_GetList((IntPtr) challengeOptions, pageIdx, pageSize)); + } + + /// Lets the current user join a challenge. + /// The ID of the challenge to join. + /// Returns the `Challenge` struct that contains the information about the challenge, + /// such as challenge ID, the leaderboard the challenge belongs to, the challenge's end date and start date, etc. + public static Task Join(UInt64 challengeID) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Challenges_Join(challengeID)); + } + + /// Lets the current user leave a challenge. + /// The ID of the challenge to leave. + /// Returns the `Challenge` struct that contains the information about the challenge, + /// such as challenge ID, the leaderboard the challenge belongs to, the challenge's end date and start date, etc. + public static Task Leave(UInt64 challengeID) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Challenges_Leave(challengeID)); + } + + /// Launches the invitation flow to let the current user invite friends to a specified challenge. + /// This launches the system default invite UI where all of the user's friends are displayed. + /// This is intended to be a shortcut for developers not wanting to build their own invite-friends UI. + /// The ID of the challenge. + public static Task LaunchInvitableUserFlow(UInt64 challengeID) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Challenges_LaunchInvitableUserFlow(challengeID)); + } + + /// Sets the callback to get notified when the user has accepted an invitation. + /// @note You can get the ChallengeID by 'Message.Data'. + /// + /// The callback function will be called when receiving the `Notification_Challenge_LaunchByInvite` message. + public static void SetChallengeInviteAcceptedOrLaunchAppNotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Challenge_LaunchByInvite, handler); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Challenges.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Challenges.cs.meta new file mode 100644 index 0000000..82f11a7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Challenges.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 31e084e3699a42aab6084064d4789f2d +timeCreated: 1664349933 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/CloudStorage.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/CloudStorage.cs new file mode 100644 index 0000000..7e18ec0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/CloudStorage.cs @@ -0,0 +1,26 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +namespace Pico.Platform +{ + public class CloudStorageService + { + /// + /// Starts cloud data backup whenever needed. + /// + /// Returns nothing for a success, otherwise returns error information. + public static Task StartNewBackup() + { + return new Task(CLIB.ppf_CloudStorage_StartNewBackup()); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/CloudStorage.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/CloudStorage.cs.meta new file mode 100644 index 0000000..ad74883 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/CloudStorage.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ca8e54478ee44174dac9eb355d755c7f +timeCreated: 1679484591 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Compliance.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Compliance.cs new file mode 100644 index 0000000..d442728 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Compliance.cs @@ -0,0 +1,47 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + * Application or games need comply with the laws where they distributes. So developers + * should take compliance into consideration. This module provides some useful methods + * to implement compliance. + */ + public static class ComplianceService + { + /// + /// Detects sensitive words in texts. + /// + /// Indicates where the text appears. For example, the text can appear in a username, room name, in-room chat, etc. + /// The text to check, which can be a username, room-chat message, etc. + /// + /// Whether the text contains sensitive words. If it contains, the app should not allow + /// the user to publish the text and can take the strategy proposed by the + /// result. + /// + public static Task DetectSensitive(DetectSensitiveScene scene, string content) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Compliance_DetectSensitive(scene, content)); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Compliance.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Compliance.cs.meta new file mode 100644 index 0000000..0cae019 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Compliance.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 18f2fcae6c334637ae67cdb01c26dab2 +timeCreated: 1679567015 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Core.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Core.cs new file mode 100644 index 0000000..53c3688 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Core.cs @@ -0,0 +1,256 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.IO; +using System.Runtime.CompilerServices; +using Pico.Platform.Framework; +using Unity.XR.PXR; +using UnityEngine; + +[assembly: InternalsVisibleTo("Assembly-CSharp-Editor")] + +namespace Pico.Platform +{ + /** + * \defgroup Platform Services + */ + /** + * \ingroup Platform + * + */ + public static class CoreService + { + public static bool Initialized = false; + public static string NotInitializedError = "Platform SDK has not been initialized!"; + + /// Gets whether the Platform SDK has been initialized. + /// + /// * `true`: initialized + /// * `false`: not initialized + /// + public static bool IsInitialized() + { + return Initialized; + } + + /// + /// Gets the app ID for the current app. + /// + /// The app ID. + /// If the app ID cannot be found, this exception will be thrown. + public static string GetAppID(string appId = null) + { + string configAppID = PXR_PlatformSetting.Instance.appID.Trim(); + if (!string.IsNullOrWhiteSpace(appId) && !string.IsNullOrWhiteSpace(configAppID) && appId != configAppID) + { + throw new UnityException("The parameter appId is inconsistent with the configured appId"); + } + + if (!string.IsNullOrWhiteSpace(appId)) + { + return appId; + } + + if (!string.IsNullOrWhiteSpace(configAppID)) + { + return configAppID; + } + + throw new UnityException("Cannot find appId"); + } + + /// + /// Initializes the Platform SDK asynchronously. + /// + /// The app ID for the Platform SDK. If not provided, Unity editor configuration will be applied. + /// The initialization result. + /// If the input app ID is null or empty or if the initialization fails, this exception will be thrown. + /// If the current platform is not supported, this exception will be thrown. + public static Task AsyncInitialize(string appId = null) + { + if (Initialized) + { + return new Task(0); + } + + appId = GetAppID(appId); + if (String.IsNullOrWhiteSpace(appId)) + { + throw new UnityException("AppID cannot be null or empty"); + } + + Task task; + if (Application.platform == RuntimePlatform.Android) + { + AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity"); + var requestId = CLIB.ppf_InitializeAndroidAsynchronous(appId, activity.GetRawObject(), IntPtr.Zero); + if (requestId == 0) + { + throw new Exception("PICO PlatformSDK failed to initialize"); + } + + task = new Task(requestId); + } + else if ((Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor)) + { + var config = Resources.Load("PicoSdkPCConfig"); + var logDirectory = Path.GetFullPath("Logs"); + if (config == null) + { + throw new UnityException($"cannot find PC config file Resources/PicoSdkPCConfig"); + } + + if (!Directory.Exists(logDirectory)) + { + Directory.CreateDirectory(logDirectory); + } + + var requestId = CLIB.ppf_PcInitAsynchronousWrapper(appId, config.text, logDirectory); + if (requestId == 0) + { + throw new Exception("PICO PlatformSDK failed to initialize"); + } + else + { + task = new Task(requestId); + } + } + else + { + throw new NotImplementedException("PICO platform is not implemented on this platform yet."); + } + + Initialized = true; + Runner.RegisterGameObject(); + return task; + } + + /// + /// Initializes the Platform SDK synchronously. + /// + /// The app ID for the Platform SDK. If not provided, Unity editor configuration will be applied. + /// If the current platform is not supported, this exception will be thrown. + /// If the initialization fails, this exception will be thrown. + public static void Initialize(string appId = null) + { + if (Initialized) + { + return; + } + + appId = GetAppID(appId); + if (String.IsNullOrWhiteSpace(appId)) + { + throw new UnityException("AppID must not be null or empty"); + } + + PlatformInitializeResult initializeResult; + if (Application.platform == RuntimePlatform.Android) + { + AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic("currentActivity"); + + initializeResult = CLIB.ppf_InitializeAndroid(appId, activity.GetRawObject(), IntPtr.Zero); + + if (initializeResult == PlatformInitializeResult.Success || + initializeResult == PlatformInitializeResult.AlreadyInitialized) + { + Initialized = true; + } + } + else if ((Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor)) + { + var config = Resources.Load("PicoSdkPCConfig"); + if (config == null) + { + throw new UnityException($"cannot find PC config file Resources/PicoSdkPCConfig"); + } + + var logDirectory = Path.GetFullPath("Logs"); + if (!Directory.Exists(logDirectory)) + { + Directory.CreateDirectory(logDirectory); + } + + initializeResult = CLIB.ppf_PcInitWrapper(appId, config.text, logDirectory); + if (initializeResult == PlatformInitializeResult.Success || + initializeResult == PlatformInitializeResult.AlreadyInitialized) + { + Initialized = true; + } + } + else + { + throw new NotImplementedException("PICO platform is not implemented on this platform yet."); + } + + if (!Initialized) + { + throw new UnityException($"PICO Platform failed to initialize:{initializeResult}."); + } + + Runner.RegisterGameObject(); + } + + /** + * \overload Task GameInitialize(string accessToken) + */ + /// + /// Initializes game-related modules, such as room, matchmaking, and network. + /// + /// The access token of Platform SDK. You can get the access token by calling `UserService.GetAccessToken()`. + public static Task GameInitialize(string accessToken) + { + if (Initialized) + { + return new Task(CLIB.ppf_Game_InitializeWithToken(accessToken)); + } + + Debug.LogError(NotInitializedError); + return null; + } + + /** + * \overload Task GameInitialize() + */ + /// + /// Initializes modules without token related with game, such as room, matchmaking, and net. + /// + public static Task GameInitialize() + { + if (Initialized) + { + return new Task(CLIB.ppf_Game_InitializeAuto()); + } + + Debug.LogError(NotInitializedError); + return null; + } + + /// + /// Uninitializes game-related modules, such as room, matchmaking, and network. + /// + /// + /// * `true`: success + /// * `false`: failure + /// + public static bool GameUninitialize() + { + if (Initialized) + { + return CLIB.ppf_Game_UnInitialize(); + } + + return false; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Core.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Core.cs.meta new file mode 100644 index 0000000..4a63a48 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Core.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 496980589199efc479aff90a62629be7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Highlight.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Highlight.cs new file mode 100644 index 0000000..2bf0db9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Highlight.cs @@ -0,0 +1,139 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + public class HighlightService + { + /// + /// Starts a new session. Before using screen recording and capturing-related functions, make sure you are in a session. + /// + /// The session ID, which is a string. + public static Task StartSession() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Highlight_StartSession()); + } + + /// + /// Captures the screen. + /// + /// The information about this capture, including image path and job ID. + public static Task CaptureScreen() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Highlight_CaptureScreen()); + } + + /// + /// Starts recording the screen. + /// + public static Task StartRecord() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Highlight_StartRecord()); + } + + /// + /// Stops recording the screen. + /// + /// The infomraiton about this recording, including video path, video duration, video size, and job ID. + public static Task StopRecord() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Highlight_StopRecord()); + } + + /// + /// Lists all the media resources for a session. + /// + /// Passes the ID of the session which is returned by `StartSession`. + /// The information about the images captured and videos recorded during this session. + public static Task ListMedia(string sessionId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Highlight_ListMedia(sessionId)); + } + + /// + /// Saves an image or a video to the device's local storage. + /// + /// Passes the ID of the screen-capturing or screen-recording task where the image or video is created. + /// Passes the ID of the session where the task takes place. + /// The job ID and session ID of the image or video saved. + public static Task SaveMedia(string jobId, string sessionId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Highlight_SaveMedia(jobId, sessionId)); + } + + /// + /// Shares an image or a video to the social media on the mobile phone. + /// + /// Passes the ID of the screen-capturing or screen-recording task where the image or video is created. + /// Passes the ID of the session where the task takes place. + /// The job ID and session ID of the image or video shared. + public static Task ShareMedia(string jobId, string sessionId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Highlight_ShareMedia(jobId, sessionId)); + } + + /// + /// The maiximum duration for a video is 15 minutes. + /// After the `StartRecord` function is called, if the `StopRecord` function is not called in time or if the recording is ended due to other causes, the system will automatically stop recording and return the recording information. + /// + /// Returns the recording information. + public static void SetOnRecordStopHandler(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Highlight_OnRecordStop, handler); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Highlight.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Highlight.cs.meta new file mode 100644 index 0000000..43ccdcb --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Highlight.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 49c5348fb263404a8d2d84556f274a40 +timeCreated: 1686138735 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/IAP.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/IAP.cs new file mode 100644 index 0000000..756f1b9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/IAP.cs @@ -0,0 +1,208 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + * + * You can diversify user experience and grow your revenue by selling + * products such as cosmetics, props, and coins/diamonds within your + * app. The PICO Unity Integration SDK provides In-App Purchase (IAP) + * service which enables users to purchase products within your app. + * The IAP service packages a series of payments systems such as Alipay, + * bank card, and Paypal, thereby providing you with a one-stop + * multi-payment-method solution. + */ + public static class IAPService + { + /// + /// Records the order fulfillment result for a consumable. + /// @note Users are unable to repurchase the same comsumable until the previous order is fulfilled. + /// + /// The SKU of the add-on to fulfill. + public static Task ConsumePurchase(string sku) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_IAP_ConsumePurchase(sku)); + } + + /// Gets a list of purchasable add-ons in the current app. + /// The SKUs of the add-ons to retrieve. If this parameter is empty, all purchasable add-ons will be returned. + /// A list of purchasable add-ons with their information, including the description, price, SKU, and more. + public static Task GetProductsBySKU(string[] skus) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (skus == null) + { + skus = Array.Empty(); + } + + return new Task(CLIB.ppf_IAP_GetProductsBySKU(skus)); + } + + /// Gets a list of purchased add-ons for a user, including durables and unfilfilled consumables. + /// A list of the user's purchased add-ons. + public static Task GetViewerPurchases() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_IAP_GetViewerPurchases()); + } + + /// @deprecated LaunchCheckoutFlow(string sku,string price,string currency) can be replaced by \ref LaunchCheckoutFlow2(Product product) + /// + /// Launches the checkout flow for a user to make a payment. + /// \note This method doesn't support subscription add-ons, you need to + /// use \ref LaunchCheckoutFlow2 instead. + /// + /// The SKU of the product the user wants to purchase. + /// The price for the product. + /// The currency of the payment. + /// Returns the purchased product if the user successfully pays the money. + /// Otherwise the purchase will be null. You can get the failure reason from the returned error code and error message. + [Obsolete("Please use LaunchCheckoutFlow2(Product product)", false)] + public static Task LaunchCheckoutFlow(string sku, string price, string currency) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_IAP_LaunchCheckoutFlow(sku, price, currency)); + } + + /// + /// Launches the checkout flow for a user to make a payment. + /// + /// The add-on's information which can be acquired by \ref GetProductsBySKU. + /// + /// Returns the purchased add-on if the user successfully makes the payment. + /// Otherwise the purchase will be null. You can get the failure reason from the returned error code and error message. + /// + public static Task LaunchCheckoutFlow2(Product product) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_IAP_LaunchCheckoutFlowV2(product.SKU, product.Price, product.Currency, product.OuterId)); + } + + /// + /// Launches the checkout flow for a user to make a payment. + /// + /// The add-on's information which can be acquired by \ref GetProductsBySKU. + /// + /// The comment for the order. If the user successfully purchases this add-on, + /// The order's comment can be accessed in \ref Purchase. The length of this field cannot exceed 1024 bytes in UTF-8 encoding. + /// + /// Returns the purchased add-on if the user successfully makes the payment. + /// Otherwise the purchase will be null. You can get the failure reason from the returned error code and error message. + /// + public static Task LaunchCheckoutFlow3(Product product, string orderComment) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_IAP_LaunchCheckoutFlowV3(product.SKU, product.Price, product.Currency, product.OuterId, orderComment)); + } + + /// + /// Gets the subscription status of a subscription add-on. + /// + /// The SKU of the add-on. + /// + /// The subscription status of the add-on. If the user is not entitled to access the add-on, the result will be an empty struct. + /// + public static Task GetSubscriptionStatus(string sku) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_IAP_GetSubscriptionStatus(sku)); + } + + /// + /// Gets the next page of purchasable add-ons. + /// + /// The current page of purchasable add-ons. + /// The next page of purchasable add-ons. + public static Task GetNextProductListPage(ProductList list) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (!list.HasNextPage) + { + Debug.LogWarning("Pico.Platform.GetNextProductListPage: List has no next page"); + return null; + } + + return new Task( + CLIB.ppf_IAP_GetNextProductArrayPage(list.NextPageParam) + ); + } + + /// + /// Gets the next page of purchased add-ons. + /// + /// The current page of purchased add-ons. + /// The next page of purchased add-ons. + public static Task GetNextPurchaseListPage(PurchaseList list) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (!list.HasNextPage) + { + Debug.LogWarning("Pico.Platform.GetNextPurchaseListPage: List has no next page"); + return null; + } + + return new Task(CLIB.ppf_IAP_GetNextPurchaseArrayPage(list.NextPageParam)); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/IAP.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/IAP.cs.meta new file mode 100644 index 0000000..f56afe6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/IAP.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e074c6a46e5d441b80ada0813183cb79 +timeCreated: 1655278625 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Leaderboard.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Leaderboard.cs new file mode 100644 index 0000000..313a0a7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Leaderboard.cs @@ -0,0 +1,275 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Runtime.InteropServices; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + * Leaderboard is one of the basic and important features of an app. + * By displaying users' rankings in a multi-dimensional approach, leaderboards can give rise to a competitive atmosphere among users in specific scenarios such as gaming, drive users to improve their skills, and therefore increase app engagement. You can also use leaderboards to promote the app and attract new users. + * Currently, Leaderboard service offers the following key features: + * * Create leaderboards + * * Get leaderboard data + * * Update leaderboard data + */ + public static class LeaderboardService + { + /// Gets the information for a specified leaderboard. + /// + /// The name of the leaderboard to get information for. + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `LeaderboardList`. + /// | Error Code| Error Message | + /// |---|---| + /// |10701|request server failed| + /// |10703|checking parameter failed| + /// |10704|leaderboard is not exist| + /// + /// A message of type `MessageType.Leaderboard_Get` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `LeaderboardList`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task Get(string leaderboardName) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Leaderboard_Get(leaderboardName)); + } + + /// Gets a list of entries. + /// + /// The name of the leaderboard whose entries are to be returned. + /// The number of entries to return on each page. + /// Defines which page of entries to return. The first page index is `0`. + /// For example, if you want to get the first page of entries, pass `0`; if you want to get the second page of entries, pass `1`. + /// + /// Restricts the scope of entries to return: + /// * `0`: None (returns all entries of the specified leaderboard) + /// * `1`: Friends (returns the entries of the friends of the current logged-in user) + /// * `2`: Unknown (returns no entry) + /// * `3`: UserIds (returns the entries of specified users) + /// + /// Defines where to start returning leaderboard entries, the enumerations are: + /// * `0`: Top (return entries from top 1) + /// * `1`: CenteredOnViewer (place the current logged-in user's entry in the middle of the list on the first page. + /// For example, if the total number of entries is 10, `pageSize` is set to `5`, and the user's rank is top 5, the ranks displayed + /// on the first page will be top 3, 4, 5, 6, and 7. Top 1 and 2 will not be displayed, and top 8, 9, and 10 will be + /// displayed on the second page) + /// * `2`: CenteredOnViewerOrTop (place the current logged-in user's entry on the top of the list on the first page. + /// For example, if the total number of entries is 10, `pageSize` is set to `5`, and the user's rank is top 5, + /// the ranks displayed on the first page will be top 5, 6, 7, 8, and 9. Top 1, 2, 3, and 4 will not be displayed, + /// and top 10 will be displayed on the second page) + /// * `3`: Unknown (returns an empty list) + /// + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `LeaderboardEntryList`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006501|request server failed| + /// |3006503|checking parameter failed| + /// |3006504|leaderboard is not exist| + /// |3006506|load leaderboard data failed| + /// |3006509|get friend failed| + /// |3006510|get user account failed| + /// + /// A message of type `MessageType.Leaderboard_GetEntries` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `LeaderboardEntryList`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task GetEntries(string leaderboardName, int pageSize, int pageIdx, LeaderboardFilterType filter, LeaderboardStartAt startAt) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Leaderboard_GetEntries(leaderboardName, pageSize, pageIdx, filter, startAt)); + } + + /// Gets a list of entries after a specified rank. + /// + /// The name of the leaderboard whose entries are to be returned. + /// The number of entries to return on each page. + /// Defines which page of entries to return. The first page index is `0`. + /// For example, if you want to get the first page of entries, pass `0`; if you want to get the second page of entries, pass `1`. + /// + /// Defines after which rank to return entries. + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `LeaderboardEntryList`. + /// | Error Code| Error Message | + /// |---|---| + /// |10701|request server failed| + /// |10703|checking parameter failed| + /// |10704|leaderboard is not exist| + /// |10706|load leaderboard data failed| + /// |10709|get friend failed| + /// |10710|get user account failed| + /// + /// A message of type `MessageType.Leaderboard_GetEntriesAfterRank` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `LeaderboardEntryList`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task GetEntriesAfterRank(string leaderboardName, int pageSize, int pageIdx, + ulong afterRank) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task( + CLIB.ppf_Leaderboard_GetEntriesAfterRank(leaderboardName, pageSize, pageIdx, afterRank)); + } + + /// Gets a list of entries for specified users. + /// + /// The name of the leaderboard whose entries are to be returned. + /// The number of entries to return on each page. + /// Defines which page of entries to return. The first page index is `0`. + /// For example, if you want to get the first page of entries, pass `0`; if you want to get the second page of entries, pass `1`. + /// + /// Defines where to start returning leaderboard entries, the enumerations are: + /// * `0`: Top (return entries from top 1) + /// * `1`: CenteredOnViewer (place the current logged-in user's entry in the middle of the list on the first page. + /// For example, if the total number of entries is 10, `pageSize` is set to `5`, and the user's rank is top 5, the ranks displayed + /// on the first page will be top 3, 4, 5, 6, and 7. Top 1 and 2 will not be displayed, and top 8, 9, and 10 will be + /// displayed on the second page) + /// * `2`: CenteredOnViewerOrTop (place the current logged-in user's entry on the top of the list on the first page. + /// For example, if the total number of entries is 10, `pageSize` is set to `5`, and the user's rank is top 5, + /// the ranks displayed on the first page will be top 5, 6, 7, 8, and 9. Top 1, 2, 3, and 4 will not be displayed, + /// and top 10 will be displayed on the second page) + /// * `3`: Unknown (returns an empty list) + /// + /// The ID list of the users to get entries for. + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `LeaderboardEntryList`. + /// | Error Code| Error Message | + /// |---|---| + /// |10701|request server failed| + /// |10703|checking parameter failed| + /// |10704|leaderboard is not exist| + /// |10706|load leaderboard data failed| + /// |10709|get friend failed| + /// |10710|get user account failed| + /// + /// A message of type `MessageType.Leaderboard_GetEntriesByIds` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `LeaderboardEntryList`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task GetEntriesByIds(string leaderboardName, int pageSize, int pageIdx, + LeaderboardStartAt startAt, string[] userIDs) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Leaderboard_GetEntriesByIds(leaderboardName, + pageSize, pageIdx, startAt, userIDs)); + } + + /// Writes an entry to a leaderboard. + /// + /// The name of the leaderboard to write an entry to. + /// The score to write. + /// A 2KB custom data field that is associated with the leaderboard entry. This can be a game replay or anything that provides more details about the entry to the viewer. + /// Defines whether to force update the score. If set to `true`, the score always updates even if it is not the user's best score. + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `bool`. + /// | Error Code| Error Message | + /// |---|---| + /// |10701|request server failed| + /// |10703|checking parameter failed| + /// |10704|leaderboard is not exist| + /// |10705|no write permission| + /// |10706|load leaderboard data failed| + /// |10707|save leaderboard data failed| + /// |10708|extra data too long| + /// |10714|out of write time limit| + /// + /// A message of type `MessageType.Leaderboard_WriteEntry` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `bool`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task WriteEntry(string leaderboardName, long score, byte[] extraData = null, + bool forceUpdate = false) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + GCHandle hobj = GCHandle.Alloc(extraData, GCHandleType.Pinned); + IntPtr pobj = hobj.AddrOfPinnedObject(); + var result = new Task(CLIB.ppf_Leaderboard_WriteEntry(leaderboardName, score, pobj, + (uint) (extraData != null ? extraData.Length : 0), forceUpdate)); + if (hobj.IsAllocated) + hobj.Free(); + return result; + } + + /// Writes an entry to a leaderboard. The entry can include the supplementary metric for tiebreakers. + /// + /// The name of the leaderboard to write an entry to. + /// The score to write. + /// The metric that can be used for tiebreakers. + /// A 2KB custom data field that is associated with the leaderboard entry. This can be a game replay or anything that provides more details about the entry to the viewer. + /// Defines whether to force update the score. If set to `true`, the score always updates even if it is not the user's best score. + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `bool`. + /// | Error Code| Error Message | + /// |---|---| + /// |10701|request server failed| + /// |10703|checking parameter failed| + /// |10704|leaderboard is not exist| + /// |10705|no write permission| + /// |10706|load leaderboard data failed| + /// |10707|save leaderboard data failed| + /// |10708|extra data too long| + /// |10714|out of write time limit| + /// + /// A message of type `MessageType.Leaderboard_WriteEntryWithSupplementaryMetric` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `bool`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task WriteEntryWithSupplementaryMetric(string leaderboardName, long score, + long supplementaryMetric, byte[] extraData = null, bool forceUpdate = false) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + GCHandle hobj = GCHandle.Alloc(extraData, GCHandleType.Pinned); + IntPtr pobj = hobj.AddrOfPinnedObject(); + var result = new Task(CLIB.ppf_Leaderboard_WriteEntryWithSupplementaryMetric(leaderboardName, score, + supplementaryMetric, pobj, (uint) (extraData != null ? extraData.Length : 0), forceUpdate)); + if (hobj.IsAllocated) + hobj.Free(); + return result; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Leaderboard.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Leaderboard.cs.meta new file mode 100644 index 0000000..261906d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Leaderboard.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: afa08af6e76749e1b2ccad3292287c4f +timeCreated: 1655221139 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Matchmaking.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Matchmaking.cs new file mode 100644 index 0000000..82dbb5c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Matchmaking.cs @@ -0,0 +1,482 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Generic; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + */ + public static class MatchmakingService + { + /// Reports the result of a skill-rating match. + /// @note Applicable to the following matchmaking modes: Quickmatch, Browse (+ Skill Pool) + /// + /// The room ID. + /// The key-value pairs. + /// Request information of type `Task`, including the request ID, and its response message does not contain data. + /// | Error Code| Error Message | + /// |---|---| + /// |3006209|match result report: not in match| + /// |3006210|match result report: error report data| + /// |3006211|match result report: duplicate report| + /// |3006212|match result report: conflict with other's report| + /// + /// Only for pools with skill-based matchmaking. + /// Call this method after calling `StartMatch()` to begin a skill-rating + /// match. After the match finishes, the server will record the result and + /// update the skill levels of all players involved based on the result. This + /// method is insecure because, as a client API, it is susceptible to tampering + /// and therefore cheating to manipulate skill ratings. + /// + /// A message of type `MessageType.Matchmaking_ReportResultInsecure` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// This response has no payload. If no error has occurred, the request is successful. + /// + public static Task ReportResultsInsecure(UInt64 roomId, Dictionary data) + { + KVPairArray kvarray = new KVPairArray((uint) data.Count); + uint n = 0; + foreach (var d in data) + { + var item = kvarray.GetElement(n); + item.SetKey(d.Key); + item.SetIntValue(d.Value); + n++; + } + + return new Task(CLIB.ppf_Matchmaking_ReportResultInsecure(roomId, kvarray.GetHandle(), kvarray.Size)); + } + + /// Gets the matchmaking statistics for the current user. + /// @note Applicable to the following matchmaking modes: Quickmatch, Browse + /// + /// The pool to look in. + /// (beta feature, don't use it) + /// (beta feature, don't use it) + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `MatchmakingStats`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006201|match enqueue: invalid pool name| + /// |3006208|match enqueue: no skill| + /// + /// + /// When given a pool, the system will look up the current user's wins, losses, draws and skill + /// level. The skill level returned will be between `1` and the maximum level. The approach + /// will determine how should the skill level rise toward the maximum level. + /// + /// A message of type `MessageType.Matchmaking_GetStats` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `MatchmakingStats`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task GetStats(string pool, uint maxLevel, MatchmakingStatApproach approach = MatchmakingStatApproach.Trailing) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Matchmaking_GetStats(pool, maxLevel, approach)); + } + + /// Gets rooms by matchmakinging pool name. + /// The user can join the room with `RoomService.Join2 to`or cancel the retrieval with `MatchmakingService.Cancel`. + /// @note Applicable to the following matchmaking mode: Browse + /// + /// The matchmaking pool name you want to browse. + /// (Optional) The matchmaking configuration of the browse request. + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `MatchmakingBrowseResult`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006201|match enqueue: invalid pool name| + /// |3006205|match browse: access denied| + /// |3006207|match enqueue: invalid query key| + /// + /// A message of type `MessageType.Matchmaking_Browse2` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `MatchmakingBrowseResult`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task Browse2(string pool, MatchmakingOptions matchmakingOptions = null) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (matchmakingOptions == null) + { + return new Task(CLIB.ppf_Matchmaking_Browse2(pool, IntPtr.Zero)); + } + else + { + return new Task(CLIB.ppf_Matchmaking_Browse2(pool, matchmakingOptions.GetHandle())); + } + } + + /// Gets rooms by matchmakinging pool name and specify the page number and the number of pages per page. + /// + /// The matchmaking pool name you want to browse. + /// (Optional) The matchmaking configuration of the browse request. + /// (Optional)Start page index. + /// (Optional)the number of pages per page. + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `MatchmakingBrowseResult`. + /// + /// A message of type `MessageType.Matchmaking_Browse2CustomPage` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `MatchmakingBrowseResult`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task Browse2ForCustomPage(string pool, MatchmakingOptions matchmakingOptions = null, int pageIndex = 0, int pageSize = 5) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (matchmakingOptions == null) + { + return new Task(CLIB.ppf_Matchmaking_Browse2CustomPage(pool, IntPtr.Zero, pageIndex, pageSize)); + } + else + { + return new Task(CLIB.ppf_Matchmaking_Browse2CustomPage(pool, matchmakingOptions.GetHandle(), pageIndex, pageSize)); + } + } + + /// Cancels a matchmaking request. Call this function + /// to cancel an enqueue request before a match + /// is made. This is typically triggered when a user gives up waiting. + /// If you do not cancel the request but the user goes offline, the user/room + /// will be timed out according to the setting of reserved period on the PICO Developer Platform. + /// @note Applicable to the following matchmaking modes: Quickmatch, Browse + /// + /// Request information of type `Task`, including the request ID, and its response message does not contain data. + /// | Error Code| Error Message | + /// |---|---| + /// |3006201|match enqueue: invalid pool name| + /// |3006206|match cancel: not in match| + /// |3006301|server error: unknown| + /// + /// + /// A message of type `MessageType.Matchmaking_Cancel2` will be generated in response. + /// Call `Message.IsError()` to check if any error has occurred. + /// This response has no payload. If no error has occurred, the request is successful. + /// + public static Task Cancel() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Matchmaking_Cancel2()); + } + + /// Creates a matchmaking room, then enqueues and joins it. + /// @note Applicable to the following matchmaking modes: Quickmatch, Browse, Advanced (Can Users Create Rooms=`true`) + /// + /// The matchmaking pool to use, which is created on the PICO Developer Platform. + /// (Optional) Additional matchmaking configuration for this request. + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `MatchmakingEnqueueResultAndRoom`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006201|match enqueue: invalid pool name| + /// |3006203|match create room: pool config not allow user create room| + /// |3006207|match enqueue: invalid query key | + /// |3006301|server error: unknown | + /// |3006204|match enqueue: invalid room id(Assigned room id, present in this context, indicates an internal server error) | + /// |3006103|invalid room(The room was found to be invalid when joining the room, which appears in this context, indicating an internal server error) | + /// |3006102|duplicate join room(Duplicate joins are found when joining a room, which appears in this context, indicating an internal server error) | + /// |3006106|exceed max room player number(Exceeding the maximum number of people when joining a room, appears in this context, indicating an internal server error) | + /// |3006105|illegal enter request(Illegal incoming requests, such as not in the allowed whitelist, appear in this context, indicating an internal server error) | + /// |3006108|room is locked(When joining a room, it is found that the room is locked, appears in this context, indicating an internal server error)| + /// + /// A message of type `MessageType.Matchmaking_CreateAndEnqueueRoom2` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `MatchmakingEnqueueResultAndRoom`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task CreateAndEnqueueRoom2(string pool, MatchmakingOptions matchmakingOptions = null) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (matchmakingOptions == null) + { + return new Task(CLIB.ppf_Matchmaking_CreateAndEnqueueRoom2(pool, IntPtr.Zero)); + } + else + { + return new Task(CLIB.ppf_Matchmaking_CreateAndEnqueueRoom2(pool, matchmakingOptions.GetHandle())); + } + } + + /// Enqueues for an available matchmaking room to join. + /// When the server finds a match, it will return a message of + /// type `MessageType.Notification_Matchmaking_MatchFound`. You + /// can join found matching rooms by calling `RoomService.Join2`. + /// If you want to cancel the match early, you can use `MatchmakingService.Cancel`. + /// @note Applicable to the following matchmaking mode: Quickmatch + /// + /// The matchmaking pool to use, which is defined on the PICO Developer Platform. + /// (Optional) Match configuration for Enqueue. + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `MatchmakingEnqueueResult`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006201|match enqueue: invalid pool name| + /// |3006401|logic state checking failed| + /// |3006207|match enqueue: invalid query key| + /// |3006301|server error: unknown| + /// + /// A message of type `MessageType.Matchmaking_Enqueue2` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `MatchmakingEnqueueResult`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task Enqueue2(string pool, MatchmakingOptions matchmakingOptions = null) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (matchmakingOptions == null) + { + return new Task(CLIB.ppf_Matchmaking_Enqueue2(pool, IntPtr.Zero)); + } + else + { + return new Task(CLIB.ppf_Matchmaking_Enqueue2(pool, matchmakingOptions.GetHandle())); + } + } + + /// Debugs the state of the current matchmaking pool queue. + /// @note + /// * This function should not be used in production. + /// * Applicable to the following matchmaking modes: Quickmatch, Browse + /// + /// + /// + /// Request information of type `Task`, including the request ID, and its response message will contain data of type `MatchmakingAdminSnapshot`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006201|match enqueue: invalid pool name| + /// |3006301|server error: unknown | + /// + /// A message of type `MessageType.Matchmaking_GetAdminSnapshot` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `MatchmakingAdminSnapshot`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task GetAdminSnapshot() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Matchmaking_GetAdminSnapshot()); + } + + /// Reports that a skill-rating match has started. + /// You can use this method after joining the room. + /// @note + /// * This function is only for pools with skill-based matching. + /// * Applicable to the following matchmaking modes: Quickmatch, Browse (+ Skill Pool) + /// + /// + /// The ID of the room you want to match. + /// Request information of type `Task`, including the request ID, and its response message does not contain data. + /// + /// A message of type `MessageType.Matchmaking_StartMatch` will be generated in response. + /// Call `message.IsError()` to check if any error has occurred. + /// + public static Task StartMatch(UInt64 roomId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Matchmaking_StartMatch(roomId)); + } + + /// Sets the callback to get notified when a match has been found. For example, + /// after calling `MatchmakingService.Enqueue`, when the match is successful, you will + /// receive `Notification_Matchmaking_MatchFound`, and then execute the processing function + /// set by this function. + /// + /// The callback function will be called when receiving the `Notification_Matchmaking_MatchFound` message. + public static void SetMatchFoundNotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Matchmaking_MatchFound, handler); + } + + /// A notification will be sent to the player after they have been kicked out of the matchmaking pool. + /// Listen to the event to receive a message. + /// + /// The callback function will be called when receiving the `Matchmaking_Cancel2` message and the value of `requestID` is `0`. + public static void SetCancel2NotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Matchmaking_Cancel2, handler); + } + } + + + public class MatchmakingOptions + { + public MatchmakingOptions() + { + Handle = CLIB.ppf_MatchmakingOptions_Create(); + } + + /// + /// Sets the data store for a room. + /// + /// A unique identifier that maps to a value. + /// The data. + public void SetCreateRoomDataStore(string key, string value) + { + CLIB.ppf_MatchmakingOptions_SetCreateRoomDataStoreString(Handle, key, value); + } + + /// + /// Clears the data store for a room. + /// + public void ClearCreateRoomDataStore() + { + CLIB.ppf_MatchmakingOptions_ClearCreateRoomDataStore(Handle); + } + + /// + /// Sets a join policy for a room. + /// + /// The enumerations of join policy: + /// * `0`: None + /// * `1`: Everyone + /// * `2`: FriendsOfMembers + /// * `3`: FriendsOfOwner + /// * `4`: InvitedUsers + /// * `5`: Unknown + /// + public void SetCreateRoomJoinPolicy(RoomJoinPolicy value) + { + CLIB.ppf_MatchmakingOptions_SetCreateRoomJoinPolicy(Handle, value); + } + + /// + /// Sets the maximum number of users allowed for a room. + /// + /// The maximum number of users. + public void SetCreateRoomMaxUsers(uint value) + { + CLIB.ppf_MatchmakingOptions_SetCreateRoomMaxUsers(Handle, value); + } + + /// + /// Sets an integer data setting for a query of a matchmaking pool. + /// + /// A unique identifier that maps a value. + /// The data (integer). + public void SetEnqueueDataSettings(string key, int value) + { + CLIB.ppf_MatchmakingOptions_SetEnqueueDataSettingsInt(Handle, key, value); + } + + /// + /// Sets a float data setting for a query of a matchmaking pool. + /// + /// A unique identifier that maps a value. + /// The data. + public void SetEnqueueDataSettings(string key, double value) + { + CLIB.ppf_MatchmakingOptions_SetEnqueueDataSettingsDouble(Handle, key, value); + } + + /// + /// Sets a string data setting for a query of a matchmaking pool. + /// + /// A unique identifier that maps a value. + /// The data. + public void SetEnqueueDataSettings(string key, string value) + { + CLIB.ppf_MatchmakingOptions_SetEnqueueDataSettingsString(Handle, key, value); + } + + /// + /// Clears data settings for a query of a matchmaking pool. + /// + public void ClearEnqueueDataSettings() + { + CLIB.ppf_MatchmakingOptions_ClearEnqueueDataSettings(Handle); + } + + /// + /// Sets whether to return the debugging information. + /// + /// + /// * `true`: return the debugging information with the response payload + /// * `false`: do not return the debugging information + /// + public void SetEnqueueIsDebug(bool value) + { + CLIB.ppf_MatchmakingOptions_SetEnqueueIsDebug(Handle, value); + } + + /// + /// Sets the query for a matchmaking. + /// + /// The key of the target query. + /// @note One matchmaking pool can include multiple queries which are created on the PICO Developer Platform. + /// You can choose which query to use before starting a matchmaking. + /// + public void SetEnqueueQueryKey(string value) + { + CLIB.ppf_MatchmakingOptions_SetEnqueueQueryKey(Handle, value); + } + + + /// For passing to native C + public static explicit operator IntPtr(MatchmakingOptions matchmakingOptions) + { + return matchmakingOptions != null ? matchmakingOptions.Handle : IntPtr.Zero; + } + + ~MatchmakingOptions() + { + CLIB.ppf_MatchmakingOptions_Destroy(Handle); + } + + IntPtr Handle; + + public IntPtr GetHandle() + { + return Handle; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Matchmaking.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Matchmaking.cs.meta new file mode 100644 index 0000000..cc6f5f4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Matchmaking.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 51d1402fc42ddf141ba5d9bb9e470a26 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Network.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Network.cs new file mode 100644 index 0000000..692f12f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Network.cs @@ -0,0 +1,194 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Runtime.InteropServices; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + */ + public static class NetworkService + { + /// + /// Reads the messages from other users in the room. + /// + public static Packet ReadPacket() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + var handle = CLIB.ppf_Net_ReadPacket(); + if (handle == IntPtr.Zero) + return null; + return new Packet(handle); + } + + /// + /// Sends messages to a specified user. The maximum messaging frequency is 1000/s. + /// + /// The ID of the user to send messages to. + /// The message length (in bytes). The maximum bytes allowed is 512. + /// + /// * `true`: success + /// * `false`: failure + /// + public static bool SendPacket(string userId, byte[] bytes) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return false; + } + + if (string.IsNullOrEmpty(userId)) + { + Debug.LogError("User ID is null or empty!"); + return false; + } + + GCHandle hobj = GCHandle.Alloc(bytes, GCHandleType.Pinned); + IntPtr pobj = hobj.AddrOfPinnedObject(); + var ok = CLIB.ppf_Net_SendPacket(userId, (UIntPtr) bytes.Length, pobj); + if (hobj.IsAllocated) + hobj.Free(); + return ok; + } + + /// + /// Sends messages to a specified user. The maximum messaging frequency is 1000/s. + /// + /// The ID of the user to send messages to. + /// The message length (in bytes). The maximum bytes allowed is 512. + /// When `reliable` is set to `true`, messages between lost and resume will not be lost. + /// The retention time is determined by the `reserve_period` parameter configured for the matchmaking pool, with a maximum of 1 minute. + /// When `reliable` is set to `false`, this function works the same as the other `SendPacket` function. + /// + /// * `true`: success + /// * `false`: failure + /// + public static bool SendPacket(string userId, byte[] bytes, bool reliable) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return false; + } + + if (string.IsNullOrEmpty(userId)) + { + Debug.LogError("User ID is null or empty!"); + return false; + } + + GCHandle hobj = GCHandle.Alloc(bytes, GCHandleType.Pinned); + IntPtr pobj = hobj.AddrOfPinnedObject(); + var ok = CLIB.ppf_Net_SendPacket2(userId, (UIntPtr) bytes.Length, pobj, reliable); + if (hobj.IsAllocated) + { + hobj.Free(); + } + + return ok; + } + + /// + /// Sends messages to other users in the room. The maximum messaging frequency is 1000/s. + /// + /// The message length (in bytes). The maximum bytes allowed is 512. + /// + /// * `true`: success + /// * `false`: failure + /// + public static bool SendPacketToCurrentRoom(byte[] bytes) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return false; + } + + GCHandle hobj = GCHandle.Alloc(bytes, GCHandleType.Pinned); + IntPtr pobj = hobj.AddrOfPinnedObject(); + var ok = CLIB.ppf_Net_SendPacketToCurrentRoom((UIntPtr) bytes.Length, pobj); + if (hobj.IsAllocated) + { + hobj.Free(); + } + + return ok; + } + + /// + /// Sends messages to other users in the room. The maximum messaging frequency is 1000/s. + /// + /// The message length (in bytes). The maximum bytes allowed is 512. + /// When `reliable` is set to `true`, messages between lost and resume will not be lost. + /// The retention time is determined by the `reserve_period` parameter configured for the matchmaking pool, with a maximum of 1 minute. + /// When `reliable` is set to `false`, this function works the same as the other `SendPacketToCurrentRoom` function. + /// + /// * `true`: success + /// * `false`: failure + /// + public static bool SendPacketToCurrentRoom(byte[] bytes, bool reliable) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return false; + } + + GCHandle hobj = GCHandle.Alloc(bytes, GCHandleType.Pinned); + IntPtr pobj = hobj.AddrOfPinnedObject(); + var ok = CLIB.ppf_Net_SendPacketToCurrentRoom2((UIntPtr) bytes.Length, pobj, reliable); + if (hobj.IsAllocated) + hobj.Free(); + return ok; + } + + public static void SetPlatformGameInitializeAsynchronousCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.PlatformGameInitializeAsynchronous, handler); + } + + /// Sets the callback to get notified when the game network fluctuates. + /// Listen to this event to receive a relevant message. Use `Message.Data` to get the network situation in the game. + /// + /// Callback handler. The callback function will be called when receiving the `Notification_Game_ConnectionEvent` message and the value of `requestID` is `0`. + public static void SetNotification_Game_ConnectionEventCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Game_ConnectionEvent, handler); + } + + public static void SetNotification_Game_Request_FailedCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Game_RequestFailed, handler); + } + + /// Sets the callback to get notified when the game state needs to be reset. + /// Listen to this event to receive a relevant message. If you receive this message, you will need to reset your gaming state. For example, + /// * If you are in a room before receiving this message, you will need to check and reset your room state after receving this message. + /// * If you are in a matchmaking queue before receiving this message, you will need to check and reset your matchmaking state after receiving this message. + /// + /// Callback handler. The callback function will be called when receiving the "Notification_Game_StateReset" message and the value of `requestID` is `0`. + public static void SetNotification_Game_StateResetCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Game_StateReset, handler); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Network.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Network.cs.meta new file mode 100644 index 0000000..41290f6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Network.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8590c499f74c2f346a273d23e44feadd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Notification.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Notification.cs new file mode 100644 index 0000000..5a61820 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Notification.cs @@ -0,0 +1,64 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + */ + public static class NotificationService + { + /// + /// Gets a list of all pending room invites for your app. For example, notifications that may have been sent before the user launches your app. + /// + /// Defines which page of pending room invites to return. The first page index is `0`. + /// Defines the number of pending room invites returned on each page. + /// Request information of type `Task`, including the request id, and its response message will contain data of type `RoomInviteNotificationList`. + /// + /// A message of type `MessageType.Notification_GetRoomInvites` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `RoomInviteNotificationList`. + /// Extract the payload from the message handle with `message.Data`. + public static Task GetRoomInviteNotifications(int pageIdx, int pageSize) + { + if (CoreService.IsInitialized()) + { + return new Task(CLIB.ppf_Notification_GetRoomInvites(pageIdx, pageSize)); + } + + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + /// + /// Marks a notification as read. + /// + /// The ID of the notificaiton to mark. + /// Request information of type `Task`, including the request id, and its response message does not contain data. + /// A message of type `MessageType.Notification_MarkAsRead` will be generated in response. Call `message.IsError()` to check if any error has occurred. + /// + public static Task MarkAsRead(UInt64 notificationID) + { + if (CoreService.IsInitialized()) + { + return new Task(CLIB.ppf_Notification_MarkAsRead(notificationID)); + } + + Debug.LogError(CoreService.NotInitializedError); + return null; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Notification.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Notification.cs.meta new file mode 100644 index 0000000..c0f7fb1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Notification.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b4c79e1681394a0292f762df49b5cdd4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Presence.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Presence.cs new file mode 100644 index 0000000..843ead4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Presence.cs @@ -0,0 +1,502 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Generic; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + */ + public static class PresenceService + { + /// + /// Gets a list of invitable users for the current logged-in user. + /// @note Currently, only invitable friends will be returned. + /// + /// Restricts the scope of friends returned. If no user ID is passed, all friends will + /// be returned. If specific user IDs are passed, the information about specified friends will be returned. + /// + /// + /// A list of friends that can be invited to the current destination. + /// + public static Task GetInvitableUsers(InviteOptions options) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_GetInvitableUsers((IntPtr) options)); + } + + /// + /// Gets a list of invited users for the current logged-in user. + /// You need set Presence before call this function. + /// + /// + /// A list of users that have been invited. + /// + public static Task GetSentInvites() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_GetSentInvites()); + } + + /// + /// Get the next page of invited users. + /// + /// The current page of invited users. + /// The next page of invited users. + public static Task GetNextApplicationInviteListPage(ApplicationInviteList list) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (!list.HasNextPage) + { + Debug.LogWarning("GetNextApplicationInviteListPage: List has no next page"); + return null; + } + + if (!String.IsNullOrEmpty(list.NextPageParam)) + { + Debug.LogWarning("GetNextApplicationInviteListPage: list.NextPageParam is empty"); + return null; + } + + return new Task(CLIB.ppf_Presence_GetNextApplicationInviteArrayPage(list.NextPageParam)); + } + + /// + /// Invites specified user(s) to the current destination. + /// + /// The ID(s) of the user(s) to invite. + public static Task SendInvites(string[] userIds) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (userIds == null) + userIds = Array.Empty(); + return new Task(CLIB.ppf_Presence_SendInvites(userIds)); + } + + /// Sets presence data for the current logged-in user. + /// Presence-related options, including: + /// * `DestinationApiName`: string, the API name of the destination. + /// * `IsJoinable`: bool, + /// * `true`: joinable + /// * `false`: not joinable + /// * `LobbySessionId`: string, a lobby session ID identifies a user group or team. Users with the same lobby session ID can play together or form a team in a game. + /// * `MatchSessionId`: string, a match session ID identifies all users within a same destination, such as a map or a level. Users with different lobby session IDs will have the same match session ID when playing the same match. + /// * `Extra`: string, extra presence data defined by the developer. + /// + public static Task Set(PresenceOptions options) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_Set((IntPtr) options)); + } + + /// @deprecated SetDestination can be replaced by \ref Set() + /// + /// Replaces the current logged-in user's destination with the provided one. + /// @note Other presence parameter settings will remain the same. + /// + /// The API name of the new destination. + [Obsolete("SetDestination can be replaced by Set()", false)] + public static Task SetDestination(string apiName) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_SetDestination(apiName)); + } + + /// @deprecated SetIsJoinable can be replaced by \ref Set() + /// Sets whether the current logged-in user is joinable. + /// @note Other presence parameter settings will remain the same. If the user's destination or session + /// ID has not been set, the user cannot be set as joinable. + /// Defines whether the user is joinable: + /// * `true`: joinable + /// * `false`: not joinable + /// + [Obsolete("SetIsJoinable can be replaced by Set()", false)] + public static Task SetIsJoinable(bool joinable) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_SetIsJoinable(joinable)); + } + + /// @deprecated SetLobbySession can be replaced by \ref Set() + /// + /// Replaces the current logged-in user's lobby session ID with the provided one. + /// @note Other presence parameter settings will remain the same. + /// + /// The new lobby session ID. + [Obsolete("SetLobbySession can be replaced by Set()", false)] + public static Task SetLobbySession(string lobbySessionId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_SetLobbySession(lobbySessionId)); + } + + /// @deprecated SetMatchSession can be replaced by \ref Set() + /// + /// Replaces the current logged-in user's match session ID with the provided one. + /// @note Other presence parameter settings will remain the same. + /// + /// The new match session ID. + [Obsolete("SetMatchSession can be replaced by Set()", false)] + public static Task SetMatchSession(string matchSessionId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_SetMatchSession(matchSessionId)); + } + + /// @deprecated SetExtra can be replaced by \ref Set() + /// + /// Sets extra presence data for the current logged-in user. + /// + /// The extra presence data, which is defined by the developer and will be returned in the user's presence information. + [Obsolete("SetExtra can be replaced by Set()", false)] + public static Task SetExtra(string extra) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_SetExtra(extra)); + } + + /// + /// Clears presence data for the current logged-in user. + /// @note You need to clear a user's presence data when the user exits your app, leaves a specific destination within the app, or does not want others to see their destination and status. + /// + public static Task Clear() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_Clear()); + } + + /// + /// Gets a list of destinations created on the PICO Developer Platform. + /// + /// The list of destinations. + public static Task GetDestinations() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_GetDestinations()); + } + + /// + /// Gets the next page of destinations. + /// + /// The current page of destinations. + /// The next page of destinations. + public static Task GetNextDestinationListPage(DestinationList destinationList) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_GetNextDestinationArrayPage(destinationList.NextPageParam)); + } + + /// + /// Launches the invite panel provided in the PICO Friends app. Users can invite other people on the panel. + /// @note Before calling this method, you should set presence data correctly. + /// + /// Returns a message. Check `Message.Error` to see whether the panel has been successfully launched. + public static Task LaunchInvitePanel() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Presence_LaunchInvitePanel()); + } + + /// + /// Shares a video made of images to Douyin (a video app in Mainland China). + /// @note Available in Mainland China only. + /// + /// The local path to images. + /// Returns a message. Check `Message.Error` to see whether the video has been successfully shared. + public static Task ShareVideoByImages(List imagePaths) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + var options = new ShareMediaOptions(); + foreach (var imagePath in imagePaths) + { + options.AddImagePath(imagePath); + } + + options.SetShareMediaType(ShareMediaType.Image); + return new Task(CLIB.ppf_Presence_ShareMedia((IntPtr) options)); + } + + /// + /// Shares a video to Douyin (a video app in Mainland China). + /// @note Available in Mainland China only. + /// + /// The local path to the video. + /// The local path to the video thumbnail. + /// If not defined, the first frame of the video will become the thumbnail. + /// + /// Returns a message. Check `Message.Error` to see whether the video has been successfully shared. + public static Task ShareVideo(string videoPath, string videoThumbPath) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + var options = new ShareMediaOptions(); + options.SetShareMediaType(ShareMediaType.Video); + options.SetVideoPath(videoPath); + options.SetVideoThumbPath(videoThumbPath); + return new Task(CLIB.ppf_Presence_ShareMedia((IntPtr) options)); + } + + /// When the user clicks on the invitation message, the system will launch your app and + /// the callback will be triggered. Read the fields of \ref Pico.Platform.Models.PresenceJoinIntent + /// to figure out where the user wants to go. If the user is unable to go there, + /// show the user the info about why they cannot go there. + public static void SetJoinIntentReceivedNotificationCallback(Message.Handler callback) + { + Looper.RegisterNotifyHandler( + MessageType.Notification_Presence_JoinIntentReceived, + callback + ); + } + } + + public class ShareMediaOptions + { + public ShareMediaOptions() + { + Handle = CLIB.ppf_ShareMediaOptions_Create(); + } + + + public void SetShareMediaType(ShareMediaType value) + { + CLIB.ppf_ShareMediaOptions_SetShareMediaType(Handle, value); + } + + + public void SetVideoPath(string value) + { + CLIB.ppf_ShareMediaOptions_SetVideoPath(Handle, value); + } + + + public void SetVideoThumbPath(string value) + { + CLIB.ppf_ShareMediaOptions_SetVideoThumbPath(Handle, value); + } + + + public void AddImagePath(string ele) + { + CLIB.ppf_ShareMediaOptions_AddImagePath(Handle, ele); + } + + public void ClearImagePaths() + { + CLIB.ppf_ShareMediaOptions_ClearImagePaths(Handle); + } + + + public void SetShareAppType(ShareAppType value) + { + CLIB.ppf_ShareMediaOptions_SetShareAppType(Handle, value); + } + + /// For passing to native C + public static explicit operator IntPtr(ShareMediaOptions options) + { + return options != null ? options.Handle : IntPtr.Zero; + } + + ~ShareMediaOptions() + { + CLIB.ppf_ShareMediaOptions_Destroy(Handle); + } + + IntPtr Handle; + } + + public class PresenceOptions + { + public PresenceOptions() + { + Handle = CLIB.ppf_PresenceOptions_Create(); + } + + /// + /// Sets a destination for the current logged-in user. + /// + /// The API name of the destination. + public void SetDestinationApiName(string value) + { + CLIB.ppf_PresenceOptions_SetDestinationApiName(Handle, value); + } + + /// + /// Sets whether the current logged-in user is joinable. + /// + /// + /// * `true`: joinable + /// * `false`: not joinable + /// + public void SetIsJoinable(bool value) + { + CLIB.ppf_PresenceOptions_SetIsJoinable(Handle, value); + } + + /// + /// Sets a lobby session ID for the current logged-in user. + /// + /// The lobby session ID. + public void SetLobbySessionId(string value) + { + CLIB.ppf_PresenceOptions_SetLobbySessionId(Handle, value); + } + + /// + /// Sets a match session ID for the current logged-in user. + /// + /// The match session ID. + public void SetMatchSessionId(string value) + { + CLIB.ppf_PresenceOptions_SetMatchSessionId(Handle, value); + } + + /// + /// Sets extra presence data for the current logged-in user. + /// + /// Extra presence data defined by the developer. + public void SetExtra(string value) + { + CLIB.ppf_PresenceOptions_SetExtra(Handle, value); + } + + + /// For passing to native C + public static explicit operator IntPtr(PresenceOptions options) + { + return options != null ? options.Handle : IntPtr.Zero; + } + + ~PresenceOptions() + { + CLIB.ppf_PresenceOptions_Destroy(Handle); + } + + IntPtr Handle; + } + + public class InviteOptions + { + public InviteOptions() + { + Handle = CLIB.ppf_InviteOptions_Create(); + } + + + public void AddSuggestedUser(string ele) + { + CLIB.ppf_InviteOptions_AddSuggestedUser(Handle, ele); + } + + public void ClearSuggestedUsers() + { + CLIB.ppf_InviteOptions_ClearSuggestedUsers(Handle); + } + + + /// For passing to native C + public static explicit operator IntPtr(InviteOptions options) + { + return options != null ? options.Handle : IntPtr.Zero; + } + + ~InviteOptions() + { + CLIB.ppf_InviteOptions_Destroy(Handle); + } + + IntPtr Handle; + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Presence.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Presence.cs.meta new file mode 100644 index 0000000..37f426e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Presence.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ec5d2740554cc9147b92daecb097798d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/RTC.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/RTC.cs new file mode 100644 index 0000000..7f95e01 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/RTC.cs @@ -0,0 +1,978 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Generic; +using AOT; +using Pico.Platform.Models; +using UnityEngine; +using UnityEngine.Android; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + * + * Real-time communications (RTC) technology enables users in the same room to communicate with each other through voice chat. + * + * RTC service uses a centralized communication structure instead of an end-to-end one. After users have joined a room and enabled voice chat, the microphone keeps capturing audio data from users and uploading the data to the RTC server. Then, the RTC server transmits the audio data to each client in the room, and the client broadcasts the audio data received. + */ + public static class RtcService + { + /// + /// Initializes the RTC engine. + /// @note You should call this method before using the RTC service. + /// + /// The status that indicates whether the initialization is successful. + public static RtcEngineInitResult InitRtcEngine() + { + if (Application.platform == RuntimePlatform.Android && !Permission.HasUserAuthorizedPermission(Permission.Microphone)) + { + Permission.RequestUserPermission(Permission.Microphone); + } + + return CLIB.ppf_Rtc_InitRtcEngine(); + } + + /// + /// Gets the token required by \ref JoinRoom. + /// + /// + /// The ID of the room that the token is for. + /// The ID of the user that the token is for. + /// The time-to-live (ttl) of the token. The unit is seconds. + /// The user will be kicked out from the room after ttl seconds. + /// + /// The dictionary that maps privilege to ttl. The unit is seconds. + public static Task GetToken(string roomId, string userId, int ttl, Dictionary privileges) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + var tokenOption = new RtcGetTokenOptions(); + tokenOption.SetRoomId(roomId); + tokenOption.SetUserId(userId); + tokenOption.SetTtl(ttl); + if (privileges != null) + { + foreach (var i in privileges) + { + tokenOption.SetPrivileges(i.Key, i.Value); + } + } + + return new Task(CLIB.ppf_Rtc_GetToken((IntPtr) tokenOption)); + } + + /// + /// Joins a user to a specified room. + /// + /// @note + /// * If code `0` is returned, you should use \ref SetOnJoinRoomResultCallback to handle the + /// final join room result. + /// * If a non-zero code is returned, you should call \ref LeaveRoom firstly to join the room in the next time. + /// + /// The ID of the room to join. + /// The ID of user. + /// The token required for joining the room. You can get the token by calling \ref GetToken. + /// Room type: + /// * `0`: communication room + /// * `1`: live broadcasting room + /// * `2`: game room + /// * `3`: cloud game room + /// * `4`: low-latency room + /// + /// Whether to automatically subscribe to the audio in the room: + /// * `true`: subscribe + /// * `false`: do not subscribe + /// + /// `0` indicates success, and other codes indicate failure. + /// | Code| Description | + /// |---|---| + /// |0|Success.| + /// |-1|Invalid `roomID` or `userId`.| + /// |-2|The user is already in this room.| + /// |-3|The RTC engine is null. You should initialize the RTC engine before joining a room.| + /// |-4|Creating the room failed.| + /// + public static int JoinRoom(string roomId, string userId, string token, RtcRoomProfileType roomProfileType, bool isAutoSubscribeAudio) + { + var roomOption = new RtcRoomOptions(); + roomOption.SetRoomId(roomId); + roomOption.SetUserId(userId); + roomOption.SetToken(token); + roomOption.SetRoomProfileType(roomProfileType); + roomOption.SetIsAutoSubscribeAudio(isAutoSubscribeAudio); + return CLIB.ppf_Rtc_JoinRoom((IntPtr) roomOption); + } + + /// + /// Joins a user to a room. + /// + /// The options to join a room. + /// Retry to join the room if the request returns error code `-2` (the user is already in the room). + /// `0` indicates success, and other codes indicate failure. + /// | Code| Description | + /// |---|---| + /// |0|Success.| + /// |-1|Invalid `roomID` or `userId`.| + /// |-2|The user is already in this room.| + /// |-3|The RTC engine is null. You should initialize the RTC engine before joining a room.| + /// |-4|Creating the room failed.| + /// + public static int JoinRoom2(RtcRoomOptions joinRoomOptions, bool leaveIfInRoom = true) + { + var res = CLIB.ppf_Rtc_JoinRoom((IntPtr) joinRoomOptions); + if (leaveIfInRoom && res == -2) + { + LeaveRoom(joinRoomOptions.RoomId); + res = CLIB.ppf_Rtc_JoinRoom((IntPtr) joinRoomOptions); + } + + return res; + } + + /// + /// Leaves a room and retries to join it when the previous request fails and returns error code `-2` (the user is already in this room). + /// + /// The ID of the room to join. + /// The ID of user. + /// The token required for joining the room. You can get the token by calling `GetToken`. + /// Room type: + /// * `0`: communication room + /// * `1`: live broadcasting room + /// * `2`: game room + /// * `3`: cloud game room + /// * `4`: low-latency room + /// + /// Whether to automatically subscribe to the audio in the room: + /// * `true`: subscribe + /// * `false`: do not subscribe + /// + /// `0` indicates success, and other codes indicate failure. + /// | Code| Description | + /// |---|---| + /// |0|Success.| + /// |-1|Invalid `roomID` or `userId`.| + /// |-2|The user is already in this room.| + /// |-3|The RTC engine is null. You should initialize the RTC engine before joining a room.| + /// |-4|Creating the room failed.| + /// + public static int JoinRoomWithRetry(string roomId, string userId, string token, RtcRoomProfileType roomProfileType, bool isAutoSubscribeAudio) + { + var roomOption = new RtcRoomOptions(); + roomOption.SetRoomId(roomId); + roomOption.SetUserId(userId); + roomOption.SetToken(token); + roomOption.SetRoomProfileType(roomProfileType); + roomOption.SetIsAutoSubscribeAudio(isAutoSubscribeAudio); + var res = CLIB.ppf_Rtc_JoinRoom((IntPtr) roomOption); + if (res == -2) + { + LeaveRoom(roomId); + res = CLIB.ppf_Rtc_JoinRoom((IntPtr) roomOption); + } + + return res; + } + + /// + /// Leaves a specified room. + /// + /// The ID of the room to leave. + /// `0` indicates success, and other codes indicate failure. + /// + /// | Code| Description | + /// |---|---| + /// |0|Success.| + /// |-1|The RTC engine is not initialized.| + /// |-2|The user is not in the room.| + /// + public static int LeaveRoom(string roomId) + { + return CLIB.ppf_Rtc_LeaveRoom(roomId); + } + + /// + /// Sets the audio playback device. + /// + /// The device ID. + public static void SetAudioPlaybackDevice(RtcAudioPlaybackDevice device) + { + CLIB.ppf_Rtc_SetAudioPlaybackDevice(device); + } + + /// + /// Unsubscribing from all the audio streams of a room, thereby making the local user unable to hear anything from the room. + /// + /// The ID of the room whose audio streams are to be unsubscribed from. + public static void RoomPauseAllSubscribedStream(string roomId) + { + CLIB.ppf_Rtc_RoomPauseAllSubscribedStream(roomId, RtcPauseResumeMediaType.Audio); + } + + /// + /// Resubscribing to all the audio streams of a room, thereby making the local user hear the voice from every in-room user. + /// + /// The ID of the room whose audio streams are to be resubscribed to. + public static void RoomResumeAllSubscribedStream(string roomId) + { + CLIB.ppf_Rtc_RoomResumeAllSubscribedStream(roomId, RtcPauseResumeMediaType.Audio); + } + + public delegate int ProcessAudioFrameFunction(RtcAudioFrame frame); + + static ProcessAudioFrameFunction audioProcessor = null; + + [MonoPInvokeCallback(typeof(CLIB.RtcProcessAudioFrameFunction))] + static int InnerAudioProcessor(IntPtr ptr) + { + if (audioProcessor != null) + { + return audioProcessor(new RtcAudioFrame(ptr)); + } + + return 0; + } + + /// + /// Register local audio processor. You can use this function to modify the recorded audio. + /// + /// The processor function. + /// If it returns 0,means the function didn't change the data. + /// If its return value is negative integer, means the function encounters error. + /// If its return value is positive integer, means the function handled successfully. + /// + /// The channel of the audio you want to process. + /// The sample rate of the audio you want to process. + public static void RegisterLocalAudioProcessor(ProcessAudioFrameFunction processor, RtcAudioChannel channel, RtcAudioSampleRate sampleRate) + { + // here should hold the processor to avoid GC delete the processor and `InnerAudioProcessor` will call this. + audioProcessor = processor; + CLIB.ppf_Rtc_RegisterLocalAudioProcessor(InnerAudioProcessor, channel, sampleRate); + } + + /// + /// Enables audio properties report. Once enabled, you will regularly receive audio report data. + /// + /// + /// The interval (in milliseconds) between one report and the next. You can set this parameter to `0` or any negative integer to stop receiving audio properties report. + /// For any integer between (0, 100), the SDK will regard it as invalid and automatically set this parameter to `100`; any integer equal to or greater than `100` is valid. + /// + public static void EnableAudioPropertiesReport(int interval) + { + var conf = new RtcAudioPropertyOptions(); + conf.SetInterval(interval); + CLIB.ppf_Rtc_EnableAudioPropertiesReport((IntPtr) conf); + } + + /// + /// Publishes the local audio stream to a room, thereby making the local user's voice heard by other in-room users. + /// @note + /// * A user can only publish the local audio stream to one room at the same time. + /// * If a user wants to publish the local audio stream to another room, + /// `UnPublishRoom(oldRoomId)` should be called first to stop publishing the local audio stream to the current room and then `Publish(newRoomId)` should be called. + /// + /// The ID of the room that the local audio stream is published to. + public static void PublishRoom(string roomId) + { + CLIB.ppf_Rtc_RoomPublishStream(roomId, RtcMediaStreamType.Audio); + } + + /// + /// Stops publishing the local audio stream to a room, so other in-room users are unable to hear the local user's voice. + /// + /// The ID of the room to stop publishing the local audio stream to. + public static void UnPublishRoom(string roomId) + { + CLIB.ppf_Rtc_RoomUnPublishStream(roomId, RtcMediaStreamType.Audio); + } + + /// + /// Destroys a specified room. The resources occupied by the room will be released after destruction. + /// + /// The ID of the room to destroy. + public static void DestroyRoom(string roomId) + { + CLIB.ppf_Rtc_DestroyRoom(roomId); + } + + /// + /// Starts audio capture via the microphone. + /// + public static void StartAudioCapture() + { + CLIB.ppf_Rtc_StartAudioCapture(); + } + + /// + /// Stops audio capture. + /// + public static void StopAudioCapture() + { + CLIB.ppf_Rtc_StopAudioCapture(); + } + + /// + /// Sets the volume of the captured audio. + /// + /// The target volume. The valid value ranges from `0` to `400`. `100` indicates keeping the original volume. + public static void SetCaptureVolume(int volume) + { + CLIB.ppf_Rtc_SetCaptureVolume(RtcStreamIndex.Main, volume); + } + + /// + /// Sets the playback volume. + /// + /// The target volume. The valid value ranges from `0` to `400`. `100` indicates keeping the original volume. + public static void SetPlaybackVolume(int volume) + { + CLIB.ppf_Rtc_SetPlaybackVolume(volume); + } + + /// + /// Switches the in-ear monitoring mode on/off. Once the in-ear monitoring mode is enabled, one can hear their own voice. + /// + /// Whether to switch the in-ear monitoring mode on/off: + /// * `0`: off + /// * `1`: on + /// + public static void SetEarMonitorMode(RtcEarMonitorMode mode) + { + CLIB.ppf_Rtc_SetEarMonitorMode(mode); + } + + /// + /// Sets the volume for in-ear monitoring. + /// + /// The target volume. The valid value range from `0` to `400`. + public static void SetEarMonitorVolume(int volume) + { + CLIB.ppf_Rtc_SetEarMonitorVolume(volume); + } + + /// @deprecated MuteLocalAudio() can be replaced by \ref UnPublishRoom(string roomId) + /// + /// Mutes local audio to make one's voice unable to be heard by other in-room users. + /// + /// The state of local audio: + /// * `0`: off + /// * `1`: on + /// + [Obsolete("MuteLocalAudio can be replaced by UnPublishRoom(roomId)", true)] + public static void MuteLocalAudio(RtcMuteState rtcMuteState) + { + CLIB.ppf_Rtc_MuteLocalAudio(rtcMuteState); + } + + /// + /// Updates the token in a room. + /// + /// When a token's ttl is about to expire, you will receive a notification + /// through \ref SetOnTokenWillExpire. If you still want to stay in the room, + /// you should call \ref GetToken to get a new token and call \ref UpdateToken + /// with the new token. If you don't update token timely,you will be kicked + /// out from the room. + /// + /// The ID of the room you are in. + /// The token to update. + public static void UpdateToken(string roomId, string token) + { + CLIB.ppf_Rtc_UpdateToken(roomId, token); + } + + /// + /// Sets the audio scenario. + /// @note Different audio scenarios can impact the voice quality and how the earphones work. + /// + /// The audio scenario type: + /// * `0`: Music + /// * `1`: HighQualityCommunication + /// * `2`: Communication + /// * `3`: Media + /// * `4`: GameStreaming + /// + public static void SetAudioScenario(RtcAudioScenarioType scenarioType) + { + CLIB.ppf_Rtc_SetAudioScenario(scenarioType); + } + + /// + /// Sets the volume for a remote user in a room. + /// + /// The ID of the room. + /// The ID of the remote user. + /// The volume to set for the remote user, which ranges from `0` to `400` and `100` indicates the default volume. + public static void RoomSetRemoteAudioPlaybackVolume(string roomId, string userId, int volume) + { + CLIB.ppf_Rtc_RoomSetRemoteAudioPlaybackVolume(roomId, userId, volume); + } + + /// + /// Subscribes to the audio stream of a specific user in a room. + /// + /// The ID of the room. + /// The ID of the user in the room. + public static void RoomSubscribeStream(string roomId, string userId) + { + CLIB.ppf_Rtc_RoomSubscribeStream(roomId, userId, RtcMediaStreamType.Audio); + } + + /// + /// Unsubscribes from the audio stream of a specific user in a room. + /// + /// The ID of the room. + /// The ID of the user in the room. + public static void RoomUnSubscribeStream(string roomId, string userId) + { + CLIB.ppf_Rtc_RoomUnsubscribeStream(roomId, userId, RtcMediaStreamType.Audio); + } + + /// + /// Sends a binary message to a room. All in-room users will receive this message. + /// + /// The message's bytes size shouldn't be greater than 64kB. + /// + /// The ID of the room. + /// The binary message to be sent. + /// A room message ID of the int64 type, which is automatically generated and incremented. + public static long SendRoomBinaryMessage(string roomId, byte[] message) + { + var ptr = new PtrManager(message); + var ans = CLIB.ppf_Rtc_SendRoomBinaryMessage(roomId, ptr.ptr, message.Length); + ptr.Free(); + return ans; + } + + /// + /// Sends a text message to a room. All in-room users will receive this message. + /// + /// The message's bytes size shouldn't be greater than 64kB. + /// + /// The ID of the room. + /// The message to be sent. + /// A room message ID of the int64 type, which is automatically generated and incremented. + public static long SendRoomMessage(string roomId, string message) + { + return CLIB.ppf_Rtc_SendRoomMessage(roomId, message); + } + + /// + /// Sends a binary message to a user. Only the user can receive this message. + /// + /// The message's bytes size shouldn't be greater than 64kB. + /// + /// The ID of the room the user is in. + /// The ID of the user the message is sent to. + /// The message to be sent. + /// A user message ID of the int64 type, which is automatically generated and incremented. + public static long SendUserBinaryMessage(string roomId, string userId, byte[] message) + { + var ptr = new PtrManager(message); + var ans = CLIB.ppf_Rtc_SendUserBinaryMessage(roomId, userId, ptr.ptr, message.Length); + ptr.Free(); + return ans; + } + + /// + /// Sends a text message to a user. Only the user can receive this message. + /// The message's bytes size shouldn't be greater than 64kB. + /// + /// The ID of the room the user is in. + /// The ID of the user the message is sent to. + /// The message to be sent. + /// A user message ID of the int64 type, which is automatically generated and incremented. + public static long SendUserMessage(string roomId, string userId, string message) + { + return CLIB.ppf_Rtc_SendUserMessage(roomId, userId, message); + } + + /// + /// Sends stream sync info. The sync info data will be sent in the same packet with the audio data. Users who subscribe to this audio stream will receive the stream sync info message. + /// + /// The stream sync info. + /// The stream sync info will be sent repeatedly for the times set in `repeatCount`. + /// It's designed to avoid losing package and ensuring that the sync info can be sent successfully. + /// However, if `repeatCount` is too large, it will cause the sync info to pile up in the queue. + /// Setting this parameter to `0` is recommended. + /// + /// Any code equal to or below `0` indicates success, and others codes indicate failure. + /// | Code | Description| + /// |---|---| + /// |>=0|Send successfully.Indicates the times sent successfully.| + /// |-1|Send Failed. Message length exceeded 255B| + /// |-2|Send Failed. The data is empty.| + /// |-3|Send Failed. Send sync info with a un-publish screen stream.| + /// |-4|Send Failed. Send sync info with a un-publish audio stream.| + /// + public static int SendStreamSyncInfo(byte[] data, int repeatCount) + { + var config = new RtcStreamSyncInfoOptions(); + config.SetRepeatCount(repeatCount); + config.SetStreamIndex(RtcStreamIndex.Main); + config.SetStreamType(RtcSyncInfoStreamType.Audio); + var ptr = new PtrManager(data); + var ans = CLIB.ppf_Rtc_SendStreamSyncInfo(ptr.ptr, data.Length, (IntPtr) config); + ptr.Free(); + return ans; + } + + /// + /// Sets the callback to get notified when the token is about to expire. + /// @note The token will expire 30 seconds after you receive this notification. + /// * If you still want to stay in the room, you can get a new token by calling `UpdateToken`. + /// * If you do not update the token after receiving this notification, you will be kicked out of the room in 30 seconds. + /// + /// The callback function, the string in the message indicates the room ID. + public static void SetOnTokenWillExpire(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnTokenWillExpire, handler); + } + + /// + /// Sets the callback to get notified when a to-room message is received. + /// + /// The callback handler. + public static void SetOnRoomMessageReceived(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnRoomMessageReceived, handler); + } + + /// + /// Sets the callback to get notified when a to-room binary message is received. + /// + /// The callback handler. + public static void SetOnRoomBinaryMessageReceived(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnRoomBinaryMessageReceived, handler); + } + + /// + /// Sets the callback to get notified when a to-user message is received. + /// + /// The callback handler. + public static void SetOnUserMessageReceived(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnUserMessageReceived, handler); + } + + /// + /// Sets the callback to get notified when a to-user binary message is received. + /// + /// The callback handler. + public static void SetOnUserBinaryMessageReceived(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnUserBinaryMessageReceived, handler); + } + + /// + /// Sets the callback to get whether the to-room message is sent successfully. + /// + /// The callback handler. + public static void SetOnRoomMessageSendResult(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnRoomMessageSendResult, handler); + } + + /// + /// Sets the callback to get whether the to-user message is sent successfully. + /// + /// + public static void SetOnUserMessageSendResult(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnUserMessageSendResult, handler); + } + + /// + /// Sets the callback to get notified when a remote user publishes audio stream. + /// + /// The callback handler. + public static void SetOnUserPublishStream(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnUserPublishStream, handler); + } + + /// + /// Sets the callback to get notified when a remote user cancels publishing audio stream. + /// + /// The callback handler. + public static void SetOnUserUnPublishStream(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnUserUnPublishStream, handler); + } + + /// + /// Sets the callback to get notified when the stream sync info is received. + /// + /// The callback handler. + public static void SetOnStreamSyncInfoReceived(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnStreamSyncInfoReceived, handler); + } + + /// + /// Sets the callback of `JoinRoom` to get `RtcJoinRoomResult`. + /// + /// The callback handler. + public static void SetOnJoinRoomResultCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnJoinRoom, handler); + } + + /// + /// Sets the callback of `LeaveRoom` to get `RtcLeaveRoomResult`. + /// + /// The callback handler. + public static void SetOnLeaveRoomResultCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnLeaveRoom, handler); + } + + /// + /// Sets the callback to get notified when someone has joined the room. + /// + /// The callback handler. + public static void SetOnUserJoinRoomResultCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnUserJoinRoom, handler); + } + + /// + /// Sets the callback to get notified when someone has left the room. + /// + /// The callback handler. + public static void SetOnUserLeaveRoomResultCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnUserLeaveRoom, handler); + } + + /// + /// Sets the callback to regularly get room statistics after joining a room. + /// + /// + /// The callback handler. + public static void SetOnRoomStatsCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnRoomStats, handler); + } + + /// + /// Sets the callback to get warning messages from the RTC engine. + /// The warning codes and descriptions are given below. + /// + /// |Warning Code|Description| + /// |---|---| + /// |-2001|Joining the room failed.| + /// |-2002|Publishing audio stream failed.| + /// |-2003|Subscribing to the audio stream failed because the stream cannot be found.| + /// |-2004|Subscribing to the audio stream failed due to server error.| + /// |-2013|When the people count in the room exceeds 500, the client will not be informed of user join and leave info anymore.| + /// |-5001|The camera permission is missing.| + /// |-5002|The microphone permission is missing.| + /// |-5003|Starting the audio capture device failed.| + /// |-5004|Starting the audio playback device failed.| + /// |-5005|No available audio capture device.| + /// |-5006|No available audio playback device.| + /// |-5007|The audio capture device failed to capture valid audio data.| + /// |-5008|Invalid media device operation.| + /// + /// The callback handler. + public static void SetOnWarnCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnWarn, handler); + } + + /// + /// Sets the callback to get error messages from the RTC engine. + /// The error codes and descriptions are given below. + /// + /// |Error Code|Description| + /// |---|---| + /// |-1000|Invalid token.| + /// |-1001|Unknown error.| + /// |-1002|No permission to publish audio stream.| + /// |-1003|No permission to subscribe audio stream.| + /// |-1004|A user with the same user Id joined this room. You are kicked out of the room.| + /// |-1005|Incorrect configuration on the Developer Platform.| + /// |-1007|Invalid room id.| + /// |-1009|Token expired. You should get a new token and join the room.| + /// |-1010|Token is invalid when you call `UpdateToken`| + /// |-1011|The room is dismissed and all user is moved out from the room.| + /// |-1070|Subscribing to audio stream failed. Perhaps the number of subscribed audio streams has exceeded the limit.| + /// + /// The callback handler. + public static void SetOnErrorCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnError, handler); + } + + /// + /// Sets the callback to get warning messages from the room. + /// + /// The callback handler. + public static void SetOnRoomWarnCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnRoomWarn, handler); + } + + /// + /// Sets the callback to get error messages from the room. + /// + /// The callback handler. + public static void SetOnRoomErrorCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnRoomError, handler); + } + + /// + /// Sets the callback to get notified when the state of the connection to the RTC server has changed. + /// + /// The callback handler. + public static void SetOnConnectionStateChangeCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnConnectionStateChange, handler); + } + + /// + /// Sets the callback to get notified when the user has muted local audio. + /// + /// The callback handler. + [Obsolete("SetOnUserMuteAudio is deprecated,please use SetOnUserPublishStream/SetOnUserUnPublishStream", true)] + public static void SetOnUserMuteAudio(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnUserMuteAudio, handler); + } + + /// + /// Sets the callback to get notified when the user has started audio capture. + /// + /// When a remote user called \ref StartAudioCapture,RTC engine will call this callback. + /// + /// The callback handler. + public static void SetOnUserStartAudioCapture(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnUserStartAudioCapture, handler); + } + + /// + /// Sets the callback to get notified when the user has stopped audio capture. + /// + /// When a remote user called \ref StopAudioCapture,RTC engine will call this callback. + /// + /// The callback handler. + public static void SetOnUserStopAudioCapture(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnUserStopAudioCapture, handler); + } + + /// + /// Sets the callback to get notified when the audio playback device has been changed. + /// + /// The callback handler. + public static void SetOnAudioPlaybackDeviceChange(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnAudioPlaybackDeviceChanged, handler); + } + + /// + /// Sets the callback to receive local audio report. + /// Rtc engine will call this callback periodically once you call \ref EnableAudioPropertiesReport. + /// + /// The callback handler. + public static void SetOnLocalAudioPropertiesReport(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnLocalAudioPropertiesReport, handler); + } + + /// + /// Sets the callback to receive remote audio report. + /// Rtc engine will call this callback periodically once you call \ref EnableAudioPropertiesReport. + /// + /// The callback handler. + public static void SetOnRemoteAudioPropertiesReport(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Rtc_OnRemoteAudioPropertiesReport, handler); + } + } + + public class RtcStreamSyncInfoOptions + { + private IntPtr Handle; + + public RtcStreamSyncInfoOptions() + { + Handle = CLIB.ppf_RtcStreamSyncInfoOptions_Create(); + } + + public void SetRepeatCount(int value) + { + CLIB.ppf_RtcStreamSyncInfoOptions_SetRepeatCount(Handle, value); + } + + public void SetStreamIndex(RtcStreamIndex value) + { + CLIB.ppf_RtcStreamSyncInfoOptions_SetStreamIndex(Handle, value); + } + + public void SetStreamType(RtcSyncInfoStreamType value) + { + CLIB.ppf_RtcStreamSyncInfoOptions_SetStreamType(Handle, value); + } + + public static explicit operator IntPtr(RtcStreamSyncInfoOptions options) + { + return options != null ? options.Handle : IntPtr.Zero; + } + + ~RtcStreamSyncInfoOptions() + { + CLIB.ppf_RtcStreamSyncInfoOptions_Destroy(Handle); + } + } + + public class RtcRoomOptions + { + public string RoomId; + + public RtcRoomOptions() + { + Handle = CLIB.ppf_RtcRoomOptions_Create(); + } + + + public void SetRoomProfileType(RtcRoomProfileType value) + { + CLIB.ppf_RtcRoomOptions_SetRoomProfileType(Handle, value); + } + + + public void SetIsAutoSubscribeAudio(bool value) + { + CLIB.ppf_RtcRoomOptions_SetIsAutoSubscribeAudio(Handle, value); + } + + public void SetRoomId(string value) + { + this.RoomId = value; + CLIB.ppf_RtcRoomOptions_SetRoomId(Handle, value); + } + + + public void SetUserId(string value) + { + CLIB.ppf_RtcRoomOptions_SetUserId(Handle, value); + } + + + public void SetUserExtra(string value) + { + CLIB.ppf_RtcRoomOptions_SetUserExtra(Handle, value); + } + + + public void SetToken(string value) + { + CLIB.ppf_RtcRoomOptions_SetToken(Handle, value); + } + + /// For passing to native C + public static explicit operator IntPtr(RtcRoomOptions options) + { + return options != null ? options.Handle : IntPtr.Zero; + } + + ~RtcRoomOptions() + { + CLIB.ppf_RtcRoomOptions_Destroy(Handle); + } + + private IntPtr Handle; + } + + public class RtcGetTokenOptions + { + public RtcGetTokenOptions() + { + Handle = CLIB.ppf_RtcGetTokenOptions_Create(); + } + + + public void SetUserId(string value) + { + CLIB.ppf_RtcGetTokenOptions_SetUserId(Handle, value); + } + + + public void SetRoomId(string value) + { + CLIB.ppf_RtcGetTokenOptions_SetRoomId(Handle, value); + } + + public void SetTtl(int value) + { + CLIB.ppf_RtcGetTokenOptions_SetTtl(Handle, value); + } + + public void SetPrivileges(RtcPrivilege key, int value) + { + CLIB.ppf_RtcGetTokenOptions_SetPrivileges(Handle, key, value); + } + + public void ClearPrivileges() + { + CLIB.ppf_RtcGetTokenOptions_ClearPrivileges(Handle); + } + + /// For passing to native C + public static explicit operator IntPtr(RtcGetTokenOptions options) + { + return options != null ? options.Handle : IntPtr.Zero; + } + + ~RtcGetTokenOptions() + { + CLIB.ppf_RtcGetTokenOptions_Destroy(Handle); + } + + private IntPtr Handle; + } + + public class RtcAudioPropertyOptions + { + public IntPtr Handle; + + public RtcAudioPropertyOptions() + { + Handle = CLIB.ppf_RtcAudioPropertyOptions_Create(); + } + + public void SetInterval(int value) + { + CLIB.ppf_RtcAudioPropertyOptions_SetInterval(Handle, value); + } + + ~RtcAudioPropertyOptions() + { + CLIB.ppf_RtcAudioPropertyOptions_Destroy(Handle); + } + + /// For passing to native C + public static explicit operator IntPtr(RtcAudioPropertyOptions options) + { + return options != null ? options.Handle : IntPtr.Zero; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/RTC.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/RTC.cs.meta new file mode 100644 index 0000000..c00165f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/RTC.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5156f6aeca9c5bd4caf2a75e964824db +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Room.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Room.cs new file mode 100644 index 0000000..c7dd4cd --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Room.cs @@ -0,0 +1,736 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Generic; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + */ + public static class RoomService + { + /// Gets the room options for create a private room. You can use it when you use \ref RoomService.CreateAndJoinPrivate2. + /// The key/value pairs to add. + /// The room options for create a private room. + public static RoomOptions GetCreatePrivateRoomOptions(Dictionary dataStore) + { + RoomOptions options = new RoomOptions(); + foreach (var data in dataStore) + { + options.SetDataStore(data.Key, data.Value); + } + + return options; + } + + /// Gets the room options for joining or creating a named room. You can use it when you use \ref RoomService.JoinOrCreateNamedRoom. + /// The key/value pairs to add. + /// The name of the named room. + /// The password of the named room. + /// The room options for joining or creating a named room. + public static RoomOptions GetJoinOrCreateNamedRoomOptions(Dictionary dataStore, string name, string password) + { + RoomOptions options = new RoomOptions(); + foreach (var data in dataStore) + { + options.SetDataStore(data.Key, data.Value); + } + + options.SetRoomName(name); + options.SetPassword(password); + + return options; + } + + /// Gets the list of named rooms created for the app. + /// Defines which page of entries to return. The index for the first page is `0`. + /// The number of entries returned on each page. Value range: [5,20]. + /// The request ID of this async function. + /// + /// A message of type `MessageType.Room_GetNamedRooms` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `RoomList`. + /// Extract the payload from the message handle with `Message.Data`. + /// + public static Task GetNamedRooms(int pageIndex, int pageSize) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_GetNamedRooms(pageIndex, pageSize)); + } + + /// Join or create a named room. + /// The join policy of the room. Currently only support 'RoomJoinPolicy Everyone'. + /// Determines whether to create a new room if the named room does not exist: + /// * `true`: create + /// * `false`: do not create + /// + /// The maximum number of users allowed in the room, including the creator. + /// Additional room configuration for this request. + /// The request ID of this async function. + /// + /// A message of type `MessageType.Room_JoinNamed` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `Message.Data`. + /// + public static Task JoinOrCreateNamedRoom(RoomJoinPolicy joinPolicy, bool createIfNotExist, uint maxUsers, RoomOptions options) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_JoinNamed(joinPolicy, createIfNotExist, maxUsers, options.GetHandle())); + } + + /// Launches the invitation flow to let the current user invite friends to a specified room. + /// This launches the system default invite UI where all of the user's friends are displayed. + /// This is intended to be a shortcut for developers not wanting to build their own invite-friends UI. + /// + /// The ID of the room. + /// The request ID of this async function. + /// A message of type `MessageType.Room_LaunchInvitableUserFlow` will be generated in response. + /// Call `message.IsError()` to check if any error has occurred. + /// + public static Task LaunchInvitableUserFlow(UInt64 roomID) + { + if (!CoreService.IsInitialized()) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_LaunchInvitableUserFlow(roomID)); + } + + /// Updates the data store of the current room (the caller should be the room owner). + /// @note Room data stores only allow string values. The maximum key length is 32 bytes and the maximum value length is 64 bytes. + /// If you provide illegal values, this method will return an error. + /// The ID of the room that you currently own (call `Room.OwnerOptional` to check). + /// The key/value pairs to add or update. Null value will clear a given key. + /// The request ID of this async function. + /// | Error Code| Error Message | + /// |---|---| + /// |3006004|change datastore failed: need room owner| + /// + /// A message of type `MessageType.Room_UpdateDataStore` will be generated in response. + /// First call `Message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `Message.Data`. + /// + public static Task UpdateDataStore(UInt64 roomId, Dictionary data) + { + KVPairArray kvarray = new KVPairArray((uint) data.Count); + uint n = 0; + foreach (var d in data) + { + var item = kvarray.GetElement(n); + item.SetKey(d.Key); + item.SetStringValue(d.Value); + n++; + } + + return new Task(CLIB.ppf_Room_UpdateDataStore(roomId, kvarray.GetHandle(), kvarray.Size)); + } + + /// Creates a new private room and joins it. + /// @note This type of room can be obtained by querying the room where + /// a friend is, so it is suitable for playing with friends. + /// + /// Specifies who can join the room: + /// * `0`: nobody + /// * `1`: everybody + /// * `2`: friends of members + /// * `3`: friends of the room owner + /// * `4`: invited users + /// * `5`: unknown + /// + /// The maximum number of members allowed in the room, including the room creator. + /// Room configuration for this request. + /// Request information of type Task, including the request id, and its response message will contain data of type `Room`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006101|room create: unknown error| + /// |3006114|setting of 'room max user' is too large| + /// + /// A message of type `MessageType.Room_CreateAndJoinPrivate2` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task CreateAndJoinPrivate2(RoomJoinPolicy policy, uint maxUsers, RoomOptions roomOptions) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_CreateAndJoinPrivate2(policy, maxUsers, roomOptions.GetHandle())); + } + + /// Gets the information about a specified room. + /// The ID of the room to get information for. + /// Request information of type `Task`, including the request id, and its response message will contain data of type `Room`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006103|invalid room| + /// |3006301|server error: unknown| + /// + /// A message of type `MessageType.Room_Get` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task Get(UInt64 roomId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_Get(roomId)); + } + + /// Gets the data of the room you are currently in. + /// Request information of type `Task`, including the request id, and its response message will contain data of type `Room`. + /// |Error Code| Error Message | + /// |---|---| + /// |3006104|not in room| + /// + /// A message of type `MessageType.Room_GetCurrent` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload with of type `Room`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task GetCurrent() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_GetCurrent()); + } + + /// Gets the current room of the specified user. + /// @note The user's privacy settings may not allow you to access their room. + /// + /// + /// The ID of the user. + /// Request information of type `Task`, including the request id, and its response message will contain data of type `Room`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006104|not in room| + /// |3006009|tgt player is not in game now| + /// |3006301|server error: unknown| + /// + /// A message of type `MessageType.Room_GetCurrentForUser` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task GetCurrentForUser(string userId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_GetCurrentForUser(userId)); + } + + /// Gets a list of members the user can invite to the room. + /// These members are drawn from the user's friends list and recently + /// encountered list, and filtered based on relevance and interests. + /// @note: Only applicable to private rooms and named rooms. + /// + /// + /// Additional configuration for this request. + /// If you pass `null`, the response will return code `0`. + /// Request information of type `Task`, including the request id, and its response message will contain data of type `UserList`. + /// + /// A message of type `MessageType.Room_GetInvitableUsers2` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `UserList`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task GetInvitableUsers2(RoomOptions roomOptions = null) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (roomOptions == null) + { + return new Task(CLIB.ppf_Room_GetInvitableUsers2(IntPtr.Zero)); + } + else + { + return new Task(CLIB.ppf_Room_GetInvitableUsers2(roomOptions.GetHandle())); + } + } + + /// Gets the list of moderated rooms created for the application. + /// + /// Start page index. + /// Page entry number in response (should range from `5` to `20`). + /// Request information of type `Task`, including the request id, and its response message will contain data of type `RoomList`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006301|server error: unknown| + /// + /// A message of type `MessageType.Room_GetModeratedRooms` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `RoomList`, the room info does not contain the `UserList` info. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task GetModeratedRooms(int index, int size) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_GetModeratedRooms(index, size)); + } + + /// Invites a user to the current room. + /// @note The user invited will receive a notification of type `MessageType.Notification_Room_InviteReceived`. + /// + /// + /// The ID of the room. + /// The user's invitation token, which is returned by `RoomService.GetInvitableUsers2()`. + /// Request information of type `Task`, including the request id, and its response message will contain data of type `Room`. + /// + /// A message of type `MessageType.Room_InviteUser` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task InviteUser(UInt64 roomId, string token) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_InviteUser(roomId, token)); + } + + /// Joins the target room and meanwhile leaves the current room. + /// + /// The ID of the room to join. + /// (Optional) Additional room configuration for this request. + /// Request information of type `Task`, including the request id, and its response message will contain data of type `Room`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006401|logic state checking failed| + /// |3006103|invalid room| + /// |3006102|duplicate join room(regarded as normal entry)| + /// |3006106|exceed max room player number| + /// |3006105|illegal enter request(Players outside the legal list enter)| + /// |3006108|room is locked| + /// + /// A message of type `MessageType.Room_Join2` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task Join2(UInt64 roomId, RoomOptions options) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_Join2(roomId, options.GetHandle())); + } + + /// Kicks a user out of a room. For use by homeowners only. + /// + /// The ID of the room. + /// The ID of the user to be kicked (cannot be yourself). + /// The Length of the ban (in seconds). + /// Request information of type `Task`, including the request id, and its response message will contain data of type `Room`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006006|kick user failed: need room owner| + /// |3006007|kick user failed: tgt user is not in the room| + /// |3006008|kick user failed: can not kick self| + /// + /// A message of type `MessageType.Room_KickUser` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task KickUser(UInt64 roomId, string userId, int kickDuration) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_KickUser(roomId, userId, kickDuration)); + } + + /// Leaves the current room. + /// @note The room you are now in will be returned if the request succeeds. + /// + /// The ID of the room. + /// Request information of type `Task`, including the request id, and its response message will contain data of type `Room`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006401|logic state checking failed(e.g. not in the room)| + /// |3006301|server error: unknown| + /// + /// A message of type `MessageType.Room_Leave` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task Leave(UInt64 roomId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_Leave(roomId)); + } + + /// Sets the description of a room. For use by homeowners only. + /// + /// The ID of the room to set description for. + /// The new description of the room. + /// Request information of type `Task`, including the request id, and its response message will contain data of type `Room`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006005|set description failed: need room owner| + /// + /// A message of type `MessageType.Room_SetDescription` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task SetDescription(UInt64 roomId, string description) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_SetDescription(roomId, description)); + } + + /// Locks/unlocks the membership of a room (the caller should be the room owner) to allow/disallow new members from being able to join the room. + /// @note Locking membership will prevent other users from joining the room through `Join2()`, invitations, etc. Users that are in the room at the time of lock will be able to rejoin. + /// + /// The ID of the room to lock/unlock membership for. + /// The new membership status to set for the room: + /// * `0`: Unknown + /// * `1`: lock + /// * `2`: unlock + /// + /// Request information of type `Task`, including the request id, and its response message will contain data of type `Room`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006104|not in room | + /// |3006109|update membership lock: need room owner| + /// + /// A message of type `MessageType.Room_UpdateMembershipLockStatus` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room` + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task UpdateMembershipLockStatus(UInt64 roomId, RoomMembershipLockStatus membershipLockStatus) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_UpdateMembershipLockStatus(roomId, membershipLockStatus)); + } + + /// Modifies the owner of the room, this person needs to be the person in this room. + /// + /// The ID of the room to change ownership for. + /// The ID of the new user to own the room. The new user must be in the same room. + /// Request information of type `Task`, including the request id, and its response message does not contain data. + /// | Error Code| Error Message | + /// |---|---| + /// |3006001|change owner failed: need room owner| + /// |3006003|change owner failed: duplicate setting| + /// |3006002|change owner failed: new owner not in this room| + /// + /// A message of type `MessageType.Room_UpdateOwner` will be generated in response. + /// Call `message.IsError()` to check if any error has occurred. + /// + public static Task UpdateOwner(UInt64 roomId, string userId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_UpdateOwner(roomId, userId)); + } + + /// Sets the join policy for a specified private room. + /// + /// The ID of the room you want to set join policy for. + /// Specifies who can join the room: + /// * `0`: nobody + /// * `1`: everybody + /// * `2`: friends of members + /// * `3`: friends of the room owner + /// * `4`: invited users + /// * `5`: unknown + /// + /// Request information of type `Task`, including the request id, and its response message will contain data of type `Room`. + /// | Error Code| Error Message | + /// |---|---| + /// |3006104|not in room | + /// |3006112|update room join policy: need room owner| + /// + /// A message of type `MessageType.Room_UpdatePrivateRoomJoinPolicy` will be generated in response. + /// First call `message.IsError()` to check if any error has occurred. + /// If no error has occurred, the message will contain a payload of type `Room`. + /// Extract the payload from the message handle with `message.Data`. + /// + public static Task UpdatePrivateRoomJoinPolicy(UInt64 roomId, RoomJoinPolicy policy) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Room_UpdatePrivateRoomJoinPolicy(roomId, policy)); + } + + /// Sets the callback to get notified when the user has accepted an invitation. + /// @note You can get the RoomID by 'Message.Data'. Then you can call 'RoomService.Join2' to join it. + /// + /// The callback function will be called when receiving the `Notification_Room_InviteAccepted` message. + public static void SetRoomInviteAcceptedNotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Room_InviteAccepted, handler); + } + + /// Sets the callback to get notified when the current room has been updated. Use `Message.Data` to extract the room. + /// + /// The callback function will be called when receiving the `Notification_Room_RoomUpdate` message. + public static void SetUpdateNotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Room_RoomUpdate, handler); + } + + /// Sets the callback to get notified when the user has been kicked out of a room. + /// Listen to this event to receive a relevant message. Use `Message.Data` to extract the room. + /// + /// The callback function will be called when receiving the `Room_KickUser` message and the value of `requestID` is `0`. + public static void SetKickUserNotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Room_KickUser, handler); + } + + /// Sets the callback to get notified when the room description has been updated. + /// Listen to this event to receive a relevant message. Use `Message.Data` to extract the room. + /// + /// The callback function will be called when receiving the `Room_SetDescription` message and the value of `requestID` is `0`. + public static void SetSetDescriptionNotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Room_SetDescription, handler); + } + + /// Sets the callback to get notified when the room data has been modified. + /// Listen to this event to receive a relevant message. Use `Message.Data` to extract the room. + /// + /// The callback function will be called when receiving the `Room_UpdateDataStore` message and the value of `requestID` is `0`. + public static void SetUpdateDataStoreNotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Room_UpdateDataStore, handler); + } + + /// If a player is passively removed from a room (for example, if they initiate another match within the room and are subsequently removed by the system or if they are kicked out of the room), they will receive a notification. + /// Listen to this event to receive a relevant message. + /// Use `Message.Data` to extract the room. + /// + /// The callback function will be called when receiving the `Room_Leave` message and the value of `requestID` is `0`. + public static void SetLeaveNotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Room_Leave, handler); + } + + /// If a player comes across network or disaster recovery problems after joining a room, they may not receive a notification confirming that they've successfully entered the room. + /// In such cases, the server will resend the notification to ensure that the user receives it. + /// Use `Message.Data` to extract the room. + /// + /// The callback function will be called when receiving the `Room_Join2` message and the value of `requestID` is `0`. + public static void SetJoin2NotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Room_Join2, handler); + } + + /// When there is a change in the room owner, the new owner will receive a notification. + /// Listen to this event to receive a relevant message. + /// Use `Message.Data` to extract the room. + /// + /// The callback function will be called when receiving the `Room_UpdateOwner` message and the value of `requestID` is `0`. + public static void SetUpdateOwnerNotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Room_UpdateOwner, handler); + } + + /// Sets the callback to get notified when the membership status of a room has been changed. + /// Listen to this event to receive a relevant message. Use `Message.Data` to extract the room. + /// + /// The callback function will be called when receiving the "Room_UpdateMembershipLockStatus" message and the value of `requestID` is `0`. + public static void SetUpdateMembershipLockStatusNotificationCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Room_UpdateMembershipLockStatus, handler); + } + } + + public class RoomOptions + { + public RoomOptions() + { + Handle = CLIB.ppf_RoomOptions_Create(); + } + + /// + /// Sets the data store for a room. + /// + /// A unique identifier that maps to a value. + /// The data. + public void SetDataStore(string key, string value) + { + CLIB.ppf_RoomOptions_SetDataStoreString(Handle, key, value); + } + + /// + /// Clears the data store for a room. + /// + public void ClearDataStore() + { + CLIB.ppf_RoomOptions_ClearDataStore(Handle); + } + + /// + /// Sets whether to exclude recently-met users. + /// + /// + /// * `true`: exclude + /// * `false`: not exclude + /// + public void SetExcludeRecentlyMet(bool value) + { + CLIB.ppf_RoomOptions_SetExcludeRecentlyMet(Handle, value); + } + + /// + /// Sets the maximum number of users to return. + /// + /// The maximum number of users to return. + public void SetMaxUserResults(uint value) + { + CLIB.ppf_RoomOptions_SetMaxUserResults(Handle, value); + } + + /// + /// Sets a room ID. + /// @note Only available to \ref RoomService.GetInvitableUsers2. + /// + /// The room ID. + public void SetRoomId(UInt64 value) + { + CLIB.ppf_RoomOptions_SetRoomId(Handle, value); + } + + /// + /// Sets a name for the room. + /// @note Only available to \ref RoomService.JoinOrCreateNamedRoom and \ref RoomService.GetNamedRooms. + /// + /// The room's name. The maximum length is 64 characters. + public void SetRoomName(string roomName) + { + CLIB.ppf_RoomOptions_SetName(Handle, roomName); + } + + /// + /// Sets a password for the room. + /// @note Only available to \ref RoomService.JoinOrCreateNamedRoom and \ref RoomService.GetNamedRooms. + /// + /// The room's password. The maximum length is 64 characters. + public void SetPassword(string password) + { + CLIB.ppf_RoomOptions_SetPassword(Handle, password); + } + + /// + /// Enables/Disables the update of room data. + /// + /// + /// * `true`: enable + /// * `false`: disable + /// + public void SetTurnOffUpdates(bool value) + { + CLIB.ppf_RoomOptions_SetTurnOffUpdates(Handle, value); + } + + + /// For passing to native C + public static explicit operator IntPtr(RoomOptions roomOptions) + { + return roomOptions != null ? roomOptions.Handle : IntPtr.Zero; + } + + ~RoomOptions() + { + CLIB.ppf_RoomOptions_Destroy(Handle); + } + + IntPtr Handle; + + public IntPtr GetHandle() + { + return Handle; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Room.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Room.cs.meta new file mode 100644 index 0000000..1f7977f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Room.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 288ca2a98b45b4d47957eae7a66fc97c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Speech.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Speech.cs new file mode 100644 index 0000000..7ce6f79 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Speech.cs @@ -0,0 +1,120 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using Pico.Platform.Models; + +namespace Pico.Platform +{ + public class SpeechService + { + /// + /// Initializes the automatic speech recognition engine. + /// + /// The initialization result. + public static AsrEngineInitResult InitAsrEngine() + { + return CLIB.ppf_Speech_InitAsrEngine(); + } + + /// + /// Starts automatic speech recognition (ASR). + /// + /// Specifies whether to automatically stop ASR when the speaker stops speaking (i.e., when no voice is detected): + /// * `true`: auto stop + /// * `false`: do not auto stop + /// + /// Specifies whether to show punctuations in the text: + /// * `true`: show + /// * `false`: do not show + /// + /// Specifies the maximum duration allowed for speaking per time. Unit: milliseconds. + /// + /// `0` indicates success and other values indicates failure. + /// + public static int StartAsr(bool autoStop, bool showPunctual, int vadMaxDurationInSeconds) + { + var option = new StartAsrOptions(); + option.SetAutoStop(autoStop); + option.SetShowPunctual(showPunctual); + option.SetVadMaxDurationInSeconds(vadMaxDurationInSeconds); + return CLIB.ppf_Speech_StartAsr((IntPtr) option); + } + + /// + /// Stops automatic speech recognition. + /// + public static void StopAsr() + { + CLIB.ppf_Speech_StopAsr(); + } + + /// + /// When automatic speech recognition is enabled, it constantly converts the transmitted speech into text and returns it through the callback. + /// @note After reconnection following a network disconnection during the recognition process, only the text recognized from the speech after the reconnection will be returned, + /// and the text recognized from the speech before the disconnection will not be returned. + /// + /// Returns the recognition result. + public static void SetOnAsrResultCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Speech_OnAsrResult, handler); + } + + /// + /// If an error occurs during the speech recognition process, it will be returned through this callback. + /// + /// Returns the information about the error. + public static void SetOnSpeechErrorCallback(Message.Handler handler) + { + Looper.RegisterNotifyHandler(MessageType.Notification_Speech_OnSpeechError, handler); + } + } + + public class StartAsrOptions + { + public StartAsrOptions() + { + Handle = CLIB.ppf_StartAsrOptions_Create(); + } + + + public void SetAutoStop(bool value) + { + CLIB.ppf_StartAsrOptions_SetAutoStop(Handle, value); + } + + + public void SetVadMaxDurationInSeconds(int value) + { + CLIB.ppf_StartAsrOptions_SetVadMaxDurationInSeconds(Handle, value); + } + + + public void SetShowPunctual(bool value) + { + CLIB.ppf_StartAsrOptions_SetShowPunctual(Handle, value); + } + + /// For passing to native C + public static explicit operator IntPtr(StartAsrOptions options) + { + return options != null ? options.Handle : IntPtr.Zero; + } + + ~StartAsrOptions() + { + CLIB.ppf_StartAsrOptions_Destroy(Handle); + } + + public IntPtr Handle; + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Speech.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Speech.cs.meta new file mode 100644 index 0000000..67267e1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Speech.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c640c57562fe4afd8f49c65022cc336b +timeCreated: 1679484591 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Sport.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Sport.cs new file mode 100644 index 0000000..f36037c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Sport.cs @@ -0,0 +1,108 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + * + * SportService provides multiple APIs for you to access + * users' exercise data from the built-in PICO app — PICO Fitness. + + * When users are working out with PICO VR headsets, the app records + * their exercise data, including exercise duration, calories burned, + * exercise plan, preferences, and more. + + * With the APIs provided by the service, you can gather data to + * understand the exercise habits of individuals, thereby providing + * users with a better exercise experience. + */ + public static class SportService + { + /// + /// Gets a user's basic information and exercise plan. + /// + /// The \ref Pico.Platform.Models.SportUserInfo class containing the following: + /// * `Gender` + /// * `Birthday` + /// * `Stature`: The natural height in centimeters. + /// * `Weight`: The weight in kilograms. + /// * `SportLevel`: `1`-low; `2`-medium; `3`-high. + /// * `DailyDurationInMinutes`: The planned daily exercise duration (in minutes). + /// * `DaysPerWeek`: The planned days for exercise per week. + /// * `SportTarget`: "lose weight" or "stay healthy". + /// + public static Task GetUserInfo() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Sport_GetUserInfo()); + } + + /// + /// Gets a summary of the user's daily exercise data for a specified period within the recent 90 days. + /// For example, if the period you set is between 2022/08/16 and 2022/08/18, the exercise data generated on 08/16, 08/17, and 08/18 will be returned. + /// + /// A DateTime struct defining the begin time of the period. The begin time should be no earlier than 90 days before the current time. + /// A DateTime struct defining the end time of the period, . + /// The \ref Pico.Platform.Models.SportDailySummaryList class containing the exercise data generated on each day within the specified period, including: + /// * `Id`: Summary ID. + /// * `Date`: The date when the data was generated. + /// * `DurationInSeconds`: The actual daily exercise duration in seconds. + /// * `PlanDurationInMinutes`: The planned daily exercise duration in minutes. + /// * `Calorie`: The actual daily calorie burned. + /// * `PlanCalorie`: The planned daily calorie to burn. + /// + public static Task GetDailySummary(DateTime beginTime, DateTime endTime) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Sport_GetDailySummary(TimeUtil.DateTimeToMilliSeconds(beginTime), TimeUtil.DateTimeToMilliSeconds(endTime))); + } + + /// + /// Get a summary of the user's exercise data for a specified period within + /// the recent 24 hours. The period should not exceed 24 hours. + /// + /// A DateTime struct defining the begin time of the period. The begin time should be no earlier than 24 hours before the current time. + /// A DateTime struct defining the end time of the period. + /// The \ref Pico.Platform.Models.SportSummary class containing the following: + /// * `DurationInSeconds`: The actual exercise duration. + /// * `Calorie`: The actual calorie burned. + /// * `StartTime`: The start time you defined. + /// * `EndTime`: The end time you defined. + /// + public static Task GetSummary(DateTime beginTime, DateTime endTime) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_Sport_GetSummary(TimeUtil.DateTimeToMilliSeconds(beginTime), TimeUtil.DateTimeToMilliSeconds(endTime))); + } + + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Sport.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Sport.cs.meta new file mode 100644 index 0000000..9befd0d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/Sport.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9138eed51e124e57aac6c3c6a2198ce9 +timeCreated: 1657617033 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/User.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/User.cs new file mode 100644 index 0000000..8d5f709 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/User.cs @@ -0,0 +1,290 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using Pico.Platform.Models; +using UnityEngine; + +namespace Pico.Platform +{ + /** + * \ingroup Platform + * + * Account & Friends service allows developers to access the info of a specified account, get the friends list of the currently logged-in users, send friend requests, and more. + */ + public static class UserService + { + /// + /// Returns an access token for this user. Starting from SDK V2.2.0, + /// the system caches the access token upon the first request, allowing subsequent requests to use the cached token information stored locally. + /// @note User's permission is required if the user uses this app for the first time. + /// + /// The access token for the current user. + public static Task GetAccessToken() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_GetAccessToken()); + } + + /// + /// Gets the organization ID for a specified user. + /// Different users have different organization IDs. + /// A user has only one fixed unique organization ID for all the apps created by the same organization. + /// + /// + /// The ID of the user. It's the user's openID in the current app. + /// The `OrgScopedID` structure that contains the user's organization ID. + public static Task GetOrgScopedID(string userID) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_GetOrgScopedID(userID)); + } + + /// + /// Gets the information about the current logged-in user. + /// + /// The User structure that contains the details about the user. + public static Task GetLoggedInUser() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_GetLoggedInUser()); + } + + /// + /// Gets the information about a specified user. + /// @note The same user has different user IDs for different apps. + /// + /// The ID of the user. + /// The User structure that contains the details about the specified user. + public static Task Get(string userId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_Get(userId)); + } + + /// + /// Gets the friend list of the current user. + /// @note Friends who don't use this app won't appear in this list. + /// + /// The friend list of the current user. + public static Task GetFriends() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_GetLoggedInUserFriends()); + } + + /// + /// Gets the relationship between the current user and other users. + /// + /// The list of user IDs. + /// The request queries the current user's relationship with specified users. + /// A single request can pass no more than 20 user IDs. + /// `UserRelationResult` which is a dictionary of user relationships. + public static Task GetUserRelations(string[] userIds) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_GetRelations(userIds)); + } + + /// + /// Launches the flow to apply for friendship with someone. + /// + /// The ID of the user that the friend request is sent to. + /// `LaunchFriendRequest` that indicates whether the request is sent successfully. + public static Task LaunchFriendRequestFlow(string userId) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_LaunchFriendRequestFlow(userId)); + } + + /// + /// Gets the friends of the logged-in user and the rooms the friends might be in. + /// + /// `UserRoomList` that contains the friend and room data. If a friend is not in any room, the `room` field will be null. + public static Task GetFriendsAndRooms() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_GetLoggedInUserFriendsAndRooms()); + } + + /// + /// Gets the next page of user and room list. + /// + /// The user and room list from the current page. + /// The user and room list from the next page. + public static Task GetNextUserAndRoomListPage(UserRoomList list) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (!list.HasNextPage) + { + Debug.LogWarning("GetNextUserAndRoomListPage: List has no next page"); + return null; + } + + if (String.IsNullOrEmpty(list.NextPageParam)) + { + Debug.LogWarning("GetNextUserAndRoomListPage: list.NextPageParam is empty"); + return null; + } + + return new Task(CLIB.ppf_User_GetNextUserAndRoomArrayPage(list.NextPageParam)); + } + + /// + /// Gets the next page of user list. + /// + /// The user list from the current page. + /// The user list from the next page. + public static Task GetNextUserListPage(UserList list) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + if (!list.HasNextPage) + { + Debug.LogWarning("GetNextUserListPage: List has no next page"); + return null; + } + + if (String.IsNullOrEmpty(list.NextPageParam)) + { + Debug.LogWarning("GetNextUserListPage: list.NextPageParam is empty"); + return null; + } + + return new Task(CLIB.ppf_User_GetNextUserArrayPage(list.NextPageParam)); + } + + /// + /// Gets authorized permissions. + /// + /// + /// A struct containing the access token and permission list. The `UserID` field is empty so do NOT use it. + /// + public static Task GetAuthorizedPermissions() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_GetAuthorizedPermissions()); + } + + /// + /// Requests user permissions. The user will received a pop-up notification window. + /// + /// The list of permissions to request. You can use constants in \ref Pico.Platform.Models.Permissions. + /// + /// A struct containing the access token and permission list. + public static Task RequestUserPermissions(params string[] permissionList) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_RequestUserPermissions(permissionList)); + } + + /// + /// Checks whether the current user is entitled to use the current app. + /// + /// If the user is not entitled, the system will close the app and show a dialog box to remind the user to buy the app from the PICO Store. + /// For customizations, you can set param `killApp` to `false` and then customize the dialog. + /// + /// Determines whether the system closes the app if the user fails to pass the entitlement check. + /// The default value is `true`. + /// + /// The entitlement check result. + public static Task EntitlementCheck(bool killApp = true) + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_EntitlementCheck(killApp)); + } + + /// + /// Gets the ID token for the current user. The ID token is used for OIDC login. + /// You can use \ref ApplicationService.GetSystemInfo to determine the region of user's device and then choose the proper OIDC identity provider. + /// Read the following articles for more information: + /// * [Unity Service signin with openID connect](https://docs.unity.com/authentication/en/manual/platform-signin-openid-connect) + /// * [PICO SDK guide](http://developer-global.pico-interactive.com/document/unity/accounts-and-friends/) + /// @note User's permission is required if the user uses this app for the first time. Call \ref UserService.RequestUserPermissions to request desired permissions in a batch. + /// + /// The ID token for the current user. + public static Task GetIdToken() + { + if (!CoreService.Initialized) + { + Debug.LogError(CoreService.NotInitializedError); + return null; + } + + return new Task(CLIB.ppf_User_GetIdToken()); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/User.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/User.cs.meta new file mode 100644 index 0000000..9764fd3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Platform/Scripts/Service/User.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d99829583dd409e439ddfb0930207154 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime.meta new file mode 100644 index 0000000..e465db0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eef18d110a825854fb83f5834ff8eebf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android.meta new file mode 100644 index 0000000..09c31a9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9b03ab07eeedbd547b6f82096aaf7407 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android/arm64.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android/arm64.meta new file mode 100644 index 0000000..5bb043f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android/arm64.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 18b9a599c3004344ea5103af8f11d458 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android/arm64/libopenxr_loader.so b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Android/arm64/libopenxr_loader.so new file mode 100644 index 0000000000000000000000000000000000000000..525fac1c6842f3caac91e11190bc3b132c6f18d3 GIT binary patch literal 1141360 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∨X&oQsTi{^U&MtSOa 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

7{#G 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

7yItr_c}E$ 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 z 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

uk`<*;LsZ2%OfzGSvk$+UHkbiYB>LZT} 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 z%0D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 z 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 vZm9Ep7^p7dxwL(); + originalGrip = gripTran.localEulerAngles; + originalJoystick = primary2DAxisTran.localEulerAngles; + originalTrigger = triggerTran.localEulerAngles; + } + + void Update() + { + InputDevices.GetDeviceAtXRNode(controllerL + ? XRNode.LeftHand + : XRNode.RightHand).TryGetFeatureValue(CommonUsages.primary2DAxis, out axis2D); + InputDevices.GetDeviceAtXRNode(controllerL + ? XRNode.LeftHand + : XRNode.RightHand).TryGetFeatureValue(CommonUsages.grip, out grip); + InputDevices.GetDeviceAtXRNode(controllerL + ? XRNode.LeftHand + : XRNode.RightHand).TryGetFeatureValue(CommonUsages.trigger, out trigger); + InputDevices.GetDeviceAtXRNode(controllerL + ? XRNode.LeftHand + : XRNode.RightHand).TryGetFeatureValue(CommonUsages.primaryButton, out primaryButton); + InputDevices.GetDeviceAtXRNode(controllerL + ? XRNode.LeftHand + : XRNode.RightHand).TryGetFeatureValue(CommonUsages.secondaryButton, out secondaryButton); + InputDevices.GetDeviceAtXRNode(controllerL + ? XRNode.LeftHand + : XRNode.RightHand).TryGetFeatureValue(CommonUsages.menuButton, out menuButton); + + float x = Mathf.Clamp(axis2D.x * 10f, -10f, 10f); + float z = Mathf.Clamp(axis2D.y * 10f, -10f, 10f); + if (primary2DAxisTran != null) + { + if (controllerL) + { + primary2DAxisTran.localEulerAngles = new Vector3(-z, 0, x) + originalJoystick; + } + else + { + primary2DAxisTran.localEulerAngles = new Vector3(-z, 0, -x) + originalJoystick; + } + } + + trigger *= -15; + if (triggerTran != null) + triggerTran.localEulerAngles = new Vector3(trigger, 0f, 0f) + originalTrigger; + grip *= 12; + if (gripTran != null) + gripTran.localEulerAngles = new Vector3(0f, grip, 0f) + originalGrip; + + if (controllerAnimator != null) + { + controllerAnimator.SetBool(primary, primaryButton); + controllerAnimator.SetBool(secondary, secondaryButton); + + + if (controllerL) + controllerAnimator.SetBool(menu, menuButton); + else + controllerAnimator.SetBool(media, menuButton); + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerAnimator.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerAnimator.cs.meta new file mode 100644 index 0000000..8379352 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerAnimator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0551a3e12ecf0614fa83e84a93d87bb5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerG3Animator.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerG3Animator.cs new file mode 100644 index 0000000..731e59b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerG3Animator.cs @@ -0,0 +1,70 @@ +/******************************************************************************* +Copyright ? 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using UnityEngine; +using UnityEngine.XR; + +namespace Unity.XR.PXR +{ + public class PXR_ControllerG3Animator : MonoBehaviour + { + public Transform triggerTran; + public Transform menuTran; + public Transform touchPadTran; + + + private bool primaryAxisState = false; + private bool menuButtonState; + private float trigger; + + private Vector3 menu; + private Vector3 originTrigger; + private Vector3 touchPadPos; + + + private InputDevice currentController; + private int handness; + + void Start() + { + menu = menuTran.localPosition; + originTrigger = triggerTran.localEulerAngles; + touchPadPos = touchPadTran.localPosition; + } + + void Update() + { + InputDevices.GetDeviceAtXRNode(XRNode.RightHand).TryGetFeatureValue(CommonUsages.primary2DAxisClick, out primaryAxisState); + InputDevices.GetDeviceAtXRNode(XRNode.RightHand).TryGetFeatureValue(CommonUsages.menuButton, out menuButtonState); + InputDevices.GetDeviceAtXRNode(XRNode.RightHand).TryGetFeatureValue(CommonUsages.trigger, out trigger); + + if (triggerTran != null) + { + trigger *= -9.0f; + triggerTran.localEulerAngles = new Vector3(0f, 0f, Mathf.Clamp(trigger, -9f, 0f)) + originTrigger; + } + + if (touchPadTran != null) + { + if (primaryAxisState) + touchPadTran.localPosition = touchPadPos + new Vector3(0f, -0.0005f, 0f); + else + touchPadTran.localPosition = touchPadPos; + } + + if (menuButtonState) + menuTran.localPosition = new Vector3(0f, -0.00021f, 0f) + menu; + else + menuTran.localPosition = menu; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerG3Animator.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerG3Animator.cs.meta new file mode 100644 index 0000000..001fb39 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerG3Animator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e4ee62d8e7a57c8458f969922f7a06a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerLoader.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerLoader.cs new file mode 100644 index 0000000..22806a7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerLoader.cs @@ -0,0 +1,182 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System.Collections; +using System.IO; +using LitJson; +using Unity.XR.OpenXR.Features.PICOSupport; +using UnityEngine; +using UnityEngine.XR; + +namespace Unity.XR.PXR +{ + public class PXR_ControllerLoader : MonoBehaviour + { + [SerializeField] + private bool Lefthand; + + public GameObject neo3L; + public GameObject neo3R; + public GameObject PICO_4L; + public GameObject PICO_4R; + public GameObject G3; + public GameObject PICO_4U_L; + public GameObject PICO_4U_R; + + private Texture2D modelTexture2D; + + private int controllerType = -1; + + private JsonData curControllerData = null; + private int systemOrLocal = 0; + private bool loadModelSuccess = false; + private string modelName = ""; + private string texFormat = ""; + private string prePath = ""; + private bool isconnect = false; + + private bool leftControllerState = false; + private bool rightControllerState = false; + + private enum ControllerSimulationType + { + None, + Neo3, + PICO4, + G3, + PICO4U + } +#if UNITY_EDITOR + [SerializeField] + private ControllerSimulationType controllerSimulation = ControllerSimulationType.None; +#endif + + private InputDevice currentController; + void Awake() + { + +#if UNITY_EDITOR + switch (controllerSimulation) + { + case ControllerSimulationType.Neo3: + { + Instantiate(Lefthand ? neo3L : neo3R, transform, false); + break; + } + case ControllerSimulationType.PICO4: + { + Instantiate(Lefthand ? PICO_4L : PICO_4R, transform, false); + break; + } + case ControllerSimulationType.G3: + { + Instantiate(G3, transform, false); + break; + } + case ControllerSimulationType.PICO4U: + { + Instantiate(Lefthand ? PICO_4U_L : PICO_4U_R, transform, false); + break; + } + } +#endif + } + + void Start() + { + controllerType = OpenXRExtensions.GetControllerType(); + InputDevices.GetDeviceAtXRNode(Lefthand + ? XRNode.LeftHand + : XRNode.RightHand).TryGetFeatureValue(CommonUsages.isTracked, out isconnect); + if (isconnect) + { + RefreshController(); + } + + InvokeRepeating("CheckConnect", 0, 0.5f); + } + + void CheckConnect() + { + InputDevices.GetDeviceAtXRNode(Lefthand + ? XRNode.LeftHand + : XRNode.RightHand).TryGetFeatureValue(CommonUsages.isTracked, out isconnect); + if (isconnect) + { + RefreshController(); + } + else + { + DestroyLocalController(); + } + } + + private void RefreshController() + { + if (!loadModelSuccess) + { + LoadControllerFromPrefab(Lefthand); + } + + if (loadModelSuccess) + { + var currentController = transform.Find(modelName); + currentController.gameObject.SetActive(true); + } + + } + + private void DestroyLocalController() + { + if (loadModelSuccess) + { + var currentController = transform.Find(modelName); + currentController.gameObject.SetActive(false); + } + } + + private void LoadControllerFromPrefab(bool hand) + { + GameObject go; + switch (controllerType) + { + case 5: + go= Instantiate(hand ? neo3L : neo3R, transform, false); + go.name=modelName = (hand ? neo3L : neo3R).name; + loadModelSuccess = true; + break; + case 6: + go= Instantiate(hand ? PICO_4L : PICO_4R, transform, false); + go.name=modelName = (hand ? PICO_4L : PICO_4R).name; + loadModelSuccess = true; + break; + case 7: + go=Instantiate(G3, transform, false); + go.name=modelName = G3.name; + loadModelSuccess = true; + break; + case 8: + go=Instantiate(hand ? PICO_4U_L : PICO_4U_R, transform, false); + go.name=modelName = (hand ? PICO_4U_L : PICO_4U_R).name; + loadModelSuccess = true; + break; + default: + loadModelSuccess = false; + break; + } + } + + + + } +} + diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerLoader.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerLoader.cs.meta new file mode 100644 index 0000000..37c0b39 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerLoader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c1ba2bcdb414e3b47aca41fdc1a87e64 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerPower.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerPower.cs new file mode 100644 index 0000000..70c24fb --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerPower.cs @@ -0,0 +1,128 @@ +/******************************************************************************* +Copyright ? 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using Unity.XR.PXR; +using UnityEngine; +using UnityEngine.XR; + +public class PXR_ControllerPower : MonoBehaviour +{ + [SerializeField] + private Texture power1; + [SerializeField] + private Texture power2; + [SerializeField] + private Texture power3; + [SerializeField] + private Texture power4; + [SerializeField] + private Texture power5; + + private Material powerMaterial; + private float interval = 2f; + public bool controllerL=false; + + // Start is called before the first frame update + void Awake() + { + if (GetComponent() != null) + { + powerMaterial = GetComponent().material; + + } + else + { + powerMaterial = GetComponent().material; + } + + + // Vector3 a=Vector3.zero; + // InputDevices.GetDeviceAtXRNode(XRNode.CenterEye).TryGetFeatureValue(EyeTrackingUsages.gazePosition, out a); + } + + + void OnEnable() + { + RefreshPower(); + } + + private void RefreshPower() + { + var curBattery = 0f; + if (controllerL) + { + InputDevices.GetDeviceAtXRNode(XRNode.LeftHand).TryGetFeatureValue(CommonUsages.batteryLevel, out curBattery); + } + else + { + InputDevices.GetDeviceAtXRNode(XRNode.RightHand).TryGetFeatureValue(CommonUsages.batteryLevel, out curBattery); + } + switch ((int)curBattery) + { + case 1: + { + powerMaterial.SetTexture("_MainTex", power1); + powerMaterial.SetTexture("_EmissionMap", power1); + } + + break; + case 2: + { + powerMaterial.SetTexture("_MainTex", power2); + powerMaterial.SetTexture("_EmissionMap", power2); + } + + break; + case 3: + { + powerMaterial.SetTexture("_MainTex", power3); + powerMaterial.SetTexture("_EmissionMap", power3); + } + + break; + case 4: + { + powerMaterial.SetTexture("_MainTex", power4); + powerMaterial.SetTexture("_EmissionMap", power4); + } + + break; + case 5: + { + powerMaterial.SetTexture("_MainTex", power5); + powerMaterial.SetTexture("_EmissionMap", power5); + } + + break; + default: + { + powerMaterial.SetTexture("_MainTex", power1); + powerMaterial.SetTexture("_EmissionMap", power1); + } + + break; + } + } + + // Update is called once per frame + void Update() + { + interval -= Time.deltaTime; + if (interval > 0) + return; + interval = 2f; + + RefreshPower(); + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerPower.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerPower.cs.meta new file mode 100644 index 0000000..1810af9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerPower.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7cfc8380945cdad43ae2cacaadf47013 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerWithHandAnimator.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerWithHandAnimator.cs new file mode 100644 index 0000000..026b0c8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerWithHandAnimator.cs @@ -0,0 +1,304 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.XR; + + +namespace Unity.XR.PXR +{ + public class PXR_ControllerWithHandAnimator : MonoBehaviour + { + public bool controllerL=false; + + private Animator mAnimator; + + + private readonly float animation_time = 0.05f; + private float per_animation_step = 0.1f; + + //trigger; + private readonly string trigger_Touch_LayerName = "trigger_touch"; + private int trigger_Touch_LayerIndex; + private readonly string trigger_Value_LayerName = "trigger_press"; + private int trigger_Value_LayerIndex; + private bool trigger_Touch; + private float trigger_Value; + private float trigger_Touch_Weight = 0f; + + // A/X; + private readonly string X_A_Touch_LayerName = "X_A_touch"; + private int X_A_Touch_LayerIndex; + private readonly string X_A_Press_LayerName = "X_A_press"; + private int X_A_Press_LayerIndex; + private bool X_A_Press; + private bool X_A_Touch; + private float X_A_Touch_Weight = 0f; + + // B/Y; + private readonly string Y_B_Touch_LayerName = "Y_B_touch"; + private int Y_B_Touch_LayerIndex; + private readonly string Y_B_Press_LayerName = "Y_B_press"; + private int Y_B_Press_LayerIndex; + private bool Y_B_Press; + private bool Y_B_Touch; + private float Y_B_Touch_Weight = 0f; + + //Y/B or X/A + private readonly string X_A_Y_B_Press_LayerName = "X_A_Y_B_press"; + private int X_A_Y_B_Press_LayerIndex; + + //Y/B or X/A + private readonly string X_A_Y_B_Touch_LayerName = "X_A_Y_B_touch"; + private int X_A_Y_B_Touch_LayerIndex; + private float X_A_Y_B_Touch_Weight = 0f; + + //grip; + private readonly string grip_Value_LayerName = "grip_press"; + private int grip_Value_LayerIndex; + private float grip_Value; + + //rocker + private readonly string primary2DAxis_Touch_LayerName = "axis_touch"; + private int primary2DAxis_Touch_LayerIndex; + private readonly string primary2DAxis_Vertical = "axis_vertical"; + private int primary2DAxis_Vertical_Index; + private readonly string primary2DAxis_Horizontal = "axis_horizontal"; + private int primary2DAxis_Horizontal_Index; + private Vector2 primary2DAxisVec2; + private bool primary2DAxis_Touch; + private float primary2DAxis_Touch_Weight = 0f; + + //print screen + private readonly string menu_Press_LayerName = "thumbMenu"; + private int menu_Press_LayerIndex; + private bool menu_Press; + private float menu_Press_Weight; + + //home + private readonly string pico_Press_LayerName = "thumbPico"; + private int pico_Press_LayerIndex; + private bool pico_Press; + private float pico_Press_Weight; + + //thumb rest + private readonly string thumbstick_Touch_LayerName = "thumbstick_touch"; + private int thumbstick_Touch_LayerIndex; + private bool thumbstick_Touch; + private float thumbstick_Touch_Weight; + + + // Start is called before the first frame update + void Start() + { + per_animation_step = 1.0f / animation_time; + mAnimator = GetComponent(); + + if (mAnimator != null) + { + trigger_Touch_LayerIndex = mAnimator.GetLayerIndex(trigger_Touch_LayerName); + trigger_Value_LayerIndex = mAnimator.GetLayerIndex(trigger_Value_LayerName); + grip_Value_LayerIndex = mAnimator.GetLayerIndex(grip_Value_LayerName); + + X_A_Touch_LayerIndex = mAnimator.GetLayerIndex(X_A_Touch_LayerName); + X_A_Press_LayerIndex = mAnimator.GetLayerIndex(X_A_Press_LayerName); + Y_B_Touch_LayerIndex = mAnimator.GetLayerIndex(Y_B_Touch_LayerName); + Y_B_Press_LayerIndex = mAnimator.GetLayerIndex(Y_B_Press_LayerName); + X_A_Y_B_Press_LayerIndex = mAnimator.GetLayerIndex(X_A_Y_B_Press_LayerName); + X_A_Y_B_Touch_LayerIndex = mAnimator.GetLayerIndex(X_A_Y_B_Touch_LayerName); + primary2DAxis_Touch_LayerIndex = mAnimator.GetLayerIndex(primary2DAxis_Touch_LayerName); + thumbstick_Touch_LayerIndex = mAnimator.GetLayerIndex(thumbstick_Touch_LayerName); + + primary2DAxis_Vertical_Index = Animator.StringToHash(primary2DAxis_Vertical); + primary2DAxis_Horizontal_Index = Animator.StringToHash(primary2DAxis_Horizontal); + } + else + { + Debug.Log("Animator is null"); + } + } + + // Update is called once per frame + void Update() + { + InputDevices.GetDeviceAtXRNode(controllerL ? XRNode.LeftHand : XRNode.RightHand).TryGetFeatureValue(CommonUsages.primaryButton, out X_A_Press); + InputDevices.GetDeviceAtXRNode(controllerL ? XRNode.LeftHand : XRNode.RightHand).TryGetFeatureValue(CommonUsages.primaryTouch, out X_A_Touch); + + InputDevices.GetDeviceAtXRNode(controllerL ? XRNode.LeftHand : XRNode.RightHand).TryGetFeatureValue(CommonUsages.secondaryButton, out Y_B_Press); + InputDevices.GetDeviceAtXRNode(controllerL ? XRNode.LeftHand : XRNode.RightHand).TryGetFeatureValue(CommonUsages.secondaryTouch, out Y_B_Touch); + + InputDevices.GetDeviceAtXRNode(controllerL ? XRNode.LeftHand : XRNode.RightHand).TryGetFeatureValue(CommonUsages.trigger, out trigger_Value); + InputDevices.GetDeviceAtXRNode(controllerL ? XRNode.LeftHand : XRNode.RightHand).TryGetFeatureValue(CommonUsages.triggerButton, out trigger_Touch); + + InputDevices.GetDeviceAtXRNode(controllerL ? XRNode.LeftHand : XRNode.RightHand).TryGetFeatureValue(CommonUsages.grip, out grip_Value); + + InputDevices.GetDeviceAtXRNode(controllerL ? XRNode.LeftHand : XRNode.RightHand).TryGetFeatureValue(CommonUsages.primary2DAxis, out primary2DAxisVec2); + InputDevices.GetDeviceAtXRNode(controllerL ? XRNode.LeftHand : XRNode.RightHand).TryGetFeatureValue(CommonUsages.primary2DAxisTouch, out primary2DAxis_Touch); + if (!primary2DAxis_Touch) + { + if (primary2DAxisVec2 != Vector2.zero) + primary2DAxis_Touch = true; + } + + InputDevices.GetDeviceAtXRNode(controllerL ? XRNode.LeftHand : XRNode.RightHand).TryGetFeatureValue(CommonUsages.menuButton, out menu_Press); + + if (Y_B_Touch && primary2DAxisVec2 == Vector2.zero) + { + if (Y_B_Press) + { + Y_B_Touch_Weight = 1.0f; + mAnimator.SetLayerWeight(Y_B_Touch_LayerIndex, Y_B_Touch_Weight); + mAnimator.SetLayerWeight(Y_B_Press_LayerIndex, 1.0f); + mAnimator.SetLayerWeight(X_A_Y_B_Press_LayerIndex, X_A_Press ? 1.0f : 0.0f); + } + else + { + if (X_A_Touch) + { + if (X_A_Press) + { + X_A_Touch_Weight = 1.0f; + mAnimator.SetLayerWeight(X_A_Touch_LayerIndex, X_A_Touch_Weight); + } + else + { + if (X_A_Y_B_Touch_Weight < 0.9999f) + { + X_A_Y_B_Touch_Weight = Mathf.Min(mAnimator.GetLayerWeight(X_A_Y_B_Touch_LayerIndex) + Time.deltaTime * per_animation_step, 1.0f); + mAnimator.SetLayerWeight(X_A_Y_B_Touch_LayerIndex, X_A_Y_B_Touch_Weight); + } + } + mAnimator.SetLayerWeight(X_A_Press_LayerIndex, X_A_Press ? 1.0f : 0f); + } + else + { + if (Y_B_Touch_Weight < 0.9999f) + { + Y_B_Touch_Weight = Mathf.Min(mAnimator.GetLayerWeight(Y_B_Touch_LayerIndex) + Time.deltaTime * per_animation_step, 1.0f); + mAnimator.SetLayerWeight(Y_B_Touch_LayerIndex, Y_B_Touch_Weight); + } + if (X_A_Y_B_Touch_Weight > 0.0001f) + { + X_A_Y_B_Touch_Weight = Mathf.Max(mAnimator.GetLayerWeight(X_A_Y_B_Touch_LayerIndex) - Time.deltaTime * per_animation_step, 0.0f); + mAnimator.SetLayerWeight(X_A_Y_B_Touch_LayerIndex, X_A_Y_B_Touch_Weight); + } + + if (X_A_Touch_Weight > 0.0001f) + { + X_A_Touch_Weight = Mathf.Max(mAnimator.GetLayerWeight(X_A_Touch_LayerIndex) - Time.deltaTime * per_animation_step, 0.0f); + mAnimator.SetLayerWeight(X_A_Touch_LayerIndex, X_A_Touch_Weight); + } + } + mAnimator.SetLayerWeight(Y_B_Press_LayerIndex, 0.0f); + mAnimator.SetLayerWeight(X_A_Y_B_Press_LayerIndex, 0.0f); + } + + } + else + { + if (Y_B_Touch_Weight > 0.0001f) + { + Y_B_Touch_Weight = Mathf.Max(mAnimator.GetLayerWeight(Y_B_Touch_LayerIndex) - Time.deltaTime * per_animation_step, 0.0f); + mAnimator.SetLayerWeight(Y_B_Touch_LayerIndex, Y_B_Touch_Weight); + mAnimator.SetLayerWeight(Y_B_Press_LayerIndex, 0.0f); + mAnimator.SetLayerWeight(X_A_Y_B_Press_LayerIndex, 0.0f); + } + if (X_A_Y_B_Touch_Weight > 0.0001f) + { + X_A_Y_B_Touch_Weight = Mathf.Max(mAnimator.GetLayerWeight(X_A_Y_B_Touch_LayerIndex) - Time.deltaTime * per_animation_step, 0.0f); + + mAnimator.SetLayerWeight(X_A_Y_B_Touch_LayerIndex, X_A_Y_B_Touch_Weight); + mAnimator.SetLayerWeight(Y_B_Press_LayerIndex, 0.0f); + mAnimator.SetLayerWeight(X_A_Y_B_Press_LayerIndex, 0.0f); + } + if (X_A_Touch && primary2DAxisVec2 == Vector2.zero) + { + if (X_A_Press) + { + X_A_Touch_Weight = 1.0f; + mAnimator.SetLayerWeight(X_A_Touch_LayerIndex, X_A_Touch_Weight); + } + else + { + if (X_A_Touch_Weight < 0.9999f) + { + X_A_Touch_Weight = Mathf.Min(mAnimator.GetLayerWeight(X_A_Touch_LayerIndex) + Time.deltaTime * per_animation_step, 1.0f); + mAnimator.SetLayerWeight(X_A_Touch_LayerIndex, X_A_Touch_Weight); + } + } + mAnimator.SetLayerWeight(X_A_Press_LayerIndex, X_A_Press ? 1.0f : 0f); + mAnimator.SetFloat(primary2DAxis_Vertical_Index, 0f); + mAnimator.SetFloat(primary2DAxis_Horizontal_Index, 0f); + } + else + { + if (X_A_Touch_Weight > 0.0001f) + { + X_A_Touch_Weight = Mathf.Max(mAnimator.GetLayerWeight(X_A_Touch_LayerIndex) - Time.deltaTime * per_animation_step, 0.0f); + mAnimator.SetLayerWeight(X_A_Touch_LayerIndex, X_A_Touch_Weight); + mAnimator.SetLayerWeight(X_A_Press_LayerIndex, 0f); + } + if (primary2DAxis_Touch) + { + if (primary2DAxis_Touch_Weight < 0.9999f) + { + primary2DAxis_Touch_Weight = Mathf.Min(mAnimator.GetLayerWeight(primary2DAxis_Touch_LayerIndex) + Time.deltaTime * per_animation_step, 1.0f); + mAnimator.SetLayerWeight(primary2DAxis_Touch_LayerIndex, primary2DAxis_Touch_Weight); + } + mAnimator.SetFloat(primary2DAxis_Vertical_Index, primary2DAxisVec2.y); + mAnimator.SetFloat(primary2DAxis_Horizontal_Index, primary2DAxisVec2.x); + } + else + { + if (primary2DAxis_Touch_Weight > 0.0001f) + { + primary2DAxis_Touch_Weight = Mathf.Max(mAnimator.GetLayerWeight(primary2DAxis_Touch_LayerIndex) - Time.deltaTime * per_animation_step, 0.0f); + mAnimator.SetLayerWeight(primary2DAxis_Touch_LayerIndex, primary2DAxis_Touch_Weight); + + mAnimator.SetFloat(primary2DAxis_Vertical_Index, 0f); + mAnimator.SetFloat(primary2DAxis_Horizontal_Index, 0f); + } + if (thumbstick_Touch) + { + if (thumbstick_Touch_Weight < 0.9999f) + { + thumbstick_Touch_Weight = Mathf.Min(mAnimator.GetLayerWeight(thumbstick_Touch_LayerIndex) + Time.deltaTime * per_animation_step, 1.0f); + mAnimator.SetLayerWeight(thumbstick_Touch_LayerIndex, thumbstick_Touch_Weight); + } + } + else + { + if (thumbstick_Touch_Weight > 0.0001f) + { + thumbstick_Touch_Weight = Mathf.Max(mAnimator.GetLayerWeight(thumbstick_Touch_LayerIndex) - Time.deltaTime * per_animation_step, 0.0f); + mAnimator.SetLayerWeight(thumbstick_Touch_LayerIndex, thumbstick_Touch_Weight); + } + } + + } + } + } + + if (trigger_Touch) + { + if (trigger_Touch_Weight < 0.9999f) + { + trigger_Touch_Weight = Mathf.Min(mAnimator.GetLayerWeight(trigger_Touch_LayerIndex) + Time.deltaTime * per_animation_step, 1.0f); + mAnimator.SetLayerWeight(trigger_Touch_LayerIndex, trigger_Touch_Weight); + } + mAnimator.SetLayerWeight(trigger_Value_LayerIndex, trigger_Value); + } + else + { + if (trigger_Touch_Weight > 0.0001f) + { + trigger_Touch_Weight = Mathf.Max(mAnimator.GetLayerWeight(trigger_Touch_LayerIndex) - Time.deltaTime * per_animation_step, 0.0f); + mAnimator.SetLayerWeight(trigger_Touch_LayerIndex, trigger_Touch_Weight); + } + } + mAnimator.SetLayerWeight(grip_Value_LayerIndex, grip_Value); + + } + } +} + diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerWithHandAnimator.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerWithHandAnimator.cs.meta new file mode 100644 index 0000000..539985a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Controller/PXR_ControllerWithHandAnimator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ad904341cd701b544911a03d77412e1d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features.meta new file mode 100644 index 0000000..0974c5f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7e78bf255aba48829c94f5b6ca2a8ddc +timeCreated: 1685686515 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerFeature.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerFeature.cs new file mode 100644 index 0000000..e6f55cb --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerFeature.cs @@ -0,0 +1,681 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using UnityEngine; +using UnityEngine.Experimental.Rendering; +using UnityEngine.Rendering; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public class CompositeLayerFeature : MonoBehaviour, IComparable + { + private const string TAG = "[POXR_CompositeLayers]"; + public static List Instances = new List(); + + private static int overlayID = 0; + [NonSerialized] + public int overlayIndex; + public int layerDepth; + public int imageIndex = 0; + public OverlayType overlayType = OverlayType.Overlay; + public OverlayShape overlayShape = OverlayShape.Quad; + public TextureType textureType = TextureType.StaticTexture; + public Transform overlayTransform; + public Camera xrRig; + + public Texture[] layerTextures = new Texture[2] { null, null }; + public bool isDynamic = false; + public int[] overlayTextureIds = new int[2]; + public Matrix4x4[] mvMatrixs = new Matrix4x4[2]; + public Vector3[] modelScales = new Vector3[2]; + public Quaternion[] modelRotations = new Quaternion[2]; + public Vector3[] modelTranslations = new Vector3[2]; + public Quaternion[] cameraRotations = new Quaternion[2]; + public Vector3[] cameraTranslations = new Vector3[2]; + public Camera[] overlayEyeCamera = new Camera[2]; + + public bool overrideColorScaleAndOffset = false; + public Vector4 colorScale = Vector4.one; + public Vector4 colorOffset = Vector4.zero; + + // Eac + public Vector3 offsetPosLeft = Vector3.one; + public Vector3 offsetPosRight = Vector3.one; + public Vector4 offsetRotLeft = Vector4.one; + public Vector4 offsetRotRight = Vector4.one; + public DegreeType degreeType = DegreeType.Eac360; + public float overlapFactor = 0; + + private Vector4 overlayLayerColorScaleDefault = Vector4.one; + private Vector4 overlayLayerColorOffsetDefault = Vector4.zero; + + // 360 + public float radius = 0; // >0 + + // ImageRect + public bool useImageRect = false; + public TextureRect textureRect = TextureRect.StereoScopic; + public DestinationRect destinationRect = DestinationRect.Default; + public Rect srcRectLeft = new Rect(0, 0, 1, 1); + public Rect srcRectRight = new Rect(0, 0, 1, 1); + public Rect dstRectLeft = new Rect(0, 0, 1, 1); + public Rect dstRectRight = new Rect(0, 0, 1, 1); + + public PxrRecti imageRectLeft; + public PxrRecti imageRectRight; + + + // LayerBlend + public bool useLayerBlend = false; + public PxrBlendFactor srcColor = PxrBlendFactor.One; + public PxrBlendFactor dstColor = PxrBlendFactor.One; + public PxrBlendFactor srcAlpha = PxrBlendFactor.One; + public PxrBlendFactor dstAlpha = PxrBlendFactor.One; + public float[] colorMatrix = new float[18] { + 1,0,0, // left + 0,1,0, + 0,0,1, + 1,0,0, // right + 0,1,0, + 0,0,1, + }; + + public bool isClones = false; + public bool isClonesToNew = false; + public CompositeLayerFeature originalOverLay; + + + public IntPtr layerSubmitPtr = IntPtr.Zero; + + private bool toCreateSwapChain = false; + private bool toCopyRT = false; + private bool copiedRT = false; + private int eyeCount = 2; + private UInt32 imageCounts = 0; + private PxrLayerParam overlayParam = new PxrLayerParam(); + private struct NativeTexture + { + public Texture[] textures; + }; + private NativeTexture[] nativeTextures; + private static Material cubeM; + private IntPtr leftPtr = IntPtr.Zero; + private IntPtr rightPtr = IntPtr.Zero; + + + public int CompareTo(CompositeLayerFeature other) + { + return layerDepth.CompareTo(other.layerDepth); + } + + protected void Awake() + { + xrRig = Camera.main; + Instances.Add(this); + if (null == xrRig.gameObject.GetComponent()) + { + xrRig.gameObject.AddComponent(); + } + overlayEyeCamera[0] = xrRig; + overlayEyeCamera[1] = xrRig; + + overlayTransform = GetComponent(); +#if UNITY_ANDROID && !UNITY_EDITOR + if (overlayTransform != null) + { + MeshRenderer render = overlayTransform.GetComponent(); + if (render != null) + { + render.enabled = false; + } + } +#endif + + if (!isClones) + { + InitializeBuffer(); + } + } + + private void Start() + { + if (isClones) + { + InitializeBuffer(); + } + + if (PICOManager.Instance == null) + { + PLog.e(TAG + " PICOManager.Instance is null!"); + return; + } + + Camera[] cam = PICOManager.Instance.GetEyeCamera(); + if (cam[0] != null && cam[0].enabled) + { + RefreshCamera(cam[0], cam[0]); + } + else if (cam[1] != null && cam[2] != null) + { + RefreshCamera(cam[1], cam[2]); + } + } + + public void RefreshCamera(Camera leftCamera, Camera rightCamera) + { + overlayEyeCamera[0] = leftCamera; + overlayEyeCamera[1] = rightCamera; + } + + private void InitializeBuffer() + { + if (null == layerTextures[0] && null == layerTextures[1]) + { + PLog.e(TAG + " The left and right images are all empty!"); + return; + } + else if (null == layerTextures[0] && null != layerTextures[1]) + { + layerTextures[0] = layerTextures[1]; + } + else if (null != layerTextures[0] && null == layerTextures[1]) + { + layerTextures[1] = layerTextures[0]; + } + + overlayID++; + overlayIndex = overlayID; + overlayParam.layerId = overlayIndex; + overlayParam.layerShape = overlayShape == 0 ? OverlayShape.Quad : overlayShape; + overlayParam.layerType = overlayType; + overlayParam.width = (uint)layerTextures[1].width; + overlayParam.height = (uint)layerTextures[1].height; + overlayParam.arraySize = 1; + overlayParam.mipmapCount = 1; + overlayParam.sampleCount = 1; + overlayParam.layerFlags = 0; + overlayParam.faceCount = 1; + if (OverlayShape.Cubemap == overlayShape) + { + overlayParam.faceCount = 6; + if (cubeM == null) + cubeM = new Material(Shader.Find("PXR_SDK/PXR_CubemapBlit")); + } + + if (GraphicsDeviceType.Vulkan == SystemInfo.graphicsDeviceType) + { + overlayParam.format = QualitySettings.activeColorSpace == ColorSpace.Linear ? (UInt64)ColorForamt.VK_FORMAT_R8G8B8A8_SRGB : (UInt64)RenderTextureFormat.Default; + } + else + { + overlayParam.format = QualitySettings.activeColorSpace == ColorSpace.Linear ? (UInt64)ColorForamt.GL_SRGB8_ALPHA8 : (UInt64)RenderTextureFormat.Default; + } + + if (isClones) + { + if (null != originalOverLay) + { + overlayParam.layerFlags |= (UInt32)PxrLayerCreateFlags.PxrLayerFlagSharedImagesBetweenLayers; + leftPtr = Marshal.AllocHGlobal(Marshal.SizeOf(originalOverLay.overlayIndex)); + rightPtr = Marshal.AllocHGlobal(Marshal.SizeOf(originalOverLay.overlayIndex)); + Marshal.WriteInt64(leftPtr, originalOverLay.overlayIndex); + Marshal.WriteInt64(rightPtr, originalOverLay.overlayIndex); + overlayParam.leftExternalImages = leftPtr; + overlayParam.rightExternalImages = rightPtr; + isDynamic = originalOverLay.isDynamic; + overlayParam.width = (UInt32)Mathf.Min(overlayParam.width, originalOverLay.overlayParam.width); + overlayParam.height = (UInt32)Mathf.Min(overlayParam.height, originalOverLay.overlayParam.height); + } + else + { + PLog.e(TAG + " In clone state, originalOverLay cannot be empty!"); + } + } + + if (!isDynamic) + { + overlayParam.layerFlags |= (UInt32)PxrLayerCreateFlags.PxrLayerFlagStaticImage; + } + + if (layerTextures[0] == layerTextures[1]) + { + eyeCount = 1; + overlayParam.layerLayout = LayerLayout.Mono; + } + else + { + eyeCount = 2; + overlayParam.layerLayout = LayerLayout.Stereo; + } + + OpenXRExtensions.CreateLayerParam(overlayParam); + toCreateSwapChain = true; + CreateTexture(); + } + + public void UpdateCoords() + { + if (null == overlayTransform || !overlayTransform.gameObject.activeSelf || null == overlayEyeCamera[0] || null == overlayEyeCamera[1]) + { + return; + } + + for (int i = 0; i < mvMatrixs.Length; i++) + { + mvMatrixs[i] = overlayEyeCamera[i].worldToCameraMatrix * overlayTransform.localToWorldMatrix; + if (overlayTransform is RectTransform uiTransform) + { + var rect = uiTransform.rect; + var lossyScale = overlayTransform.lossyScale; + modelScales[i] = new Vector3(rect.width * lossyScale.x, + rect.height * lossyScale.y, 1); + modelTranslations[i] = uiTransform.TransformPoint(rect.center); + } + else + { + modelScales[i] = overlayTransform.lossyScale; + modelTranslations[i] = overlayTransform.position; + } + modelRotations[i] = overlayTransform.rotation; + cameraRotations[i] = overlayEyeCamera[i].transform.rotation; + cameraTranslations[i] = overlayEyeCamera[i].transform.position; + } + } + + public bool CreateTexture() + { + if (!toCreateSwapChain) + { + return false; + } + + if (null == nativeTextures) + nativeTextures = new NativeTexture[eyeCount]; + + for (int i = 0; i < eyeCount; i++) + { + int ret = OpenXRExtensions.GetLayerImageCount(overlayIndex, (EyeType)i, ref imageCounts); + if (ret != 0 || imageCounts < 1) + { + PLog.e(TAG + $" ret={ret}, imageCounts={imageCounts}"); + return false; + } + + if (null == nativeTextures[i].textures) + { + nativeTextures[i].textures = new Texture[imageCounts]; + } + + for (int j = 0; j < imageCounts; j++) + { + IntPtr ptr = IntPtr.Zero; + OpenXRExtensions.GetLayerImagePtr(overlayIndex, (EyeType)i, j, ref ptr); + + if (IntPtr.Zero == ptr) + { + PLog.e(TAG + $" ptr is zero!"); + return false; + } + + Texture texture; + if (OverlayShape.Cubemap == overlayShape) + { + texture = Cubemap.CreateExternalTexture((int)overlayParam.width, TextureFormat.RGBA32, false, ptr); + } + else + { + texture = Texture2D.CreateExternalTexture((int)overlayParam.width, (int)overlayParam.height, TextureFormat.RGBA32, false, true, ptr); + } + + if (null == texture) + { + PLog.e(TAG + $" texture is null!"); + return false; + } + nativeTextures[i].textures[j] = texture; + PLog.i($"composition_layer 2. i={i}, j={j},imageCounts={imageCounts}, ptr={ptr}"); + } + PLog.i("composition_layer 3"); + } + + toCreateSwapChain = false; + toCopyRT = true; + copiedRT = false; + + FreePtr(); + + return true; + } + + public bool CopyRT() + { + if (isClones) + { + return true; + } + + if (!toCopyRT) + { + return copiedRT; + } + + if (!isDynamic && copiedRT) + { + return copiedRT; + } + + if (null == nativeTextures) + { + PLog.e(TAG + $" nativeTextures is null!"); + return false; + } + + OpenXRExtensions.GetLayerNextImageIndex(overlayIndex, ref imageIndex); + + for (int i = 0; i < eyeCount; i++) + { + Texture nativeTexture = nativeTextures[i].textures[imageIndex]; + + if (null == nativeTexture || null == layerTextures[i]) + continue; + + RenderTexture texture = layerTextures[i] as RenderTexture; + + if (OverlayShape.Cubemap == overlayShape && null == layerTextures[i] as Cubemap) + { + PLog.e(TAG + $" Cubemap. The type of layerTextures is not a Cubemap!"); + return false; + } + + bool enable = QualitySettings.activeColorSpace == ColorSpace.Gamma && texture != null && texture.format == RenderTextureFormat.ARGB32; + + for (int f = 0; f < (int)overlayParam.faceCount; f++) + { + if (enable) + { + PLog.d(TAG + $" gamma CopyTexture. f={f}"); + Graphics.CopyTexture(layerTextures[i], f, 0, nativeTexture, f, 0); + } + else + { + RenderTextureDescriptor rtDes = new RenderTextureDescriptor((int)overlayParam.width, (int)overlayParam.height, RenderTextureFormat.ARGB32, 0); + rtDes.msaaSamples = (int)overlayParam.sampleCount; + rtDes.useMipMap = true; + rtDes.autoGenerateMips = false; + rtDes.sRGB = true; + + RenderTexture renderTexture = RenderTexture.GetTemporary(rtDes); + + if (!renderTexture.IsCreated()) + { + renderTexture.Create(); + } + renderTexture.DiscardContents(); + + if (OverlayShape.Cubemap == overlayShape) + { + cubeM.SetInt("_d", f); + Graphics.Blit(layerTextures[i], renderTexture, cubeM); + } + else + { + Graphics.Blit(layerTextures[i], renderTexture); + } + PLog.d(TAG + $" linear CopyTexture. f={f}"); + Graphics.CopyTexture(renderTexture, 0, 0, nativeTexture, f, 0); + RenderTexture.ReleaseTemporary(renderTexture); + } + } + copiedRT = true; + } + + return copiedRT; + } + + public void SetTexture(Texture texture, bool dynamic) + { + if (isClones) + { + return; + } + else + { + foreach (CompositeLayerFeature overlay in CompositeLayerFeature.Instances) + { + if (overlay.isClones && null != overlay.originalOverLay && overlay.originalOverLay.overlayIndex == overlayIndex) + { + overlay.DestroyLayer(); + overlay.isClonesToNew = true; + } + } + } + + toCopyRT = false; + OpenXRExtensions.DestroyLayerByRender(overlayIndex); + ClearTexture(); + for (int i = 0; i < layerTextures.Length; i++) + { + layerTextures[i] = texture; + } + + isDynamic = dynamic; + InitializeBuffer(); + + if (!isClones) + { + foreach (CompositeLayerFeature overlay in CompositeLayerFeature.Instances) + { + if (overlay.isClones && overlay.isClonesToNew) + { + overlay.originalOverLay = this; + overlay.InitializeBuffer(); + overlay.isClonesToNew = false; + } + } + } + } + + private void FreePtr() + { + if (leftPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(leftPtr); + leftPtr = IntPtr.Zero; + } + + if (rightPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(rightPtr); + rightPtr = IntPtr.Zero; + } + + if (layerSubmitPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(layerSubmitPtr); + layerSubmitPtr = IntPtr.Zero; + } + } + + public void OnDestroy() + { + DestroyLayer(); + Instances.Remove(this); + } + + public void DestroyLayer() + { + if (!isClones) + { + List toDestroyClones = new List(); + foreach (CompositeLayerFeature overlay in Instances) + { + if (overlay.isClones && null != overlay.originalOverLay && overlay.originalOverLay.overlayIndex == overlayIndex) + { + toDestroyClones.Add(overlay); + } + } + + foreach (CompositeLayerFeature overLay in toDestroyClones) + { + OpenXRExtensions.DestroyLayerByRender(overLay.overlayIndex); + ClearTexture(); + } + } + + OpenXRExtensions.DestroyLayerByRender(overlayIndex); + ClearTexture(); + } + + private void ClearTexture() + { + FreePtr(); + + if (null == nativeTextures || isClones) + { + return; + } + + for (int i = 0; i < eyeCount; i++) + { + if (null == nativeTextures[i].textures) + { + continue; + } + + for (int j = 0; j < imageCounts; j++) + DestroyImmediate(nativeTextures[i].textures[j]); + } + + nativeTextures = null; + } + + public void SetLayerColorScaleAndOffset(Vector4 scale, Vector4 offset) + { + colorScale = scale; + colorOffset = offset; + } + + public void SetEACOffsetPosAndRot(Vector3 leftPos, Vector3 rightPos, Vector4 leftRot, Vector4 rightRot, float factor) + { + offsetPosLeft = leftPos; + offsetPosRight = rightPos; + offsetRotLeft = leftRot; + offsetRotRight = rightRot; + overlapFactor = factor; + } + + public Vector4 GetLayerColorScale() + { + if (!overrideColorScaleAndOffset) + { + return overlayLayerColorScaleDefault; + } + return colorScale; + } + + public Vector4 GetLayerColorOffset() + { + if (!overrideColorScaleAndOffset) + { + return overlayLayerColorOffsetDefault; + } + return colorOffset; + } + + public PxrRecti getPxrRectiLeft(bool left) + { + if (left) + { + imageRectLeft.x = (int)(overlayParam.width * srcRectLeft.x); + imageRectLeft.y = (int)(overlayParam.height * srcRectLeft.y); + imageRectLeft.width = (int)(overlayParam.width * Mathf.Min(srcRectLeft.width, 1 - srcRectLeft.x)); + imageRectLeft.height = (int)(overlayParam.height * Mathf.Min(srcRectLeft.height, 1 - srcRectLeft.y)); + // Debug.LogFormat("imageRectLeft width={0}, height={1}, x={2}, y={3}",imageRectLeft.width,imageRectLeft.height,imageRectLeft.x,imageRectLeft.y); + return imageRectLeft; + } + else + { + imageRectRight.x = (int)(overlayParam.width * srcRectRight.x); + imageRectRight.y = (int)(overlayParam.height * srcRectRight.y); + imageRectRight.width = (int)(overlayParam.width * Mathf.Min(srcRectRight.width, 1 - srcRectRight.x)); + imageRectRight.height = (int)(overlayParam.height * Mathf.Min(srcRectRight.height, 1 - srcRectRight.y)); + // Debug.LogFormat("imageRectRight width={0}, height={1}, x={2}, y={3}",imageRectRight.width,imageRectRight.height,imageRectRight.x,imageRectRight.y); + return imageRectRight; + } + } + + public enum OverlayShape + { + Quad = 1, + Cylinder = 2, + Equirect = 4, + Cubemap = 5, + } + + public enum OverlayType + { + Overlay = 0, + Underlay = 1 + } + + public enum TextureType + { + DynamicTexture, + StaticTexture + } + + public enum LayerLayout + { + Stereo = 0, + DoubleWide = 1, + Array = 2, + Mono = 3 + } + + public enum Surface3DType + { + Single = 0, + LeftRight, + TopBottom + } + + public enum TextureRect + { + MonoScopic, + StereoScopic, + Custom + } + + public enum DestinationRect + { + Default, + Custom + } + + public enum DegreeType + { + Eac360 = 0, + Eac180 = 4, + } + + public enum ColorForamt + { + VK_FORMAT_R8G8B8A8_UNORM = 37, + VK_FORMAT_R8G8B8A8_SRGB = 43, + GL_SRGB8_ALPHA8 = 0x8c43, + GL_RGBA8 = 0x8058 + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerFeature.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerFeature.cs.meta new file mode 100644 index 0000000..7a9c089 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerFeature.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03ca3817c49e82b499325fde5c9e66ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerManager.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerManager.cs new file mode 100644 index 0000000..2e0962f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerManager.cs @@ -0,0 +1,338 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Runtime.InteropServices; +using UnityEngine; +using UnityEngine.Rendering; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public class CompositeLayerManager : MonoBehaviour + { + private void OnEnable() + { +#if UNITY_2019_1_OR_NEWER + if (GraphicsSettings.renderPipelineAsset != null) + { + RenderPipelineManager.beginFrameRendering += BeginRendering; + RenderPipelineManager.endFrameRendering += EndRendering; + } + else + { + Camera.onPreRender += OnPreRenderCallBack; + Camera.onPostRender += OnPostRenderCallBack; + } +#endif + } + + private void OnDisable() + { +#if UNITY_2019_1_OR_NEWER + if (GraphicsSettings.renderPipelineAsset != null) + { + RenderPipelineManager.beginFrameRendering -= BeginRendering; + RenderPipelineManager.endFrameRendering -= EndRendering; + } + else + { + Camera.onPreRender -= OnPreRenderCallBack; + Camera.onPostRender -= OnPostRenderCallBack; + } +#endif + } + + private void Start() + { + + } + + private void BeginRendering(ScriptableRenderContext arg1, Camera[] arg2) + { + foreach (Camera cam in arg2) + { + OnPreRenderCallBack(cam); + } + } + + private void EndRendering(ScriptableRenderContext arg1, Camera[] arg2) + { + foreach (Camera cam in arg2) + { + OnPostRenderCallBack(cam); + } + } + + private void OnPreRenderCallBack(Camera cam) + { + // There is only one XR main camera in the scene. + if (null == Camera.main) return; + if (cam == null || cam != Camera.main || cam.stereoActiveEye == Camera.MonoOrStereoscopicEye.Right) return; + + //CompositeLayers + if (null == CompositeLayerFeature.Instances) return; + if (CompositeLayerFeature.Instances.Count > 0) + { + foreach (var overlay in CompositeLayerFeature.Instances) + { + if (!overlay.isActiveAndEnabled) continue; + if (null == overlay.layerTextures) continue; + if (!overlay.isClones && overlay.layerTextures[0] == null && overlay.layerTextures[1] == null) continue; + if (overlay.overlayTransform != null && !overlay.overlayTransform.gameObject.activeSelf) continue; + overlay.CreateTexture(); + } + } + } + + private void OnPostRenderCallBack(Camera cam) + { + // There is only one XR main camera in the scene. + if (null == Camera.main) return; + if (cam == null || cam != Camera.main || cam.stereoActiveEye == Camera.MonoOrStereoscopicEye.Right) return; + + if (null == CompositeLayerFeature.Instances) return; + if (CompositeLayerFeature.Instances.Count > 0) + { + CompositeLayerFeature.Instances.Sort(); + foreach (var compositeLayer in CompositeLayerFeature.Instances) + { + if (null == compositeLayer) continue; + compositeLayer.UpdateCoords(); + if (!compositeLayer.isActiveAndEnabled) continue; + if (null == compositeLayer.layerTextures) continue; + if (!compositeLayer.isClones && compositeLayer.layerTextures[0] == null && compositeLayer.layerTextures[1] == null) continue; + if (compositeLayer.overlayTransform != null && null == compositeLayer.overlayTransform.gameObject) continue; + if (compositeLayer.overlayTransform != null && !compositeLayer.overlayTransform.gameObject.activeSelf) continue; + + Vector4 colorScale = compositeLayer.GetLayerColorScale(); + Vector4 colorBias = compositeLayer.GetLayerColorOffset(); + bool isHeadLocked = compositeLayer.overlayTransform != null && compositeLayer.overlayTransform.parent == transform; + + if (!compositeLayer.CopyRT()) continue; + if (null == compositeLayer.cameraRotations || null == compositeLayer.modelScales || null == compositeLayer.modelTranslations) continue; + + PxrLayerHeader2 header = new PxrLayerHeader2(); + PxrPosef poseLeft = new PxrPosef(); + PxrPosef poseRight = new PxrPosef(); + + header.layerId = compositeLayer.overlayIndex; + header.colorScaleX = colorScale.x; + header.colorScaleY = colorScale.y; + header.colorScaleZ = colorScale.z; + header.colorScaleW = colorScale.w; + header.colorBiasX = colorBias.x; + header.colorBiasY = colorBias.y; + header.colorBiasZ = colorBias.z; + header.colorBiasW = colorBias.w; + header.compositionDepth = compositeLayer.layerDepth; + header.headPose.orientation.x = compositeLayer.cameraRotations[0].x; + header.headPose.orientation.y = compositeLayer.cameraRotations[0].y; + header.headPose.orientation.z = -compositeLayer.cameraRotations[0].z; + header.headPose.orientation.w = -compositeLayer.cameraRotations[0].w; + header.headPose.position.x = (compositeLayer.cameraTranslations[0].x + compositeLayer.cameraTranslations[1].x) / 2; + header.headPose.position.y = (compositeLayer.cameraTranslations[0].y + compositeLayer.cameraTranslations[1].y) / 2; + header.headPose.position.z = -(compositeLayer.cameraTranslations[0].z + compositeLayer.cameraTranslations[1].z) / 2; + header.layerShape = compositeLayer.overlayShape; + header.useLayerBlend = (UInt32)(compositeLayer.useLayerBlend ? 1 : 0); + header.layerBlend.srcColor = compositeLayer.srcColor; + header.layerBlend.dstColor = compositeLayer.dstColor; + header.layerBlend.srcAlpha = compositeLayer.srcAlpha; + header.layerBlend.dstAlpha = compositeLayer.dstAlpha; + header.useImageRect = (UInt32)(compositeLayer.useImageRect ? 1 : 0); + header.imageRectLeft = compositeLayer.getPxrRectiLeft(true); + header.imageRectRight = compositeLayer.getPxrRectiLeft(false); + + if (isHeadLocked) + { + poseLeft.orientation.x = compositeLayer.overlayTransform.localRotation.x; + poseLeft.orientation.y = compositeLayer.overlayTransform.localRotation.y; + poseLeft.orientation.z = -compositeLayer.overlayTransform.localRotation.z; + poseLeft.orientation.w = -compositeLayer.overlayTransform.localRotation.w; + poseLeft.position.x = compositeLayer.overlayTransform.localPosition.x; + poseLeft.position.y = compositeLayer.overlayTransform.localPosition.y; + poseLeft.position.z = -compositeLayer.overlayTransform.localPosition.z; + + poseRight.orientation.x = compositeLayer.overlayTransform.localRotation.x; + poseRight.orientation.y = compositeLayer.overlayTransform.localRotation.y; + poseRight.orientation.z = -compositeLayer.overlayTransform.localRotation.z; + poseRight.orientation.w = -compositeLayer.overlayTransform.localRotation.w; + poseRight.position.x = compositeLayer.overlayTransform.localPosition.x; + poseRight.position.y = compositeLayer.overlayTransform.localPosition.y; + poseRight.position.z = -compositeLayer.overlayTransform.localPosition.z; + + header.layerFlags = (UInt32)( + PxrLayerSubmitFlags.PxrLayerFlagLayerPoseNotInTrackingSpace | + PxrLayerSubmitFlags.PxrLayerFlagHeadLocked); + } + else + { + Quaternion quaternion = new Quaternion(compositeLayer.modelRotations[0].x, + compositeLayer.modelRotations[0].y, compositeLayer.modelRotations[0].z, + compositeLayer.modelRotations[0].w); + + Vector3 cameraPos = Vector3.zero; + Quaternion cameraRot = Quaternion.identity; + Transform origin = null; + bool ret = PICOManager.Instance.GetOrigin(ref cameraPos, ref cameraRot, ref origin); + if (!ret) + { + PLog.e(" GetOrigin ret false!"); + return; + } + + Quaternion lQuaternion = new Quaternion(-cameraRot.x, -cameraRot.y, -cameraRot.z, cameraRot.w); + Vector3 pos = new Vector3(compositeLayer.modelTranslations[0].x - cameraPos.x, + compositeLayer.modelTranslations[0].y - PICOManager.Instance.getCameraYOffset() + + PICOManager.Instance.GetOriginY() - cameraPos.y, compositeLayer.modelTranslations[0].z - cameraPos.z); + + quaternion *= lQuaternion; + origin.rotation *= lQuaternion; + pos = origin.TransformPoint(pos); + + // Quaternion.l + poseLeft.position.x = pos.x; + poseLeft.position.y = pos.y; + poseLeft.position.z = -pos.z; + poseLeft.orientation.x = -quaternion.x; + poseLeft.orientation.y = -quaternion.y; + poseLeft.orientation.z = quaternion.z; + poseLeft.orientation.w = quaternion.w; + + poseRight.position.x = pos.x; + poseRight.position.y = pos.y; + poseRight.position.z = -pos.z; + poseRight.orientation.x = -quaternion.x; + poseRight.orientation.y = -quaternion.y; + poseRight.orientation.z = quaternion.z; + poseRight.orientation.w = quaternion.w; + + header.layerFlags = (UInt32)( + PxrLayerSubmitFlags.PxrLayerFlagUseExternalHeadPose | + PxrLayerSubmitFlags.PxrLayerFlagLayerPoseNotInTrackingSpace); + } + + if (compositeLayer.overlayShape == CompositeLayerFeature.OverlayShape.Quad) + { + PxrLayerQuad layerSubmit2 = new PxrLayerQuad(); + layerSubmit2.header = header; + layerSubmit2.poseLeft = poseLeft; + layerSubmit2.poseRight = poseRight; + layerSubmit2.sizeLeft.x = compositeLayer.modelScales[0].x; + layerSubmit2.sizeLeft.y = compositeLayer.modelScales[0].y; + layerSubmit2.sizeRight.x = compositeLayer.modelScales[0].x; + layerSubmit2.sizeRight.y = compositeLayer.modelScales[0].y; + + if (compositeLayer.useImageRect) + { + layerSubmit2.poseLeft.position.x += compositeLayer.modelScales[0].x * (-0.5f + compositeLayer.dstRectLeft.x + 0.5f * Mathf.Min(compositeLayer.dstRectLeft.width, 1 - compositeLayer.dstRectLeft.x)); + layerSubmit2.poseLeft.position.y += compositeLayer.modelScales[0].y * (-0.5f + compositeLayer.dstRectLeft.y + 0.5f * Mathf.Min(compositeLayer.dstRectLeft.height, 1 - compositeLayer.dstRectLeft.y)); + layerSubmit2.poseRight.position.x += compositeLayer.modelScales[0].x * (-0.5f + compositeLayer.dstRectRight.x + 0.5f * Mathf.Min(compositeLayer.dstRectRight.width, 1 - compositeLayer.dstRectRight.x)); + layerSubmit2.poseRight.position.y += compositeLayer.modelScales[0].y * (-0.5f + compositeLayer.dstRectRight.y + 0.5f * Mathf.Min(compositeLayer.dstRectRight.height, 1 - compositeLayer.dstRectRight.y)); + + layerSubmit2.sizeLeft.x = compositeLayer.modelScales[0].x * Mathf.Min(compositeLayer.dstRectLeft.width, 1 - compositeLayer.dstRectLeft.x); + layerSubmit2.sizeLeft.y = compositeLayer.modelScales[0].y * Mathf.Min(compositeLayer.dstRectLeft.height, 1 - compositeLayer.dstRectLeft.y); + layerSubmit2.sizeRight.x = compositeLayer.modelScales[0].x * Mathf.Min(compositeLayer.dstRectRight.width, 1 - compositeLayer.dstRectRight.x); + layerSubmit2.sizeRight.y = compositeLayer.modelScales[0].y * Mathf.Min(compositeLayer.dstRectRight.height, 1 - compositeLayer.dstRectRight.y); + } + if (compositeLayer.layerSubmitPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(compositeLayer.layerSubmitPtr); + compositeLayer.layerSubmitPtr = IntPtr.Zero; + } + + compositeLayer.layerSubmitPtr = Marshal.AllocHGlobal(Marshal.SizeOf(layerSubmit2)); + Marshal.StructureToPtr(layerSubmit2, compositeLayer.layerSubmitPtr, false); + + OpenXRExtensions.SubmitLayerQuad(compositeLayer.layerSubmitPtr); + } + else if (compositeLayer.overlayShape == CompositeLayerFeature.OverlayShape.Cylinder) + { + PxrLayerCylinder layerSubmit2 = new PxrLayerCylinder(); + layerSubmit2.header = header; + layerSubmit2.poseLeft = poseLeft; + layerSubmit2.poseRight = poseRight; + + if (compositeLayer.modelScales[0].z != 0) + { + layerSubmit2.centralAngleLeft = compositeLayer.modelScales[0].x / compositeLayer.modelScales[0].z; + layerSubmit2.centralAngleRight = compositeLayer.modelScales[0].x / compositeLayer.modelScales[0].z; + } + else + { + PLog.e("Cylinder modelScales scale.z is 0!"); + } + layerSubmit2.heightLeft = compositeLayer.modelScales[0].y; + layerSubmit2.heightRight = compositeLayer.modelScales[0].y; + layerSubmit2.radiusLeft = compositeLayer.modelScales[0].z; + layerSubmit2.radiusRight = compositeLayer.modelScales[0].z; + + if (compositeLayer.layerSubmitPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(compositeLayer.layerSubmitPtr); + compositeLayer.layerSubmitPtr = IntPtr.Zero; + } + + compositeLayer.layerSubmitPtr = Marshal.AllocHGlobal(Marshal.SizeOf(layerSubmit2)); + Marshal.StructureToPtr(layerSubmit2, compositeLayer.layerSubmitPtr, false); + + OpenXRExtensions.SubmitLayerCylinder(compositeLayer.layerSubmitPtr); + } + else if (compositeLayer.overlayShape == CompositeLayerFeature.OverlayShape.Equirect) + { + PxrLayerEquirect layerSubmit2 = new PxrLayerEquirect(); + layerSubmit2.header = header; + layerSubmit2.poseLeft = poseLeft; + layerSubmit2.poseRight = poseRight; + + layerSubmit2.radiusLeft = compositeLayer.radius; + layerSubmit2.radiusRight = compositeLayer.radius; + layerSubmit2.centralHorizontalAngleLeft = compositeLayer.dstRectLeft.width * 2 * Mathf.PI; + layerSubmit2.centralHorizontalAngleRight = compositeLayer.dstRectRight.width * 2 * Mathf.PI; + layerSubmit2.upperVerticalAngleLeft = (compositeLayer.dstRectLeft.height + compositeLayer.dstRectLeft.y - 0.5f) * Mathf.PI; + layerSubmit2.upperVerticalAngleRight = (compositeLayer.dstRectRight.height + compositeLayer.dstRectRight.y - 0.5f) * Mathf.PI; + layerSubmit2.lowerVerticalAngleLeft = (compositeLayer.dstRectLeft.y - 0.5f) * Mathf.PI; + layerSubmit2.lowerVerticalAngleRight = (compositeLayer.dstRectRight.y - 0.5f) * Mathf.PI; + + if (compositeLayer.layerSubmitPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(compositeLayer.layerSubmitPtr); + compositeLayer.layerSubmitPtr = IntPtr.Zero; + } + + compositeLayer.layerSubmitPtr = Marshal.AllocHGlobal(Marshal.SizeOf(layerSubmit2)); + Marshal.StructureToPtr(layerSubmit2, compositeLayer.layerSubmitPtr, false); + + OpenXRExtensions.SubmitLayerEquirect(compositeLayer.layerSubmitPtr); + } + else if (compositeLayer.overlayShape == CompositeLayerFeature.OverlayShape.Cubemap) + { + PxrLayerCube layerSubmit2 = new PxrLayerCube(); + layerSubmit2.header = header; + layerSubmit2.poseLeft = poseLeft; + layerSubmit2.poseRight = poseRight; + + if (compositeLayer.layerSubmitPtr != IntPtr.Zero) + { + Marshal.FreeHGlobal(compositeLayer.layerSubmitPtr); + compositeLayer.layerSubmitPtr = IntPtr.Zero; + } + + compositeLayer.layerSubmitPtr = Marshal.AllocHGlobal(Marshal.SizeOf(layerSubmit2)); + Marshal.StructureToPtr(layerSubmit2, compositeLayer.layerSubmitPtr, false); + + OpenXRExtensions.SubmitLayerCube(compositeLayer.layerSubmitPtr); + } + } + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerManager.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerManager.cs.meta new file mode 100644 index 0000000..5703906 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/CompositeLayerManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9164f0a21d04d4544bc6682b3b94ddea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/DisplayRefreshRateFeature.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/DisplayRefreshRateFeature.cs new file mode 100644 index 0000000..c6af7ca --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/DisplayRefreshRateFeature.cs @@ -0,0 +1,175 @@ +using System; +using System.Runtime.InteropServices; +using Unity.Collections; +using Unity.Collections.LowLevel.Unsafe; +using UnityEngine; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; + +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public enum SystemDisplayFrequency + { + Default, + RefreshRate72=72, + RefreshRate90=90, + RefreshRate120=120, + } +#if UNITY_EDITOR + [OpenXRFeature(UiName = "OpenXR Display Refresh Rate", + Hidden = false, + BuildTargetGroups = new[] { UnityEditor.BuildTargetGroup.Android }, + Company = "PICO", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + FeatureId = featureId)] +#endif + public class DisplayRefreshRateFeature : OpenXRFeatureBase + { + public const string featureId = "com.pico.openxr.feature.refreshrate"; + public const string extensionString = "XR_FB_display_refresh_rate"; + public static bool isExtensionEnable =false; + public override void Initialize(IntPtr intPtr) + { + isExtensionEnable=_isExtensionEnable; + initialize(intPtr, xrInstance); + } + public override string GetExtensionString() + { + return extensionString; + } + + public override void SessionCreate() + { + PICOProjectSetting projectConfig = PICOProjectSetting.GetProjectConfig(); + if (projectConfig.displayFrequency != SystemDisplayFrequency.Default) + { + float displayRefreshRate = 0; + GetDisplayRefreshRate(ref displayRefreshRate); + PLog.i($"GetDisplayRefreshRate:{displayRefreshRate}"); + SetDisplayRefreshRate(projectConfig.displayFrequency); + } + } + public static bool SetDisplayRefreshRate(SystemDisplayFrequency DisplayFrequency) + { + if (!isExtensionEnable) + { + return false; + } + + + PLog.i($"SetDisplayRefreshRate:{DisplayFrequency}"); + float rate = 0; + switch (DisplayFrequency) + { + case SystemDisplayFrequency.Default: + return true; + case SystemDisplayFrequency.RefreshRate72: + rate = 72; + break; + case SystemDisplayFrequency.RefreshRate90: + rate = 90; + break; + case SystemDisplayFrequency.RefreshRate120: + rate = 120; + break; + } + + return SetDisplayRefreshRate(rate); + } + + public static bool GetDisplayRefreshRate(ref float displayRefreshRate) + { + if (!isExtensionEnable) + { + return false; + } + return xrGetDisplayRefreshRateFB( + xrSession, ref displayRefreshRate); + } + + private static bool SetDisplayRefreshRate(float displayRefreshRate) + { + if (!isExtensionEnable) + { + return false; + } + return xrRequestDisplayRefreshRateFB( + xrSession, displayRefreshRate); + } + + private static bool EnumerateDisplayRefreshRates(uint displayRefreshRateCapacityInput, + ref uint displayRefreshRateCountOutput, ref float displayRefreshRates) + { + if (!isExtensionEnable) + { + return false; + } + return xrEnumerateDisplayRefreshRatesFB( + xrSession, displayRefreshRateCapacityInput, ref displayRefreshRateCountOutput, ref displayRefreshRates); + } + + public static int GetDisplayRefreshRateCount() + { + if (!isExtensionEnable) + { + return 0; + } + return xrGetDisplayRefreshRateCount(xrSession); + } + + public static bool TryGetSupportedDisplayRefreshRates( + Allocator allocator, out NativeArray refreshRates) + { + refreshRates = default; + + if (!isExtensionEnable) + { + return false; + } + + var numDisplayRefreshRates = xrGetDisplayRefreshRateCount(xrSession); + if (numDisplayRefreshRates == 0) + { + Debug.LogError($"{nameof(TryGetSupportedDisplayRefreshRates)} failed due to an unknown error."); + return false; + } + + unsafe + { + refreshRates = new NativeArray(numDisplayRefreshRates, allocator); + if (!refreshRates.IsCreated) + return false; + + return TryGetDisplayRefreshRates(xrSession, + NativeArrayUnsafeUtility.GetUnsafeBufferPointerWithoutChecks(refreshRates), + (uint)numDisplayRefreshRates); + } + } + + private const string ExtLib = "openxr_pico"; + + [DllImport(ExtLib, EntryPoint = "PICO_initialize_DisplayRefreshRates", CallingConvention = CallingConvention.Cdecl)] + private static extern void initialize(IntPtr xrGetInstanceProcAddr, ulong xrInstance); + + [DllImport(ExtLib, EntryPoint = "PICO_xrEnumerateDisplayRefreshRatesFB", CallingConvention = CallingConvention.Cdecl)] + private static extern bool xrEnumerateDisplayRefreshRatesFB(ulong xrSession, + uint displayRefreshRateCapacityInput, ref uint displayRefreshRateCountOutput, + ref float displayRefreshRates); + + [DllImport(ExtLib, EntryPoint = "PICO_xrGetDisplayRefreshRateFB", CallingConvention = CallingConvention.Cdecl)] + private static extern bool xrGetDisplayRefreshRateFB(ulong xrSession, ref float displayRefreshRate); + + [DllImport(ExtLib, EntryPoint = "PICO_xrRequestDisplayRefreshRateFB", CallingConvention = CallingConvention.Cdecl)] + private static extern bool xrRequestDisplayRefreshRateFB(ulong xrSession, float displayRefreshRate); + [DllImport(ExtLib, EntryPoint = "PICO_xrGetDisplayRefreshRateCount", CallingConvention = CallingConvention.Cdecl)] + public static extern int xrGetDisplayRefreshRateCount(ulong xrSession); + + [DllImport(ExtLib, EntryPoint = "PICO_xrTryGetDisplayRefreshRates", CallingConvention = CallingConvention.Cdecl)] + public static extern unsafe bool TryGetDisplayRefreshRates(ulong xrSession,void* refreshRates, uint capacity); + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/DisplayRefreshRateFeature.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/DisplayRefreshRateFeature.cs.meta new file mode 100644 index 0000000..ff1554b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/DisplayRefreshRateFeature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 233eef4f97ef4b0b8b65c5030c0b05f7 +timeCreated: 1685686551 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/FoveationFeature.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/FoveationFeature.cs new file mode 100644 index 0000000..89e2541 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/FoveationFeature.cs @@ -0,0 +1,159 @@ +using UnityEditor; +using UnityEngine.XR.OpenXR.Features; +using System.Runtime.InteropServices; +using System; +using Unity.XR.OpenXR.Features.PICOSupport; +using UnityEngine; + +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; + +[OpenXRFeature(UiName = "OpenXR Foveation", + BuildTargetGroups = new[] { BuildTargetGroup.Android }, + OpenxrExtensionStrings = extensionList, + Company = "PICO", + Version = "1.0.0", + FeatureId = featureId)] +#endif + + +public class FoveationFeature : OpenXRFeatureBase +{ + public const string extensionList = "XR_FB_foveation " + + "XR_FB_foveation_configuration " + + "XR_FB_foveation_vulkan " + + "XR_META_foveation_eye_tracked " + + "XR_META_vulkan_swapchain_create_info " + + "XR_FB_swapchain_update_state "; + + public const string featureId = "com.pico.openxr.feature.foveation"; + + public enum FoveatedRenderingLevel + { + Off = 0, + Low = 1, + Medium = 2, + High = 3 + } + public enum FoveatedRenderingMode + { + FixedFoveatedRendering = 0, + EyeTrackedFoveatedRendering = 1 + } + private static string TAG = "FoveationFeature"; + + private static UInt32 _foveatedRenderingLevel = 0; + private static UInt32 _useDynamicFoveation = 0; + public static bool isExtensionEnable =false; + + public override string GetExtensionString() + { + return extensionList; + } + public override void Initialize(IntPtr intPtr) + { + isExtensionEnable=_isExtensionEnable; + } + public override void SessionCreate() + { + if (!isExtensionEnable) + { + return ; + } + PICOProjectSetting projectConfig = PICOProjectSetting.GetProjectConfig(); + if (projectConfig.foveationEnable) + { + setFoveationEyeTracked(projectConfig.foveatedRenderingMode == + FoveatedRenderingMode.EyeTrackedFoveatedRendering); + foveatedRenderingLevel = projectConfig.foveatedRenderingLevel; + setSubsampledEnabled(projectConfig.isSubsampledEnabled); + } + } + public static FoveatedRenderingLevel foveatedRenderingLevel + { + get + { + if (!isExtensionEnable) + { + return FoveatedRenderingLevel.Off; + } + UInt32 level; + FBGetFoveationLevel(out level); + PLog.i($" foveatedRenderingLevel get if level= {level}"); + return (FoveatedRenderingLevel)level; + } + set + { + if (!isExtensionEnable) + { + return; + } + PLog.i($" foveatedRenderingLevel set if value= {value}"); + _foveatedRenderingLevel = (UInt32)value; + FBSetFoveationLevel(xrSession, _foveatedRenderingLevel, 0.0f, _useDynamicFoveation); + } + } + + public static bool useDynamicFoveatedRendering + { + get + { + if (!isExtensionEnable) + { + return false; + } + UInt32 dynamic; + FBGetFoveationLevel(out dynamic); + return dynamic != 0; + } + set + { + if (!isExtensionEnable) + { + return ; + } + if (value) + _useDynamicFoveation = 1; + else + _useDynamicFoveation = 0; + FBSetFoveationLevel(xrSession, _foveatedRenderingLevel, 0.0f, _useDynamicFoveation); + } + } + + public static bool supportsFoveationEyeTracked + { + get + { + if (!isExtensionEnable) + { + return false; + } + return isSupportsFoveationEyeTracked(xrInstance); + } + } + + + + #region OpenXR Plugin DLL Imports + + [DllImport("UnityOpenXR", EntryPoint = "FBSetFoveationLevel")] + private static extern void FBSetFoveationLevel(UInt64 session, UInt32 level, float verticalOffset, UInt32 dynamic); + + [DllImport("UnityOpenXR", EntryPoint = "FBGetFoveationLevel")] + private static extern void FBGetFoveationLevel(out UInt32 level); + + [DllImport("UnityOpenXR", EntryPoint = "FBGetFoveationDynamic")] + private static extern void FBGetFoveationDynamic(out UInt32 dynamic); + + #endregion + + const string extLib = "openxr_pico"; + + [DllImport(extLib, EntryPoint = "PICO_isSupportsFoveationEyeTracked", CallingConvention = CallingConvention.Cdecl)] + private static extern bool isSupportsFoveationEyeTracked(ulong xrInstance); + + [DllImport(extLib, EntryPoint = "PICO_setFoveationEyeTracked", CallingConvention = CallingConvention.Cdecl)] + private static extern void setFoveationEyeTracked(bool value); + [DllImport(extLib, EntryPoint = "PICO_setSubsampledEnabled", CallingConvention = CallingConvention.Cdecl)] + private static extern void setSubsampledEnabled(bool value); +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/FoveationFeature.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/FoveationFeature.cs.meta new file mode 100644 index 0000000..ffce509 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/FoveationFeature.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5f636716e11d15b4bbafb76eb9d63555 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/LayerSecureContentFeature.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/LayerSecureContentFeature.cs new file mode 100644 index 0000000..18aa490 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/LayerSecureContentFeature.cs @@ -0,0 +1,62 @@ +using System; +using System.Runtime.InteropServices; +using UnityEngine; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; + +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ +#if UNITY_EDITOR + [OpenXRFeature(UiName = "OpenXR Composition Layer Secure Content", + Hidden = false, + BuildTargetGroups = new[] { UnityEditor.BuildTargetGroup.Android }, + Company = "PICO", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + FeatureId = featureId)] +#endif + public class LayerSecureContentFeature : OpenXRFeatureBase + { + public const string featureId = "com.pico.openxr.feature.LayerSecureContent"; + public const string extensionString = "XR_FB_composition_layer_secure_content"; + + public static bool isExtensionEnable =false; + public override string GetExtensionString() + { + return extensionString; + } + + public override void Initialize(IntPtr intPtr) + { + isExtensionEnable=_isExtensionEnable; + } + public override void SessionCreate() + { + PICOProjectSetting projectConfig = PICOProjectSetting.GetProjectConfig(); + if (projectConfig.useContentProtect) + { + SetSecureContentFlag(projectConfig.contentProtectFlags); + } + } + + + public static void SetSecureContentFlag(SecureContentFlag flag) + { + if (!isExtensionEnable) + { + return; + } + + setSecureContentFlag((int)flag); + } + + const string extLib = "openxr_pico"; + + [DllImport(extLib, EntryPoint = "PICO_setSecureContentFlag", CallingConvention = CallingConvention.Cdecl)] + private static extern void setSecureContentFlag(Int32 flag); + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/LayerSecureContentFeature.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/LayerSecureContentFeature.cs.meta new file mode 100644 index 0000000..5802fec --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/LayerSecureContentFeature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 105a2b5276c1435d8411162e42e5064e +timeCreated: 1687177588 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality.meta new file mode 100644 index 0000000..ced1bdb --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 11da15b829408094e9a647e4b3d566c7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/MR_Plugin.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/MR_Plugin.cs new file mode 100644 index 0000000..92b2e81 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/MR_Plugin.cs @@ -0,0 +1,927 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using Unity.Collections; +using Unity.Collections.LowLevel.Unsafe; +using Unity.XR.OpenXR.Features.PICOSupport; +using UnityEngine; + +namespace Unity.XR.PXR +{ + public partial class PXR_Plugin + { + public static class MixedReality + { + private const string TAG = "[MR_Plugin/MixedReality]"; + const string PXR_PLATFORM_DLL = "openxr_pico"; + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + public static extern int Pxr_SetMeshLOD(ushort spatialMeshLod); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_StartSenseDataProviderAsync(ulong providerHandle, out ulong future); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_PollFutureEXT(ref XrFuturePollInfoEXT pollInfo, ref XrFuturePollResultEXT pollResult); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_CreateSenseDataProvider(ref XrSenseDataProviderCreateInfoBaseHeader createInfo, out ulong providerHandle); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_StartSenseDataProviderComplete(ulong future, ref XrSenseDataProviderStartCompletion completion); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_GetSenseDataProviderState(ulong providerHandle, ref PxrSenseDataProviderState state); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_StopSenseDataProvider(ulong providerHandle); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_DestroySenseDataProvider(ulong providerHandle); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_CreateSpatialAnchorAsync(ulong providerHandle, ref PxrPosef info, out ulong future); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_CreateSpatialAnchorComplete(ulong providerHandle, ulong future, ref XrSpatialAnchorCompletion completion); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_PersistSpatialAnchorAsync(ulong providerHandle, ref XrSpatialAnchorPersistInfo info, out ulong future); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_PersistSpatialAnchorComplete(ulong providerHandle, ulong future, ref XrSpatialAnchorCompletion completion); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_DestroyAnchor(ulong anchorHandle); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_QuerySenseDataAsync(ulong providerHandle, ref XrSenseDataQueryInfo info, out ulong future); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_QuerySenseDataComplete(ulong providerHandle, ulong future, ref XrSenseDataQueryCompletion completion); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_GetQueriedSenseData(ulong providerHandle, ref XrQueriedSenseDataGetInfo info, ref XrQueriedSenseData senseData); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_RetrieveSpatialEntityAnchor(ulong snapshotHandle, ref XrSpatialEntityAnchorRetrieveInfo info, out ulong anchorHandle); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_DestroySenseDataQueryResult(ulong snapshotHandle); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_LocateAnchor(ulong anchorHandle, ref XrSpaceLocation location); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_GetAnchorUuid(ulong anchorHandle, out PxrUuid uuid); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_UnpersistSpatialAnchorAsync(ulong providerHandle, ref XrSpatialAnchorUnpersistInfo info, out ulong future); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_UnpersistSpatialAnchorComplete(ulong providerHandle, ulong future, ref XrSpatialAnchorCompletion completion); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_StartSceneCaptureAsync(ulong providerHandle, out ulong future); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_StartSceneCaptureComplete(ulong providerHandle, ulong future, ref XrSceneCaptureStartCompletion completion); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_EnumerateSpatialEntityComponentTypes(ulong snapshotHandle, ulong spatialEntity, uint inputCount, out uint outputCount, + IntPtr types); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern ulong Pxr_GetSpatialMeshProviderHandle(); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_GetSpatialEntityComponentInfo(ulong snapshotHandle, ref XrSpatialEntityComponentGetInfoBaseHeader componentGetInfo, + ref XrSpatialEntityComponentDataBaseHeader componentInfo); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_GetSpatialEntitySemanticInfo(ulong snapshotHandle, ref XrSpatialEntityGetInfo componentGetInfo, + ref XrSpatialEntitySemanticData componentInfo); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_GetSpatialEntityLocationInfo(ulong snapshotHandle, ref XrSpatialEntityLocationGetInfo componentGetInfo, + ref XrSpatialEntityLocationData componentInfo); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_GetSpatialEntityBox3DInfo(ulong snapshotHandle, ref XrSpatialEntityGetInfo componentGetInfo, + ref XrSpatialEntityBoundingBox3DData componentInfo); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_GetSpatialEntityBox2DInfo(ulong snapshotHandle, ref XrSpatialEntityGetInfo componentGetInfo, + ref XrSpatialEntityBoundingBox2DData componentInfo); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_GetSpatialEntityPolygonInfo(ulong snapshotHandle, ref XrSpatialEntityGetInfo componentGetInfo, + ref XrSpatialEntityPolygonData componentInfo); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern int Pxr_GetSpatialMeshVerticesAndIndices(ulong snapshotHandle, ref XrSpatialEntityGetInfo componentGetInfo, + ref PxrTriangleMeshInfo componentInfo); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern unsafe void Pxr_AddOrUpdateMesh(ulong id1, ulong id2, int numVertices, void* vertices, int numTriangles, void* indices, + Vector3 position, Quaternion rotation); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern void Pxr_RemoveMesh(ulong id1, ulong id2); + + [DllImport(PXR_PLATFORM_DLL, CallingConvention = CallingConvention.Cdecl)] + private static extern void Pxr_ClearMeshes(); + public static ulong SpatialAnchorProviderHandle { get; set; } + public static ulong SceneCaptureProviderHandle { get; set; } + + + public static Dictionary meshAnchorLastData = new Dictionary(); + public static Dictionary SceneAnchorData = new Dictionary(); + public static Dictionary SpatialMeshData = new Dictionary(); + private static readonly Dictionary> nativeMeshArrays = new Dictionary>(); + + public static ulong UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType type) + { + switch (type) + { + case PxrSenseDataProviderType.SpatialAnchor: + return SpatialAnchorProviderHandle; + case PxrSenseDataProviderType.SceneCapture: + return SceneCaptureProviderHandle; + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } + + public static PxrResult UPxr_StartSenseDataProviderAsync(ulong providerHandle, out ulong future) + { + future = UInt64.MinValue; + var pxrResult = (PxrResult)Pxr_StartSenseDataProviderAsync(providerHandle, out future); + return pxrResult; + } + + public static PxrResult UPxr_PollFuture(ulong future, out PxrFutureState futureState) + { + XrFuturePollInfoEXT pollInfo = new XrFuturePollInfoEXT() + { + type = XrStructureType.XR_TYPE_FUTURE_POLL_INFO_EXT, + future = future, + }; + XrFuturePollResultEXT pollResult = new XrFuturePollResultEXT() + { + type = XrStructureType.XR_TYPE_FUTURE_POLL_RESULT_EXT, + }; + var pxrResult = (PxrResult)Pxr_PollFutureEXT(ref pollInfo, ref pollResult); + futureState = pollResult.state; + + return pxrResult; + } + + public static PxrResult UPxr_CreateSenseDataProvider(ref XrSenseDataProviderCreateInfoBaseHeader info, out ulong providerHandle) + { + var pxrResult = (PxrResult)Pxr_CreateSenseDataProvider(ref info, out providerHandle); + return pxrResult; + } + + public static PxrResult UPxr_CreateSpatialAnchorSenseDataProvider() + { + XrSenseDataProviderCreateInfoBaseHeader header = new XrSenseDataProviderCreateInfoBaseHeader() + { + type = XrStructureType.XR_TYPE_SENSE_DATA_PROVIDER_CREATE_INFO_SPATIAL_ANCHOR + }; + + var pxrResult = UPxr_CreateSenseDataProvider(ref header, out var providerHandle); + SpatialAnchorProviderHandle = providerHandle; + return pxrResult; + } + + public static PxrResult UPxr_CreateSceneCaptureSenseDataProvider() + { + XrSenseDataProviderCreateInfoBaseHeader header = new XrSenseDataProviderCreateInfoBaseHeader() + { + type = XrStructureType.XR_TYPE_SENSE_DATA_PROVIDER_CREATE_INFO_SCENE_CAPTURE, + }; + + var pxrResult = UPxr_CreateSenseDataProvider(ref header, out var providerHandle); + SceneCaptureProviderHandle = providerHandle; + return pxrResult; + } + + public static PxrResult UPxr_StartSenseDataProviderComplete(ulong future, out XrSenseDataProviderStartCompletion completion) + { + completion = new XrSenseDataProviderStartCompletion() + { + type = XrStructureType.XR_TYPE_SENSE_DATA_PROVIDER_START_COMPLETION, + }; + var pxrResult = (PxrResult)Pxr_StartSenseDataProviderComplete(future, ref completion); + return pxrResult; + } + + public static PxrResult UPxr_GetSenseDataProviderState(ulong providerHandle, out PxrSenseDataProviderState state) + { + state = PxrSenseDataProviderState.Stopped; + var pxrResult = (PxrResult)Pxr_GetSenseDataProviderState(providerHandle, ref state); + return pxrResult; + } + + public static PxrResult UPxr_StopSenseDataProvide(ulong providerHandle) + { + var pxrResult = (PxrResult)Pxr_StopSenseDataProvider(providerHandle); + return pxrResult; + } + + public static PxrResult UPxr_DestroySenseDataProvider(ulong providerHandle) + { + var pxrResult = (PxrResult)Pxr_DestroySenseDataProvider(providerHandle); + return pxrResult; + } + + public static PxrResult UPxr_CreateSpatialAnchorAsync(ulong providerHandle, Vector3 position, Quaternion rotation, out ulong future) + { + PxrPosef pose = new PxrPosef() + { + orientation = new PxrVector4f() + { + x = rotation.x, + y = rotation.y, + z = -rotation.z, + w = -rotation.w + }, + position = new PxrVector3f() + { + x = position.x, + y = position.y, + z = -position.z + } + }; + var pxrResult = (PxrResult)Pxr_CreateSpatialAnchorAsync(providerHandle, ref pose, out future); + return pxrResult; + } + + public static PxrResult UPxr_CreateSpatialAnchorComplete(ulong providerHandle, ulong future, out XrSpatialAnchorCompletion completion) + { + completion = new XrSpatialAnchorCompletion() + { + type = XrStructureType.XR_TYPE_SPATIAL_ANCHOR_CREATE_COMPLETION + }; + var pxrResult = (PxrResult)Pxr_CreateSpatialAnchorComplete(providerHandle, future, ref completion); + return pxrResult; + } + + public static PxrResult UPxr_PersistSpatialAnchorAsync(ulong providerHandle, ulong anchorHandle, out ulong future) + { + XrSpatialAnchorPersistInfo persistInfo = new XrSpatialAnchorPersistInfo() + { + type = XrStructureType.XR_TYPE_SPATIAL_ANCHOR_PERSIST_INFO, + location = PxrPersistenceLocation.Local, + anchorHandle = anchorHandle + }; + var pxrResult = (PxrResult)Pxr_PersistSpatialAnchorAsync(providerHandle, ref persistInfo, out future); + return pxrResult; + } + + public static PxrResult UPxr_PersistSpatialAnchorComplete(ulong providerHandle,ulong future,out XrSpatialAnchorCompletion completion) + { + completion = new XrSpatialAnchorCompletion() + { + type = XrStructureType.XR_TYPE_SPATIAL_ANCHOR_PERSIST_COMPLETION, + }; + var pxrResult = (PxrResult)Pxr_PersistSpatialAnchorComplete(providerHandle, future, ref completion); + return pxrResult; + } + + public static PxrResult UPxr_DestroyAnchor(ulong anchorHandle) + { + var pxrResult = (PxrResult)Pxr_DestroyAnchor(anchorHandle); + return pxrResult; + } + + public static PxrResult UPxr_QuerySenseDataAsync(ulong providerHandle,ref XrSenseDataQueryInfo info, out ulong future) + { + var pxrResult = (PxrResult)Pxr_QuerySenseDataAsync(providerHandle, ref info, out future); + return pxrResult; + } + public static PxrResult UPxr_QuerySenseDataByUuidAsync(Guid[] uuids, out ulong future) + { + XrSenseDataQueryInfo info = new XrSenseDataQueryInfo() + { + type = XrStructureType.XR_TYPE_SENSE_DATA_QUERY_INFO, + }; + XrSenseDataFilterUuid uuidFilter = new XrSenseDataFilterUuid() + { + type = XrStructureType.XR_TYPE_SENSE_DATA_FILTER_UUID + }; + + if (uuids.Length > 0) + { + uuidFilter.uuidCount = (uint)uuids.Length; + uuidFilter.uuidList = Marshal.AllocHGlobal(uuids.Length * Marshal.SizeOf(typeof(Guid))); + byte[] bytes = uuids.SelectMany(g => g.ToByteArray()).ToArray(); + Marshal.Copy(bytes, 0, uuidFilter.uuidList, uuids.Length * Marshal.SizeOf(typeof(Guid))); + int size = Marshal.SizeOf(); + info.filter = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(uuidFilter, info.filter, false); + } + else + { + info.filter = IntPtr.Zero; + } + + var pxrResult = UPxr_QuerySenseDataAsync(UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor), ref info, out future); + Marshal.FreeHGlobal(uuidFilter.uuidList); + Marshal.FreeHGlobal(info.filter); + return pxrResult; + } + + public static PxrResult UPxr_QuerySenseDataComplete(ulong providerHandle,ulong future,out XrSenseDataQueryCompletion completion) + { + completion = new XrSenseDataQueryCompletion() + { + type = XrStructureType.XR_TYPE_SENSE_DATA_QUERY_COMPLETION, + }; + var pxrResult = (PxrResult)Pxr_QuerySenseDataComplete(providerHandle, future,ref completion); + return pxrResult; + } + + + + public static PxrResult UPxr_GetQueriedSenseData(ulong providerHandle, ulong snapshotHandle, out List entityinfos) + { + XrQueriedSenseDataGetInfo info = new XrQueriedSenseDataGetInfo() + { + type = XrStructureType.XR_TYPE_QUERIED_SENSE_DATA_GET_INFO, + snapshotHandle = snapshotHandle + }; + + XrQueriedSenseData senseDataFirst = new XrQueriedSenseData() + { + type = XrStructureType.XR_TYPE_QUERIED_SENSE_DATA_GET_INFO, + queriedSpatialEntityCapacityInput = 0, + queriedSpatialEntityCountOutput = 0, + }; + + var getResultFirst = (PxrResult)Pxr_GetQueriedSenseData(providerHandle, ref info, ref senseDataFirst); + if (getResultFirst == PxrResult.SUCCESS) + { + XrQueriedSenseData senseDataSecond = new XrQueriedSenseData() + { + type = XrStructureType.XR_TYPE_QUERIED_SENSE_DATA_GET_INFO, + queriedSpatialEntityCapacityInput = senseDataFirst.queriedSpatialEntityCountOutput, + queriedSpatialEntityCountOutput = senseDataFirst.queriedSpatialEntityCountOutput, + }; + int resultSize = Marshal.SizeOf(); + // Debug.Log("[PoxrUnity] PxrQueriedSpatialEntityInfo size:"+resultSize); + int bytesSize = (int)senseDataFirst.queriedSpatialEntityCountOutput * resultSize; + senseDataSecond.queriedSpatialEntities = Marshal.AllocHGlobal(bytesSize); + var getResultSecond = (PxrResult)Pxr_GetQueriedSenseData(providerHandle, ref info, ref senseDataSecond); + entityinfos = new List(); + if (getResultSecond==PxrResult.SUCCESS) + { + for (int i = 0; i < senseDataFirst.queriedSpatialEntityCountOutput; i++) + { + PxrQueriedSpatialEntityInfo t = + (PxrQueriedSpatialEntityInfo)Marshal.PtrToStructure(senseDataSecond.queriedSpatialEntities + i * resultSize, + typeof(PxrQueriedSpatialEntityInfo)); + // Debug.Log($"[PoxrUnity] {i} spatialEntity="+t.spatialEntity); + entityinfos.Add(t); + } + } + Marshal.FreeHGlobal(senseDataSecond.queriedSpatialEntities); + return getResultSecond; + } + else + { + entityinfos = new List(); + return getResultFirst; + } + } + + public static PxrResult UPxr_RetrieveSpatialEntityAnchor(ulong snapshotHandle, ulong spatialEntityHandle,out ulong anchorHandle) + { + XrSpatialEntityAnchorRetrieveInfo info = new XrSpatialEntityAnchorRetrieveInfo() + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_ANCHOR_RETRIEVE_INFO, + spatialEntity = spatialEntityHandle, + }; + var pxrResult = (PxrResult)Pxr_RetrieveSpatialEntityAnchor(snapshotHandle, ref info,out anchorHandle); + return pxrResult; + } + public static PxrResult UPxr_DestroySenseDataQueryResult(ulong queryResultHandle) + { + var pxrResult = (PxrResult)Pxr_DestroySenseDataQueryResult(queryResultHandle); + return pxrResult; + } + + public static PxrResult UPxr_LocateAnchor(ulong anchorHandle, out Vector3 position, out Quaternion rotation) + { + + + XrSpaceLocation location = new XrSpaceLocation() + { + type = XrStructureType.XR_TYPE_SPACE_LOCATION, + }; + var pxrResult = (PxrResult)Pxr_LocateAnchor(anchorHandle, ref location); + foreach (PxrSpaceLocationFlags value in Enum.GetValues(typeof(PxrSpaceLocationFlags))) + { + if ((location.locationFlags & (ulong)value) != (ulong)value) + { + position = Vector3.zero; + rotation = Quaternion.identity; + return PxrResult.ERROR_POSE_INVALID; + } + } + rotation = new Quaternion(location.pose.orientation.x, location.pose.orientation.y, -location.pose.orientation.z, -location.pose.orientation.w); + position = new Vector3(location.pose.position.x, location.pose.position.y, -location.pose.position.z); + return pxrResult; + } + + public static PxrResult UPxr_GetAnchorUuid(ulong anchorHandle, out Guid uuid) + { + var pxrResult = (PxrResult)Pxr_GetAnchorUuid(anchorHandle,out var pUuid); + byte[] byteArray = new byte[16]; + BitConverter.GetBytes(pUuid.value0).CopyTo(byteArray, 0); + BitConverter.GetBytes(pUuid.value1).CopyTo(byteArray, 8); + // Debug.Log($"GetAnchorUuid, uuid byteArray result is {string.Join(", ", byteArray)}"); + uuid = new Guid(byteArray); + return pxrResult; + } + + + public static PxrResult UPxr_UnPersistSpatialAnchorAsync(ulong providerHandle, ulong anchorHandle, out ulong future) + { + XrSpatialAnchorUnpersistInfo unPersistInfo = new XrSpatialAnchorUnpersistInfo() + { + type = XrStructureType.XR_TYPE_SPATIAL_ANCHOR_UNPERSIST_INFO, + location = PxrPersistenceLocation.Local, + anchorHandle = anchorHandle + }; + var pxrResult = (PxrResult)Pxr_UnpersistSpatialAnchorAsync(providerHandle, ref unPersistInfo, out future); + return pxrResult; + } + public static PxrResult UPxr_UnPersistSpatialAnchorComplete(ulong providerHandle,ulong future, out XrSpatialAnchorCompletion completion) + { + completion = new XrSpatialAnchorCompletion() + { + type = XrStructureType.XR_TYPE_SPATIAL_ANCHOR_UNPERSIST_COMPLETION, + }; + var pxrResult = (PxrResult)Pxr_UnpersistSpatialAnchorComplete(providerHandle, future, ref completion); + return pxrResult; + } + + public static PxrResult UPxr_StartSceneCaptureAsync(out ulong future) + { + var pxrResult = (PxrResult)Pxr_StartSceneCaptureAsync(UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SceneCapture), out future); + return pxrResult; + } + + public static PxrResult UPxr_StartSceneCaptureComplete(ulong future,out XrSceneCaptureStartCompletion completion) + { + completion = new XrSceneCaptureStartCompletion() + { + type = XrStructureType.XR_TYPE_SCENE_CAPTURE_START_COMPLETION + }; + var pxrResult = (PxrResult)Pxr_StartSceneCaptureComplete(UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SceneCapture), future,ref completion); + return pxrResult; + } + + public static PxrResult UPxr_QuerySenseDataBySemanticAsync(PxrSemanticLabel[] labels, out ulong future) + { + XrSenseDataQueryInfo info = new XrSenseDataQueryInfo() + { + type = XrStructureType.XR_TYPE_SENSE_DATA_QUERY_INFO, + }; + + XrSenseDataFilterSemantic semanticFilter = new XrSenseDataFilterSemantic() + { + type = XrStructureType.XR_TYPE_SENSE_DATA_FILTER_SEMANTIC + }; + + if (labels.Length > 0) + { + semanticFilter.semanticCount = (uint)labels.Length; + int[] labelsAsInts = labels.Select(x => (int)x).ToArray(); + semanticFilter.semantics = Marshal.AllocHGlobal(labels.Length * Marshal.SizeOf(typeof(int))); + Marshal.Copy(labelsAsInts, 0, semanticFilter.semantics, labelsAsInts.Length); + int size = Marshal.SizeOf(); + info.filter = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(semanticFilter, info.filter, false); + } + else + { + info.filter = IntPtr.Zero; + } + + var pxrResult = UPxr_QuerySenseDataAsync(UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SceneCapture), ref info, out future); + Marshal.FreeHGlobal(semanticFilter.semantics); + Marshal.FreeHGlobal(info.filter); + return pxrResult; + } + + + + public static PxrResult UPxr_GetSpatialEntitySemanticInfo(ulong snapshotHandle, ulong spatialEntityHandle, out PxrSemanticLabel label) + { + label = PxrSemanticLabel.Unknown; + PxrResult result = UPxr_GetSpatialSemantics(snapshotHandle, spatialEntityHandle, out var labels); + if (result==PxrResult.SUCCESS&&labels.Length>0) + { + label = labels[0]; + } + return result; + } + + + + + public static PxrResult UPxr_GetSpatialEntityLocationInfo(ulong snapshotHandle, ulong spatialEntityHandle, out Vector3 position, + out Quaternion rotation) + { + position = Vector3.zero; + rotation = Quaternion.identity; + var getInfo = new XrSpatialEntityLocationGetInfo + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_LOCATION_GET_INFO, + entity = spatialEntityHandle, + componentType = PxrSceneComponentType.Location, + baseSpace = 0, + time = 0, + }; + XrSpatialEntityLocationData locationInfo = new XrSpatialEntityLocationData() + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_LOCATION_DATA + }; + var result = (PxrResult)Pxr_GetSpatialEntityLocationInfo(snapshotHandle, ref getInfo, ref locationInfo); + if (result == PxrResult.SUCCESS) + { + foreach (PxrSpaceLocationFlags value in Enum.GetValues(typeof(PxrSpaceLocationFlags))) + { + if ((locationInfo.location.locationFlags & (ulong)value) != (ulong)value) + { + position = Vector3.zero; + rotation = Quaternion.identity; + return PxrResult.ERROR_POSE_INVALID; + } + } + rotation = new Quaternion(locationInfo.location.pose.orientation.x, locationInfo.location.pose.orientation.y, -locationInfo.location.pose.orientation.z, + -locationInfo.location.pose.orientation.w); + position = new Vector3(locationInfo.location.pose.position.x, locationInfo.location.pose.position.y, -locationInfo.location.pose.position.z); + // Debug.Log("[PoxrUnity] UPxr_GetSpatialEntityLocationInfo rotation:"+rotation+" position:"+position); + } + return result; + } + + public static PxrResult UPxr_EnumerateSpatialEntityComponentTypes(ulong snapshotHandle, ulong spatialEntityHandle, + out PxrSceneComponentType[] types) + { + var componentTypes = IntPtr.Zero; + types = Array.Empty(); + var firstResult = + (PxrResult)Pxr_EnumerateSpatialEntityComponentTypes(snapshotHandle, spatialEntityHandle, 0, out var firstOutputCount, componentTypes); + if (firstResult == PxrResult.SUCCESS) + { + int size = (int)firstOutputCount * Marshal.SizeOf(typeof(int)); + componentTypes = Marshal.AllocHGlobal(size); + var secondResult = (PxrResult)Pxr_EnumerateSpatialEntityComponentTypes(snapshotHandle, spatialEntityHandle, firstOutputCount, + out var outputCount, componentTypes); + if (secondResult == PxrResult.SUCCESS) + { + types = new PxrSceneComponentType[outputCount]; + int[] typesInts = new int[outputCount]; + Marshal.Copy(componentTypes, typesInts, 0, (int)firstOutputCount); + for (int i = 0; i < outputCount; i++) + { + types[i] = (PxrSceneComponentType)typesInts[i]; + // Debug.Log("[PoxrUnity] UPxr_EnumerateSpatialEntityComponentTypes componentTypes="+ typesInts[i]); + } + + Marshal.FreeHGlobal(componentTypes); + return PxrResult.SUCCESS; + } + else + { + types = Array.Empty(); + Marshal.FreeHGlobal(componentTypes); + return secondResult; + } + } + else + { + types = Array.Empty(); + return firstResult; + } + } + + + public static PxrResult UPxr_GetSpatialEntityBox3DInfo(ulong snapshotHandle, ulong spatialEntityHandle, out Vector3 position, + out Quaternion rotation, out Vector3 extent) + { + position = Vector3.zero; + rotation = Quaternion.identity; + extent = Vector3.zero; + var getInfo = new XrSpatialEntityGetInfo + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_BOUNDING_BOX_3D_GET_INFO, + next = IntPtr.Zero, + entity = spatialEntityHandle, + componentType = PxrSceneComponentType.Box3D + }; + + + XrSpatialEntityBoundingBox3DData box3DInfo = new XrSpatialEntityBoundingBox3DData() + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_BOUNDING_BOX_3D_DATA, + next = IntPtr.Zero + }; + + var result = (PxrResult)Pxr_GetSpatialEntityBox3DInfo(snapshotHandle, ref getInfo, ref box3DInfo); + if (result == PxrResult.SUCCESS) + { + position = new Vector3(box3DInfo.box3D.center.position.x, box3DInfo.box3D.center.position.y, box3DInfo.box3D.center.position.z); + rotation = new Quaternion(box3DInfo.box3D.center.orientation.x, box3DInfo.box3D.center.orientation.y, box3DInfo.box3D.center.orientation.z, + box3DInfo.box3D.center.orientation.w); + extent = new Vector3(box3DInfo.box3D.extents.width, box3DInfo.box3D.extents.height, box3DInfo.box3D.extents.depth); + // Debug.Log($"[PoxrUnity] UPxr_GetSpatialEntityBox3DInfo snapshotHandle={snapshotHandle} position={position} rotation={rotation} extent={ extent}"); + + } + return result; + } + + public static PxrResult UPxr_GetSpatialEntityBox2DInfo(ulong snapshotHandle, ulong spatialEntityHandle, out Vector2 offset, out Vector2 extent) + { + offset = Vector2.zero; + extent = Vector2.zero; + var getInfo = new XrSpatialEntityGetInfo + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_BOUNDING_BOX_2D_GET_INFO, + entity = spatialEntityHandle, + componentType = PxrSceneComponentType.Box2D + }; + + XrSpatialEntityBoundingBox2DData box2DInfo = new XrSpatialEntityBoundingBox2DData() + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_BOUNDING_BOX_2D_DATA, + }; + + var result = (PxrResult)Pxr_GetSpatialEntityBox2DInfo(snapshotHandle, ref getInfo, ref box2DInfo); + if (result == PxrResult.SUCCESS) + { + offset = box2DInfo.box2D.offset; + extent =box2DInfo.box2D.extent.ToVector2(); + Debug.Log($"[PoxrUnity] UPxr_GetSpatialEntityBox2DInfo snapshotHandle={snapshotHandle} offset={offset} extent={extent} "); + } + return result; + } + + + public static PxrResult UPxr_GetSpatialEntityPolygonInfo(ulong snapshotHandle, ulong spatialEntityHandle, out Vector2[] vertices) + { + vertices = Array.Empty(); + var getInfo = new XrSpatialEntityGetInfo + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_POLYGON_GET_INFO, + entity = spatialEntityHandle, + componentType = PxrSceneComponentType.Polygon + }; + + XrSpatialEntityPolygonData polygonInfo = new XrSpatialEntityPolygonData() + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_POLYGON_DATA, + polygonCapacityInput = 0, + polygonCountOutput = 0, + vertices = IntPtr.Zero + }; + + var result = (PxrResult)Pxr_GetSpatialEntityPolygonInfo(snapshotHandle, ref getInfo, ref polygonInfo); + + if (result == PxrResult.SUCCESS) + { + if (polygonInfo.polygonCountOutput > 0) + { + polygonInfo.polygonCapacityInput = polygonInfo.polygonCountOutput; + polygonInfo.vertices = Marshal.AllocHGlobal((int)polygonInfo.polygonCountOutput * Marshal.SizeOf(typeof(PxrVector2f))); + + result = (PxrResult)Pxr_GetSpatialEntityPolygonInfo(snapshotHandle, ref getInfo, ref polygonInfo); + if (result == PxrResult.SUCCESS) + { + vertices = new Vector2[polygonInfo.polygonCountOutput]; + var vector2fs = new PxrVector2f[polygonInfo.polygonCountOutput]; + for (int i = 0; i < polygonInfo.polygonCountOutput; i++) + { + vector2fs[i] = Marshal.PtrToStructure(polygonInfo.vertices + i * Marshal.SizeOf(typeof(PxrVector2f))); + vertices[i].x = vector2fs[i].x; + vertices[i].y = vector2fs[i].y; + // Debug.Log($"[PoxrUnity] UPxr_GetSpatialEntityPolygonInfo snapshotHandle={snapshotHandle} vertices[{i}]={vertices[i]}"); + } + } + + Marshal.FreeHGlobal(polygonInfo.vertices); + } + } + + return result; + } + public static ulong UPxr_GetSpatialMeshProviderHandle() + { + return Pxr_GetSpatialMeshProviderHandle(); + } + + public static PxrResult UPxr_GetSpatialMesh(ulong snapshotHandle, ulong entityHandle, ref PxrSpatialMeshInfo meshInfo) + { + var result = UPxr_GetSpatialMeshVerticesAndIndices(snapshotHandle, entityHandle, out var indices, out var vertices); + if (result == PxrResult.SUCCESS) + { + meshInfo.indices = indices; + meshInfo.vertices = vertices; + result = UPxr_GetSpatialSemantics(snapshotHandle, entityHandle, out var labels); + if (result == PxrResult.SUCCESS) + { + meshInfo.labels = labels; + result = UPxr_GetSpatialEntityLocationInfo(snapshotHandle, entityHandle, out var position, out var rotation); + if (result == PxrResult.SUCCESS) + { + meshInfo.position = position; + meshInfo.rotation = rotation; + + return PxrResult.SUCCESS; + } + else + { + return result; + } + } + else + { + return result; + } + } + else + { + return result; + } + } + + + public static PxrResult UPxr_GetSpatialMeshVerticesAndIndices(ulong snapshotHandle, ulong entityHandle, out ushort[] indices, out Vector3[] vertices) + { + indices = Array.Empty(); + vertices = Array.Empty(); + var getInfo = new XrSpatialEntityGetInfo + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_TRIANGLE_MESH_GET_INFO, + entity = entityHandle, + componentType = PxrSceneComponentType.TriangleMesh + }; + + PxrTriangleMeshInfo meshInfo = new PxrTriangleMeshInfo() + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_TRIANGLE_MESH_DATA, + vertexCapacityInput = 0, + vertexCountOutput = 0, + vertices = IntPtr.Zero, + indexCapacityInput = 0, + indexCountOutput = 0, + indices = IntPtr.Zero + }; + + var result = (PxrResult)Pxr_GetSpatialMeshVerticesAndIndices(snapshotHandle, ref getInfo, ref meshInfo); + if (result == PxrResult.SUCCESS) + { + + meshInfo.indexCapacityInput = meshInfo.indexCountOutput; + meshInfo.indices = Marshal.AllocHGlobal((int)meshInfo.indexCountOutput * Marshal.SizeOf(typeof(ushort))); + meshInfo.vertexCapacityInput = meshInfo.vertexCountOutput; + meshInfo.vertices = Marshal.AllocHGlobal((int)meshInfo.vertexCountOutput * Marshal.SizeOf(typeof(PxrVector3f))); + + result = (PxrResult)Pxr_GetSpatialMeshVerticesAndIndices(snapshotHandle, ref getInfo, ref meshInfo); + if (result == PxrResult.SUCCESS) + { + + indices = new ushort[meshInfo.indexCountOutput]; + if (meshInfo.indexCountOutput > 0) + { + var indicesTmp = new short[meshInfo.indexCountOutput]; + Marshal.Copy(meshInfo.indices, indicesTmp, 0, (int)meshInfo.indexCountOutput); + indices = indicesTmp.Select(l => (ushort)l).ToArray(); + + for (int i = 0; i < indices.Length; i += 3) + { + (indices[i + 1], indices[i + 2]) = (indices[i + 2], indices[i + 1]); + } + } + vertices = new Vector3[meshInfo.vertexCountOutput]; + if (meshInfo.vertexCountOutput > 0) + { + IntPtr tempPtr = meshInfo.vertices; + for (int i = 0; i < meshInfo.vertexCountOutput; i++) + { + vertices[i] = Marshal.PtrToStructure(tempPtr); + tempPtr += Marshal.SizeOf(typeof(Vector3)); + } + + vertices = vertices.Select(v => new Vector3(v.x, v.y, -v.z)).ToArray(); + } + } + + Marshal.FreeHGlobal(meshInfo.indices); + Marshal.FreeHGlobal(meshInfo.vertices); + return result; + } + + return result; + + } + + public static PxrResult UPxr_GetSpatialSemantics(ulong snapshotHandle, ulong spatialEntityHandle, out PxrSemanticLabel[] labels) + { + labels = Array.Empty(); + XrSpatialEntityGetInfo getInfo = new XrSpatialEntityGetInfo + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_SEMANTIC_GET_INFO, + entity = spatialEntityHandle, + componentType = PxrSceneComponentType.Semantic + }; + XrSpatialEntitySemanticData semanticInfo = new XrSpatialEntitySemanticData() + { + type = XrStructureType.XR_TYPE_SPATIAL_ENTITY_SEMANTIC_DATA, + semanticCapacityInput = 0, + semanticCountOutput = 0, + semanticLabels = IntPtr.Zero + }; + + var result = (PxrResult)Pxr_GetSpatialEntitySemanticInfo(snapshotHandle, ref getInfo, ref semanticInfo); + if (result == PxrResult.SUCCESS) + { + if (semanticInfo.semanticCountOutput > 0) + { + semanticInfo.semanticCapacityInput = semanticInfo.semanticCountOutput; + + semanticInfo.semanticLabels = Marshal.AllocHGlobal((int)semanticInfo.semanticCapacityInput*Marshal.SizeOf(typeof(int))); + + result = (PxrResult)Pxr_GetSpatialEntitySemanticInfo(snapshotHandle, ref getInfo, ref semanticInfo); + if (result == PxrResult.SUCCESS) + { + labels = new PxrSemanticLabel[semanticInfo.semanticCountOutput]; + var sTmp = new int[semanticInfo.semanticCountOutput]; + Marshal.Copy(semanticInfo.semanticLabels, sTmp, 0, (int)semanticInfo.semanticCountOutput); + labels = sTmp.Select(l => (PxrSemanticLabel)l).ToArray(); + // label = (PxrSemanticLabel)Marshal.ReadInt32(semanticInfo.semanticLabels); + // Debug.Log("[PoxrUnity] UPxr_GetSpatialEntitySemanticInfo semanticLabels:"+label); + } + + Marshal.FreeHGlobal(semanticInfo.semanticLabels); + return result; + } + + return result; + } + + return result; + } + + public static void UPxr_AddOrUpdateMesh(PxrSpatialMeshInfo meshInfo) + { + byte[] temp = meshInfo.uuid.ToByteArray(); + var id1 = BitConverter.ToUInt64(temp, 0); + var id2 = BitConverter.ToUInt64(temp, 8); + var vertices = new NativeArray(meshInfo.vertices, Allocator.Persistent); + var indices = new NativeArray(meshInfo.indices, Allocator.Persistent); + + unsafe + { + Pxr_AddOrUpdateMesh(id1, id2, meshInfo.vertices.Length, NativeArrayUnsafeUtility.GetUnsafeReadOnlyPtr(vertices), meshInfo.indices.Length, NativeArrayUnsafeUtility.GetUnsafeReadOnlyPtr(indices), meshInfo.position, meshInfo.rotation); + } + + if (nativeMeshArrays.TryGetValue(meshInfo.uuid, out var nativeArrays)) + nativeArrays.ForEach(x => x.Dispose()); + nativeMeshArrays[meshInfo.uuid] = new List { vertices, indices}; + } + public static void UPxr_RemoveMesh(Guid uuid) + { + byte[] temp = uuid.ToByteArray(); + var id1 = BitConverter.ToUInt64(temp, 0); + var id2 = BitConverter.ToUInt64(temp, 8); + Pxr_RemoveMesh(id1, id2); + if (nativeMeshArrays.TryGetValue(uuid, out var nativeArrays)) + { + nativeArrays.ForEach(x => x.Dispose()); + nativeMeshArrays.Remove(uuid); + } + } + public static void UPxr_DisposeMesh() + { + foreach (var nativeArrays in nativeMeshArrays.Values) + { + nativeArrays.ForEach(x => x.Dispose()); + } + + nativeMeshArrays.Clear(); + UPxr_ClearMeshes(); + } + public static void UPxr_ClearMeshes() + { + Pxr_ClearMeshes(); + } + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/MR_Plugin.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/MR_Plugin.cs.meta new file mode 100644 index 0000000..98ef972 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/MR_Plugin.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 22c136dcdaaa485aaa5680cf25bf28d5 +timeCreated: 1721811189 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_MixedReality.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_MixedReality.cs new file mode 100644 index 0000000..7481c9e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_MixedReality.cs @@ -0,0 +1,1048 @@ +/******************************************************************************* +Copyright ? 2015-2022 Pico Technology Co., Ltd.All rights reserved. + +NOTICE All information contained herein is, and remains the property of +Pico Technology Co., Ltd. The intellectual and technical concepts +contained hererin are proprietary to Pico Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +Pico Technology Co., Ltd. +*******************************************************************************/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Unity.XR.OpenXR.Features.PICOSupport; +using UnityEngine; +using UnityEngine.XR; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; + +namespace Unity.XR.PXR +{ + public class PXR_MixedReality + { + private const string TAG = "[PXR_MixedReality]"; + ///

+ /// Starts the Spatial Anchor or Scene Capture feature by starting the corresponding sense data provider. + /// + /// Specifies the type of sense data provider to start: `SpatialAnchor` or `SceneCapture`. + /// Propagates notification that operations should be canceled. + /// Refer to the `PxrResult` enumeration for details. + public static async Task StartSenseDataProvider(PxrSenseDataProviderType type, CancellationToken token = default) + { + var isFeature = false; + + if (type==PxrSenseDataProviderType.SpatialAnchor) + { + isFeature = PICOSpatialAnchor.isEnable; + } + else if (type==PxrSenseDataProviderType.SceneCapture) + { + isFeature = PICOSceneCapture.isEnable; + } + + if (!isFeature) + { + return await Task.Run(() => { return PxrResult.ERROR_EXTENSION_NOT_ENABLED; }, token); + } + + int isPermissionMR = -1; + PXR_PermissionRequest.RequestUserPermissionMR(d => + { + isPermissionMR = -2; + Debug.LogError($"request permission result is {d}"); + }, async g => { isPermissionMR = 0; }, dda => + { + isPermissionMR = -2; + Debug.LogError($"request permission result is {dda}"); + }); + + while (isPermissionMR==-1) + { + await Task.Delay(200); + } + if (isPermissionMR != 0) + { + return await Task.Run(() => { return PxrResult.ERROR_PERMISSION_INSUFFICIENT; }, token); + } + return await Task.Run(() => + { + var providerHandle = PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(type); + var startResult = + PXR_Plugin.MixedReality.UPxr_StartSenseDataProviderAsync(providerHandle, out var future); + if (startResult == PxrResult.SUCCESS) + { + while (true) + { + var pollResult = PXR_Plugin.MixedReality.UPxr_PollFuture(future, out var futureState); + if (pollResult == PxrResult.SUCCESS) + { + if (futureState == PxrFutureState.Ready) + { + var completeResult = + PXR_Plugin.MixedReality.UPxr_StartSenseDataProviderComplete(future, + out var completion); + if (completeResult == PxrResult.SUCCESS) + { + return completion.futureResult; + } + else + { + return completeResult; + } + } + } + else + { + return pollResult; + } + } + } + else + { + return startResult; + } + }, token); + } + /// + /// Gets the state of the sense data provider. + /// + /// Specifies the type of sense data provider to get state for: `SpatialAnchor` or `SceneCapture`. + /// Returns the state of the specified sense data provider. + /// Refer to the `PxrResult` enumeration for details. + public static PxrResult GetSenseDataProviderState(PxrSenseDataProviderType type,out PxrSenseDataProviderState state) + { + var providerHandle = PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(type); + return PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderState(providerHandle, out state); + } + /// + /// Stops the Spatial Anchor or Scene Capture feature by stopping the corresponding sense data provider. + /// + /// Specifies the sense data provider to stop: `SpatialAnchor` or `SceneCapture`. + /// Refer to the `PxrResult` enumeration for details. + public static PxrResult StopSenseDataProvider(PxrSenseDataProviderType type) + { + var providerHandle = PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(type); + var stopResult = PXR_Plugin.MixedReality.UPxr_StopSenseDataProvide(providerHandle); + return stopResult; + } + /// + /// Creates a spatial anchor in the app's memory. + /// + /// Specifies the position of the spatial anchor. + /// Specifies the rotation of the spatial anchor. + /// Propagates notification that operations should be canceled. + /// Refer to the `PxrResult` enumeration for details. In addition, the handle and UUID of the spatial anchor created are returned. + + public static async Task<(PxrResult result, ulong anchorHandle, Guid uuid)> CreateSpatialAnchorAsync( + Vector3 position, Quaternion rotation, CancellationToken token = default) + { + return await Task.Run(() => + { + var createResult = PXR_Plugin.MixedReality.UPxr_CreateSpatialAnchorAsync( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor), position, rotation, out var future); + if (createResult == PxrResult.SUCCESS) + { + while (true) + { + var pollResult = PXR_Plugin.MixedReality.UPxr_PollFuture(future, out var futureState); + if (pollResult == PxrResult.SUCCESS) + { + if (futureState == PxrFutureState.Ready) + { + var completeResult = PXR_Plugin.MixedReality.UPxr_CreateSpatialAnchorComplete( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor), future, + out var completion); + if (completeResult == PxrResult.SUCCESS) + { + byte[] byteArray = new byte[16]; + // Debug.Log($"request anchor result is {completeResult}"); + BitConverter.GetBytes(completion.uuid.value0).CopyTo(byteArray, 0); + BitConverter.GetBytes(completion.uuid.value1).CopyTo(byteArray, 8); + //Debug.Log($"xrCreateSpatialAnchorComplete byteArray result is {string.Join(", ", byteArray)}"); + var uuid = new Guid(byteArray); + return (completion.futureResult, completion.anchorHandle, uuid); + } + else + { + return (completeResult, ulong.MinValue, Guid.Empty); + } + } + } + else + { + return (pollResult, ulong.MinValue, Guid.Empty); + } + } + } + else + { + return (createResult, ulong.MinValue, Guid.Empty); + } + }, token); + } + /// + /// Persists a spatial anchor to the PICO device's local disk. + /// + /// Specifies the handle of the spatial anchor to persist. + /// Propagates notification that operations should be canceled. + /// Refer to the `PxrResult` enumeration for details. + public static async Task PersistSpatialAnchorAsync(ulong anchorHandle,CancellationToken token = default) + { + return await Task.Run(() => + { + var persistResult = PXR_Plugin.MixedReality.UPxr_PersistSpatialAnchorAsync( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor), anchorHandle, out var future); + if (persistResult == PxrResult.SUCCESS) + { + while (true) + { + var pollResult = PXR_Plugin.MixedReality.UPxr_PollFuture(future, out var futureState); + if (pollResult == PxrResult.SUCCESS) + { + if (futureState == PxrFutureState.Ready) + { + var completeResult = PXR_Plugin.MixedReality.UPxr_PersistSpatialAnchorComplete( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor), future, + out var completion); + if (completeResult == PxrResult.SUCCESS) + { + return completion.futureResult; + } + else + { + return completeResult; + } + } + } + else + { + return pollResult; + } + } + } + else + { + return persistResult; + } + }, token); + } + /// + /// Destroys an anchor in the app's memory. + /// + /// Specifies the handle of the anchor to destroy. If you specify the handle of a scene anchor, the "Invalid handle" prompt will appear. + /// Refer to the `PxrResult` enumeration for details. + public static PxrResult DestroyAnchor(ulong anchorHandle) + { + if (PXR_Plugin.MixedReality.SceneAnchorData.ContainsKey(anchorHandle)) + { + return PxrResult.ERROR_HANDLE_INVALID; + } + else + { + return PXR_Plugin.MixedReality.UPxr_DestroyAnchor(anchorHandle); + } + } + /// + /// Loads spatial anchor(s) from the device's local storage and the app's memory. + /// + /// Specifies the UUID(s) of the spatial anchor(s) you want to load. If you do not pass any UUID, all spatial anchors will be loaded. + /// Propagates notification that operations should be canceled. + /// Refer to the `PxrResult` enumeration for details. In addition, a list of the handles of the loaded anchors is returned. + public static async Task<(PxrResult result, List anchorHandleList)> QuerySpatialAnchorAsync(Guid[] uuids = null, CancellationToken token = default) + { + return await Task.Run(() => + { + if (uuids == null) + { + uuids = Array.Empty(); + } + var queryResult = PXR_Plugin.MixedReality.UPxr_QuerySenseDataByUuidAsync(uuids, out var future); + if (queryResult == PxrResult.SUCCESS) + { + while (true) + { + var pollResult = PXR_Plugin.MixedReality.UPxr_PollFuture(future, out var futureState); + if (pollResult == PxrResult.SUCCESS) + { + if (futureState == PxrFutureState.Ready) + { + var completeResult = PXR_Plugin.MixedReality.UPxr_QuerySenseDataComplete( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor), future, + out var completion); + if (completeResult == PxrResult.SUCCESS) + { + if (completion.futureResult == PxrResult.SUCCESS) + { + var getResult = PXR_Plugin.MixedReality.UPxr_GetQueriedSenseData( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor), + completion.snapshotHandle, out var entityInfos); + if (getResult == PxrResult.SUCCESS) + { + var anchorHandleList = new List(); + foreach (var e in entityInfos) + { + var retrieveResult = PXR_Plugin.MixedReality.UPxr_RetrieveSpatialEntityAnchor(completion.snapshotHandle, + e.spatialEntity, out var anchorHandle); + if (retrieveResult == PxrResult.SUCCESS) + { + anchorHandleList.Add(anchorHandle); + } + } + PXR_Plugin.MixedReality.UPxr_DestroySenseDataQueryResult(completion.snapshotHandle); + return (getResult, anchorHandleList); + } + else + { + PXR_Plugin.MixedReality.UPxr_DestroySenseDataQueryResult(completion.snapshotHandle); + return (getResult, new List()); + } + } + else + { + return (completion.futureResult, new List()); + } + } + else + { + return (completeResult, new List()); + } + } + } + else + { + return (pollResult, new List()); + } + } + } + else + { + return (queryResult, new List()); + } + }, token); + } + /// + /// Locates an anchor by getting its real-time position and rotation. + /// + /// Specifies the handle of the anchor to locate. + /// Returns the position of the anchor. + /// Returns the rotation of the anchor. + /// Refer to the `PxrResult` enumeration for details. + public static PxrResult LocateAnchor(ulong anchorHandle, out Vector3 position, out Quaternion rotation) + { + if (PXR_Plugin.MixedReality.SceneAnchorData.ContainsKey(anchorHandle)) + { + if (PXR_Plugin.MixedReality.SceneAnchorData.TryGetValue(anchorHandle, out var data)) + { + position = data.position; + rotation = data.rotation; + return PxrResult.SUCCESS; + } + else + { + position = Vector3.zero; + rotation = Quaternion.identity; + return PxrResult.ERROR_HANDLE_INVALID; + } + } + else + { + return PXR_Plugin.MixedReality.UPxr_LocateAnchor(anchorHandle, out position, out rotation); + } + } + /// + /// Gets the UUID of an anchor. + /// + /// Specifies the handle of the anchor to get UUID for. + /// Returns the UUID of the specified anchor. + /// Refer to the `PxrResult` enumeration for details. + public static PxrResult GetAnchorUuid(ulong anchorHandle, out Guid uuid) + { + if (PXR_Plugin.MixedReality.SceneAnchorData.ContainsKey(anchorHandle)) + { + if (PXR_Plugin.MixedReality.SceneAnchorData.TryGetValue(anchorHandle, out var data)) + { + uuid = data.uuid; + return PxrResult.SUCCESS; + } + else + { + uuid = Guid.Empty; + return PxrResult.ERROR_HANDLE_INVALID; + } + } + else + { + return PXR_Plugin.MixedReality.UPxr_GetAnchorUuid(anchorHandle, out uuid); + } + } + /// + /// Unpersists a spatial anchor from the PICO device's local disk. + /// + /// Specifies the handle of the spatial anchor to unpersist. + /// Propagates notification that operations should be canceled. + /// Refer to the `PxrResult` enumeration for details. + public static async Task UnPersistSpatialAnchorAsync(ulong anchorHandle, CancellationToken token = default) + { + return await Task.Run(() => + { + var unPersistResult = PXR_Plugin.MixedReality.UPxr_UnPersistSpatialAnchorAsync( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor), anchorHandle, out var future); + if (unPersistResult == PxrResult.SUCCESS) + { + while (true) + { + var pollResult = PXR_Plugin.MixedReality.UPxr_PollFuture(future, out var futureState); + if (pollResult == PxrResult.SUCCESS) + { + if (futureState == PxrFutureState.Ready) + { + var completeResult = PXR_Plugin.MixedReality.UPxr_UnPersistSpatialAnchorComplete( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor), future, + out var completion); + if (completeResult == PxrResult.SUCCESS) + { + return completion.futureResult; + } + else + { + return completeResult; + } + } + } + else + { + return pollResult; + } + } + } + else + { + return unPersistResult; + } + }, token); + } + /// + /// Launches the Room Capture app to capture the current real-world scene. + /// + /// Propagates notification that operations should be canceled. + /// Refer to the `PxrResult` enumeration for details. + public static async Task StartSceneCaptureAsync(CancellationToken token = default) + { + return await Task.Run(() => + { + var startResult = PXR_Plugin.MixedReality.UPxr_StartSceneCaptureAsync(out var future); + if (startResult == PxrResult.SUCCESS) + { + while (true) + { + var pollResult = PXR_Plugin.MixedReality.UPxr_PollFuture(future, out var futureState); + if (pollResult == PxrResult.SUCCESS) + { + if (futureState == PxrFutureState.Ready) + { + var completeResult = PXR_Plugin.MixedReality.UPxr_StartSceneCaptureComplete(future, out var completion); + if (completeResult == PxrResult.SUCCESS) + { + return completion.futureResult; + } + else + { + return completeResult; + } + } + } + else + { + return pollResult; + } + } + } + else + { + return startResult; + } + }, token); + } + /// + /// Loads scene anchors with specified semantic label(s). + /// + /// Specifies the semantic label(s). If not specified, all scene anchors will be returned. + /// Propagates notification that operations should be canceled. + /// Refer to the `PxrResult` enumeration for details. In addition, a list of the handles of loaded anchors is returned. + public static async Task<(PxrResult result, List anchorHandleList)> QuerySceneAnchorAsync(PxrSemanticLabel[] labels = null, + CancellationToken token = default) + { + return await Task.Run(() => + { + if (labels == null) + { + labels = Array.Empty(); + } + + var queryResult = PXR_Plugin.MixedReality.UPxr_QuerySenseDataBySemanticAsync(labels, out var future); + if (queryResult == PxrResult.SUCCESS) + { + while (true) + { + var pollResult = PXR_Plugin.MixedReality.UPxr_PollFuture(future, out var futureState); + if (pollResult == PxrResult.SUCCESS) + { + if (futureState == PxrFutureState.Ready) + { + var completeResult = PXR_Plugin.MixedReality.UPxr_QuerySenseDataComplete( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SceneCapture), future, + out var completion); + if (completeResult == PxrResult.SUCCESS) + { + if (completion.futureResult == PxrResult.SUCCESS) + { + var getResult = PXR_Plugin.MixedReality.UPxr_GetQueriedSenseData( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SceneCapture), + completion.snapshotHandle, out var entityInfos); + if (getResult == PxrResult.SUCCESS) + { + var anchorHandleList = new List(); + PXR_Plugin.MixedReality.SceneAnchorData.Clear(); + PXR_Plugin.MixedReality.SceneAnchorData = new Dictionary(); + foreach (var e in entityInfos) + { + byte[] byteArray = new byte[16]; + BitConverter.GetBytes(e.uuid.value0).CopyTo(byteArray, 0); + BitConverter.GetBytes(e.uuid.value1).CopyTo(byteArray, 8); + + Guid guid = new Guid(byteArray); + anchorHandleList.Add(e.spatialEntity); + var sceneAnchor = new PxrSceneComponentData + { + uuid = guid + }; + var result = PXR_Plugin.MixedReality.UPxr_GetSpatialEntitySemanticInfo(completion.snapshotHandle, e.spatialEntity, out var label); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.label = label; + } + + result = PXR_Plugin.MixedReality.UPxr_GetSpatialEntityLocationInfo(completion.snapshotHandle, + e.spatialEntity, out var position, out var rotation); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.position = position; + sceneAnchor.rotation = rotation; + } + + result = PXR_Plugin.MixedReality.UPxr_EnumerateSpatialEntityComponentTypes(completion.snapshotHandle, + e.spatialEntity, out var types); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.types = types; + } + + foreach (var t in types) + { + switch (t) + { + case PxrSceneComponentType.Box3D: + { + result = PXR_Plugin.MixedReality.UPxr_GetSpatialEntityBox3DInfo(completion.snapshotHandle, + e.spatialEntity, out var cPosition, out var cRotation, out var extent); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.box3D = new PxrSceneBox3D() + { + position = cPosition, + rotation = cRotation, + extent = extent + }; + } + break; + } + case PxrSceneComponentType.Box2D: + { + result = PXR_Plugin.MixedReality.UPxr_GetSpatialEntityBox2DInfo(completion.snapshotHandle, + e.spatialEntity, out var offset, out var extent); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.box2D = new PxrSceneBox2D() + { + offset = offset, + extent =new XrExtent2Df(extent) + }; + } + break; + } + case PxrSceneComponentType.Polygon: + { + result = PXR_Plugin.MixedReality.UPxr_GetSpatialEntityPolygonInfo(completion.snapshotHandle, + e.spatialEntity, out var vertices); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.polygon = new PxrScenePolygon() + { + vertices = vertices + }; + } + break; + } + } + } +#if UNITY_2021_1_OR_NEWER + PXR_Plugin.MixedReality.SceneAnchorData.TryAdd(e.spatialEntity, sceneAnchor); +#else + PXR_Plugin.MixedReality.SceneAnchorData.Add(e.spatialEntity, sceneAnchor); +#endif + } + PXR_Plugin.MixedReality.UPxr_DestroySenseDataQueryResult(completion.snapshotHandle); + return (getResult, anchorHandleList); + } + else + { + PXR_Plugin.MixedReality.UPxr_DestroySenseDataQueryResult(completion.snapshotHandle); + return (getResult, new List()); + } + } + else + { + return (completion.futureResult, new List()); + } + } + else + { + return (completeResult, new List()); + } + } + } + else + { + return (pollResult, new List()); + } + } + } + else + { + return (queryResult, new List()); + } + }, token); + } + /// + /// Loads all scene anchors. + /// + /// Propagates notification that operations should be canceled. + /// Refer to the `PxrResult` enumeration for details. In addition, a list of the handles and UUIDs of all scene anchors is returned. + public static async Task<(PxrResult result, Dictionary anchorDictionary)> QuerySceneAnchorAsync(CancellationToken token = default) + { + return await Task.Run(() => + { + var queryResult = PXR_Plugin.MixedReality.UPxr_QuerySenseDataBySemanticAsync(Array.Empty(), out var future); + if (queryResult == PxrResult.SUCCESS) + { + while (true) + { + var pollResult = PXR_Plugin.MixedReality.UPxr_PollFuture(future, out var futureState); + if (pollResult == PxrResult.SUCCESS) + { + if (futureState == PxrFutureState.Ready) + { + var completeResult = PXR_Plugin.MixedReality.UPxr_QuerySenseDataComplete(PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SceneCapture), future, out var completion); + if (completeResult == PxrResult.SUCCESS) + { + if (completion.futureResult == PxrResult.SUCCESS) + { + var getResult = PXR_Plugin.MixedReality.UPxr_GetQueriedSenseData(PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SceneCapture), completion.snapshotHandle, out var entityInfos); + if (getResult == PxrResult.SUCCESS) + { + var anchorDictionary = new Dictionary(); + PXR_Plugin.MixedReality.SceneAnchorData.Clear(); + PXR_Plugin.MixedReality.SceneAnchorData = new Dictionary(); + foreach (var e in entityInfos) + { + byte[] byteArray = new byte[16]; + BitConverter.GetBytes(e.uuid.value0).CopyTo(byteArray, 0); + BitConverter.GetBytes(e.uuid.value1).CopyTo(byteArray, 8); + Guid guid = new Guid(byteArray); + anchorDictionary.Add(e.spatialEntity, guid); + var sceneAnchor = new PxrSceneComponentData(); + var result = PXR_Plugin.MixedReality.UPxr_GetSpatialEntitySemanticInfo(completion.snapshotHandle, e.spatialEntity, out var label); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.label = label; + } + result = PXR_Plugin.MixedReality.UPxr_GetSpatialEntityLocationInfo(completion.snapshotHandle, e.spatialEntity, out var position, out var rotation); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.position = position; + sceneAnchor.rotation = rotation; + } + result = PXR_Plugin.MixedReality.UPxr_EnumerateSpatialEntityComponentTypes(completion.snapshotHandle, e.spatialEntity, out var types); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.types = types; + } + + foreach (var t in types) + { + switch (t) + { + case PxrSceneComponentType.Box3D: + { + result = PXR_Plugin.MixedReality.UPxr_GetSpatialEntityBox3DInfo(completion.snapshotHandle, e.spatialEntity, out var cPosition, out var cRotation, out var extent); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.box3D = new PxrSceneBox3D() + { + position = cPosition, + rotation = cRotation, + extent = extent + }; + } + break; + } + case PxrSceneComponentType.Box2D: + { + result = PXR_Plugin.MixedReality.UPxr_GetSpatialEntityBox2DInfo(completion.snapshotHandle, e.spatialEntity, out var offset, out var extent); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.box2D = new PxrSceneBox2D() + { + offset = offset, + extent = new XrExtent2Df(extent) + }; + } + break; + } + case PxrSceneComponentType.Polygon: + { + result = PXR_Plugin.MixedReality.UPxr_GetSpatialEntityPolygonInfo(completion.snapshotHandle, e.spatialEntity, out var vertices); + if (result == PxrResult.SUCCESS) + { + sceneAnchor.polygon = new PxrScenePolygon() + { + vertices = vertices + }; + } + break; + } + } + } +#if UNITY_2021_1_OR_NEWER + PXR_Plugin.MixedReality.SceneAnchorData.TryAdd(e.spatialEntity, sceneAnchor); +#else + PXR_Plugin.MixedReality.SceneAnchorData.Add(e.spatialEntity, sceneAnchor); +#endif + } + PXR_Plugin.MixedReality.UPxr_DestroySenseDataQueryResult(completion.snapshotHandle); + return (getResult, anchorDictionary); + } + else + { + return (getResult, new Dictionary()); + } + } + else + { + return (completion.futureResult, new Dictionary()); + } + } + else + { + return (completeResult, new Dictionary()); + } + } + } + else + { + return (pollResult, new Dictionary()); + } + } + } + else + { + return (queryResult, new Dictionary()); + } + }, token); + } + /// + /// Gets the component type of a scene anchor. + /// + /// Specifies the handle of the anchor to get component type for. + /// Returns the component type of the specified anchor. + /// Refer to the `PxrResult` enumeration for details. + public static PxrResult GetSceneAnchorComponentTypes(ulong anchorHandle, out PxrSceneComponentType[] types) + { + if (PXR_Plugin.MixedReality.SceneAnchorData.TryGetValue(anchorHandle, out var data)) + { + types = data.types; + return PxrResult.SUCCESS; + } + else + { + types = Array.Empty(); + return PxrResult.ERROR_HANDLE_INVALID; + } + } + /// + /// Gets the information of a 3D box object. + /// + /// Specifies the handle of the scene anchor that the 3D box object is associated with. + /// Returns the position of the 3D box object relative to the center of the scene anchor. + /// Returns the rotation of the 3D box object relative to the center of the scene anchor. + /// Returns the length, width, and height of the 3D box object. + /// Refer to the `PxrResult` enumeration for details. + public static PxrResult GetSceneBox3DData(ulong anchorHandle, out Vector3 position, out Quaternion rotation, out Vector3 extent) + { + if (PXR_Plugin.MixedReality.SceneAnchorData.TryGetValue(anchorHandle, out var data)) + { + if (data.types.Contains(PxrSceneComponentType.Box3D)) + { + position = data.box3D.position; + rotation = data.box3D.rotation; + extent = data.box3D.extent; + return PxrResult.SUCCESS; + } + else + { + position = Vector3.zero; + rotation = Quaternion.identity; + extent = Vector3.zero; + return PxrResult.ERROR_HANDLE_INVALID; + } + + } + else + { + position = Vector3.zero; + rotation = Quaternion.identity; + extent = Vector3.zero; + return PxrResult.ERROR_HANDLE_INVALID; + } + } + /// + /// Gets the information of a 2D box object. + /// + /// Specifies the handle of the scene anchor that the 2D box object is associated with. + /// Returns the offset of the 2D box object relative to the center of the scene anchor. + /// Returns the length and width of the 2D box object. + /// Refer to the `PxrResult` enumeration for details. + public static PxrResult GetSceneBox2DData(ulong anchorHandle, out Vector2 offset, out Vector2 extent) + { + if (PXR_Plugin.MixedReality.SceneAnchorData.TryGetValue(anchorHandle, out var data)) + { + if (data.types.Contains(PxrSceneComponentType.Box2D)) + { + offset = data.box2D.offset; + extent = data.box2D.extent.ToVector2(); + return PxrResult.SUCCESS; + } + else + { + offset = Vector2.zero; + extent = Vector2.zero; + return PxrResult.ERROR_HANDLE_INVALID; + } + } + else + { + offset = Vector2.zero; + extent = Vector2.zero; + return PxrResult.ERROR_HANDLE_INVALID; + } + } + + /// + /// Gets the semantic label of a scene anchor. + /// + /// Specifies the handle of the anchor to get semantic label for. + /// Returns the semantic label of the specified anchor. + /// Refer to the `PxrResult` enumeration for details. + public static PxrResult GetSceneSemanticLabel(ulong anchorHandle, out PxrSemanticLabel label) + { + if (PXR_Plugin.MixedReality.SceneAnchorData.TryGetValue(anchorHandle, out var data)) + { + label = data.label; + return PxrResult.SUCCESS; + } + else + { + label = PxrSemanticLabel.Unknown; + return PxrResult.ERROR_HANDLE_INVALID; + } + } + /// + /// Gets the information of a polygon object. + /// + /// Specifies the handle of the scene anchor that the polygon object is associated with. + /// Returns the array of vertices of the polygon object. + /// Refer to the `PxrResult` enumeration for details. + public static PxrResult GetScenePolygonData(ulong anchorHandle, out Vector2[] vertices) + { + if (PXR_Plugin.MixedReality.SceneAnchorData.TryGetValue(anchorHandle, out var data)) + { + if (data.types.Contains(PxrSceneComponentType.Polygon)) + { + vertices = data.polygon.vertices; + return PxrResult.SUCCESS; + } + else + { + vertices = Array.Empty(); + return PxrResult.ERROR_HANDLE_INVALID; + } + } + else + { + vertices = Array.Empty(); + return PxrResult.ERROR_HANDLE_INVALID; + } + } + + public static async Task<(PxrResult result, List meshInfos)> QueryMeshAnchorAsync(CancellationToken token = default) + { + return await Task.Run(() => + { + XrSenseDataQueryInfo info = new XrSenseDataQueryInfo() + { + type = XrStructureType.XR_TYPE_SENSE_DATA_QUERY_INFO, + filter = IntPtr.Zero + }; + var pxrResult = PXR_Plugin.MixedReality.UPxr_QuerySenseDataAsync(PXR_Plugin.MixedReality.UPxr_GetSpatialMeshProviderHandle(), ref info, + out var future); + if (pxrResult == PxrResult.SUCCESS) + { + while (true) + { + var pollResult = PXR_Plugin.MixedReality.UPxr_PollFuture(future, out var futureState); + if (pollResult == PxrResult.SUCCESS) + { + if (futureState == PxrFutureState.Ready) + { + var completeResult = + PXR_Plugin.MixedReality.UPxr_QuerySenseDataComplete(PXR_Plugin.MixedReality.UPxr_GetSpatialMeshProviderHandle(), future, + out var completion); + if (completeResult == PxrResult.SUCCESS) + { + if (completion.futureResult == PxrResult.SUCCESS) + { + var getResult = PXR_Plugin.MixedReality.UPxr_GetQueriedSenseData( + PXR_Plugin.MixedReality.UPxr_GetSpatialMeshProviderHandle(), completion.snapshotHandle, out var entityHandles); + if (getResult == PxrResult.SUCCESS) + { + var keysToRemove = PXR_Plugin.MixedReality.SpatialMeshData + .Where(pair => pair.Value.state == MeshChangeState.Removed) + .Select(pair => pair.Key) + .ToList(); + foreach (var key in keysToRemove) + { + PXR_Plugin.MixedReality.SpatialMeshData.Remove(key); + } + + var toBeRemove = new List(PXR_Plugin.MixedReality.meshAnchorLastData.Keys); + foreach (var e in entityHandles) + { + byte[] byteArray = new byte[16]; + BitConverter.GetBytes(e.uuid.value0).CopyTo(byteArray, 0); + BitConverter.GetBytes(e.uuid.value1).CopyTo(byteArray, 8); + Guid guid = new Guid(byteArray); + var item = new PxrSpatialMeshInfo() + { + uuid = guid, + }; + toBeRemove.Remove(guid); + + if (PXR_Plugin.MixedReality.meshAnchorLastData.TryGetValue(guid, out var lastTime)) + { + if (lastTime < e.time) + { + var result = PXR_Plugin.MixedReality.UPxr_GetSpatialMesh(completion.snapshotHandle, e.spatialEntity, + ref item); + if (result == PxrResult.SUCCESS) + { + item.state = MeshChangeState.Updated; + PXR_Plugin.MixedReality.SpatialMeshData[guid] = item; + } + + PXR_Plugin.MixedReality.meshAnchorLastData[guid] = e.time; + } + else + { + var tempMesh = PXR_Plugin.MixedReality.SpatialMeshData[guid]; + tempMesh.state = MeshChangeState.Unchanged; + PXR_Plugin.MixedReality.SpatialMeshData[guid] = tempMesh; + } + } + else + { + var result = PXR_Plugin.MixedReality.UPxr_GetSpatialMesh(completion.snapshotHandle, e.spatialEntity, + ref item); + if (result == PxrResult.SUCCESS) + { + item.state = MeshChangeState.Added; +#if UNITY_2021_1_OR_NEWER + PXR_Plugin.MixedReality.SpatialMeshData.TryAdd(guid, item); +#else + PXR_Plugin.MixedReality.SpatialMeshData.Add(guid, item); +#endif + } +#if UNITY_2021_1_OR_NEWER + PXR_Plugin.MixedReality.meshAnchorLastData.TryAdd(guid, e.time); +#else + PXR_Plugin.MixedReality.meshAnchorLastData.Add(guid, e.time); +#endif + } + } + + foreach (var m in toBeRemove) + { + PXR_Plugin.MixedReality.meshAnchorLastData.Remove(m); + PXR_Plugin.MixedReality.SpatialMeshData.Remove(m); + var removedMesh = new PxrSpatialMeshInfo() + { + uuid = m, + state = MeshChangeState.Removed + }; +#if UNITY_2021_1_OR_NEWER + PXR_Plugin.MixedReality.SpatialMeshData.TryAdd(m, removedMesh); +#else + PXR_Plugin.MixedReality.SpatialMeshData.Add(m, removedMesh); +#endif + } + + PXR_Plugin.MixedReality.UPxr_DestroySenseDataQueryResult(completion.snapshotHandle); + return (getResult, PXR_Plugin.MixedReality.SpatialMeshData.Values.ToList()); + } + else + { + PXR_Plugin.MixedReality.UPxr_DestroySenseDataQueryResult(completion.snapshotHandle); + return (getResult, new List()); + } + } + else + { + return (completion.futureResult, new List()); + } + } + else + { + return (completeResult, new List()); + } + } + } + else + { + return (pollResult, new List()); + } + } + } + else + { + return (pxrResult, new List()); + } + }, token); + } + + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_MixedReality.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_MixedReality.cs.meta new file mode 100644 index 0000000..ec0c946 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_MixedReality.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7b4c8a0079dc90a48b34d0456b0e8d26 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_SpatialMeshManager.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_SpatialMeshManager.cs new file mode 100644 index 0000000..b8a9b3f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_SpatialMeshManager.cs @@ -0,0 +1,296 @@ + using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using Unity.XR.OpenXR.Features.PICOSupport; +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.XR; + +namespace Unity.XR.PXR +{ + [DisallowMultipleComponent] + public class PXR_SpatialMeshManager : MonoBehaviour + { + public GameObject meshPrefab; + private Dictionary meshIDToGameobject; + private Dictionary spatialMeshNeedingDraw; + private Mesh mesh; + private XRMeshSubsystem subsystem; + static List s_SubsystemsReuse = new List(); + private int objectPoolMaxSize = 200; + private Queue meshObjectsPool; + private const float frameCount = 15.0f; + + /// + /// The drawing of the new spatial mesh is complete. + /// + public static Action MeshAdded; + + /// + /// The drawing the updated spatial mesh is complete. + /// + public static Action MeshUpdated; + + /// + /// The deletion of the disappeared spatial mesh is complete. + /// + public static Action MeshRemoved; + + void Start() + { + spatialMeshNeedingDraw = new Dictionary(); + meshIDToGameobject = new Dictionary(); + meshObjectsPool = new Queue(); + + InitializePool(); + } + + void Update() + { + GetXRMeshSubsystem(); + if (subsystem != null && subsystem.running) + { + DrawMesh(); + } + } + + void GetXRMeshSubsystem() + { + if (subsystem != null) + return; + SubsystemManager.GetSubsystems(s_SubsystemsReuse); + + if (s_SubsystemsReuse.Count == 0) + return; + + subsystem = s_SubsystemsReuse[0]; + + + PXR_PermissionRequest.RequestUserPermissionMR(Granted => + { + subsystem.Start(); + if (subsystem.running) + { + OpenXRExtensions.SpatialMeshDataUpdated += SpatialMeshDataUpdated; + } + }); + + } + + void OnEnable() + { + GetXRMeshSubsystem(); + } + + void OnDisable() + { + if (subsystem != null && subsystem.running) + subsystem.Stop(); + } + + private void InitializePool() + { + if (meshPrefab != null) + { + while (meshObjectsPool.Count < objectPoolMaxSize) + { + GameObject obj = Instantiate(meshPrefab); + obj.transform.SetParent(this.transform); + obj.SetActive(false); + meshObjectsPool.Enqueue(obj); + } + } + } + + private void DrawMesh() + { + if (meshPrefab != null) + { + StartCoroutine(ForeachLoopCoroutine()); + } + } + + private IEnumerator ForeachLoopCoroutine() + { + int totalWork = spatialMeshNeedingDraw.Count; + if (totalWork > 0 ) + { + var meshList = spatialMeshNeedingDraw.Values.ToList(); + int workPerFrame = Mathf.CeilToInt(totalWork / frameCount); + int currentIndex = 0; + + while (currentIndex < totalWork) + { + int workThisFrame = 0; + while (workThisFrame < workPerFrame && currentIndex < totalWork) + { + CreateMeshRoutine(meshList[currentIndex]); + currentIndex++; + workThisFrame++; + } + + yield return null; + } + } + } + + void SpatialMeshDataUpdated(List meshInfos) + { + for (int i = 0; i < meshInfos.Count; i++) + { + switch (meshInfos[i].state) + { + case MeshChangeState.Added: + { + spatialMeshNeedingDraw.Add(meshInfos[i].uuid, meshInfos[i]); + } + break; + case MeshChangeState.Updated: + { + if (!spatialMeshNeedingDraw.ContainsKey(meshInfos[i].uuid)) + { + spatialMeshNeedingDraw.Add(meshInfos[i].uuid, meshInfos[i]); + } + else + { + spatialMeshNeedingDraw[meshInfos[i].uuid] = meshInfos[i]; + } + } + break; + case MeshChangeState.Removed: + { + MeshRemoved?.Invoke(meshInfos[i].uuid); + + spatialMeshNeedingDraw.Remove(meshInfos[i].uuid); + GameObject removedGo; + if (meshIDToGameobject.TryGetValue(meshInfos[i].uuid, out removedGo)) + { + if (meshObjectsPool.Count < objectPoolMaxSize) + { + removedGo.SetActive(false); + meshObjectsPool.Enqueue(removedGo); + } + else + { + Destroy(removedGo); + } + meshIDToGameobject.Remove(meshInfos[i].uuid); + } + } + break; + case MeshChangeState.Unchanged: + { + spatialMeshNeedingDraw.Remove(meshInfos[i].uuid); + } + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + } + + private void CreateMeshRoutine(PxrSpatialMeshInfo block) + { + GameObject meshGameObject = GetOrCreateGameObject(block.uuid); + var meshFilter = meshGameObject.GetComponentInChildren(); + var meshCollider = meshGameObject.GetComponentInChildren(); + + if (meshFilter.mesh == null) + { + mesh = new Mesh(); + } + else + { + mesh = meshFilter.mesh; + mesh.Clear(); + } + Color[] normalizedColors = new Color[block.vertices.Length]; + for (int i = 0; i < block.vertices.Length; i++) + { + normalizedColors[i] = GetMeshColorBySemanticLabel(block.labels[i]); + } + mesh.SetVertices(block.vertices); + mesh.SetColors(normalizedColors); + mesh.SetTriangles(block.indices, 0); + meshFilter.mesh = mesh; + if (meshCollider != null) + { + meshCollider.sharedMesh = mesh; + } + meshGameObject.transform.position = block.position; + meshGameObject.transform.rotation = block.rotation; + + switch (block.state) + { + case MeshChangeState.Added: + { + MeshAdded?.Invoke(block.uuid, meshGameObject); + } + break; + case MeshChangeState.Updated: + { + MeshUpdated?.Invoke(block.uuid, meshGameObject); + } + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + GameObject CreateGameObject(Guid meshId) + { + GameObject meshObject = meshObjectsPool.Dequeue(); + meshObject.name = $"Mesh {meshId}"; + meshObject.SetActive(true); + return meshObject; + } + + GameObject GetOrCreateGameObject(Guid meshId) + { + GameObject go = null; + if (!meshIDToGameobject.TryGetValue(meshId, out go)) + { + go = CreateGameObject(meshId); + meshIDToGameobject[meshId] = go; + } + + return go; + } + + private Color GetMeshColorBySemanticLabel(PxrSemanticLabel label) + { + switch (label) + { + case PxrSemanticLabel.Unknown: + return Color.white; + case PxrSemanticLabel.Floor: + return Color.red; + case PxrSemanticLabel.Ceiling: + return Color.green; + case PxrSemanticLabel.Wall: + return Color.blue; + case PxrSemanticLabel.Door: + return Color.grey; + case PxrSemanticLabel.Window: + return Color.yellow; + case PxrSemanticLabel.Opening: + return Color.cyan; + case PxrSemanticLabel.Table: + return Color.magenta; + case PxrSemanticLabel.Sofa: + return Color.gray; + case PxrSemanticLabel.Chair: + return new Color(0.8f, 0.2f, 0.5f); + case PxrSemanticLabel.Human: + return new Color(0.8f, 0.2f, 0.6f); + default: + return Color.white; + } + } + } + +} + + diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_SpatialMeshManager.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_SpatialMeshManager.cs.meta new file mode 100644 index 0000000..8613816 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/MixedReality/PXR_SpatialMeshManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a9a7bfb0312c046479b565c21f977fec +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/OpenXRExtensions.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/OpenXRExtensions.cs new file mode 100644 index 0000000..93bb9e5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/OpenXRExtensions.cs @@ -0,0 +1,411 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using AOT; +using Unity.XR.PXR; +using UnityEditor; +using UnityEngine; +using UnityEngine.XR; +#if AR_FOUNDATION +using UnityEngine.XR.ARSubsystems; +#endif +using UnityEngine.XR.OpenXR.Features; +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif + + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ +#if UNITY_EDITOR + public class FeatureConfig + { + public const string OpenXrExtensionList = "XR_EXT_local_floor " + + "XR_FB_triangle_mesh " + + "XR_FB_composition_layer_alpha_blend " + + "XR_KHR_composition_layer_color_scale_bias " + + "XR_KHR_composition_layer_cylinder " + + "XR_KHR_composition_layer_equirect " + + "XR_KHR_composition_layer_cube"; + } + + [OpenXRFeature(UiName = "PICO OpenXR Features", + Desc = "PICO XR Features for OpenXR.", + Company = "PICO", + Version = "1.0.0", + BuildTargetGroups = new[] { BuildTargetGroup.Android }, + OpenxrExtensionStrings = FeatureConfig.OpenXrExtensionList, + FeatureId = featureId + )] +#endif + public class OpenXRExtensions : OpenXRFeature + { + public const string featureId = "com.unity.openxr.pico.features"; + private static ulong xrInstance = 0ul; + private static ulong xrSession = 0ul; + public static event Action SenseDataUpdated; + public static event Action SpatialAnchorDataUpdated; + public static event Action SceneAnchorDataUpdated; + + public static event Action SenseDataProviderStateChanged; + public static event Action> SpatialMeshDataUpdated; + + static bool isCoroutineRunning = false; + protected override bool OnInstanceCreate(ulong instance) + { + xrInstance = instance; + xrSession = 0ul; + return true; + } + + /// + protected override void OnSessionCreate(ulong xrSessionId) + { + xrSession = xrSessionId; + Initialize(xrGetInstanceProcAddr, xrInstance, xrSession); + Pxr_SetEventDataBufferCallBack(XrEventDataBufferFunction); + setColorSpace((int)QualitySettings.activeColorSpace); + base.OnSessionCreate(xrSessionId); + + } + + /// + protected override void OnInstanceDestroy(ulong xrInstance) + { + base.OnInstanceDestroy(xrInstance); + xrInstance = 0ul; + } + + // HookGetInstanceProcAddr + protected override IntPtr HookGetInstanceProcAddr(IntPtr func) + { + // return base.HookGetInstanceProcAddr(func); + return HookCreateInstance(func); + } + + /// + protected override void OnSessionDestroy(ulong xrSessionId) + { + base.OnSessionDestroy(xrSessionId); + xrSession = 0ul; + } + + protected override void OnAppSpaceChange(ulong xrSpace) + { + SpaceChange(xrSpace); + base.OnAppSpaceChange(xrSpace); + } + + public static int GetReferenceSpaceBoundsRect(XrReferenceSpaceType referenceSpace, ref XrExtent2Df extent2D) + { + return xrGetReferenceSpaceBoundsRect( + xrSession, referenceSpace, ref extent2D); + } + + public static XrReferenceSpaceType[] EnumerateReferenceSpaces() + { + UInt32 Output = 0; + XrReferenceSpaceType[] outSpaces = null; + xrEnumerateReferenceSpaces(xrSession, 0, ref Output, outSpaces); + if (Output <= 0) + { + return null; + } + + outSpaces = new XrReferenceSpaceType[Output]; + xrEnumerateReferenceSpaces(xrSession, Output, ref Output, outSpaces); + return outSpaces; + } + + public static void CreateLayerParam(PxrLayerParam layerParam) + { + PLog.i("POXR_CreateLayerParam() "); +#if UNITY_ANDROID && !UNITY_EDITOR + xrCreateLayerParam(layerParam); +#endif + } + + public static int GetLayerImageCount(int layerId, EyeType eye, ref UInt32 imageCount) + { + int result = 0; +#if UNITY_ANDROID && !UNITY_EDITOR + result = xrGetLayerImageCount(layerId, eye, ref imageCount); +#endif + PLog.i("GetLayerImageCount() layerId:" + layerId + " eye:" + eye + " imageCount:" + imageCount + + " result:" + result); + return result; + } + + public static void GetLayerImagePtr(int layerId, EyeType eye, int imageIndex, ref IntPtr image) + { +#if UNITY_ANDROID && !UNITY_EDITOR + xrGetLayerImagePtr(layerId, eye, imageIndex, ref image); +#endif + PLog.i("GetLayerImagePtr() layerId:" + layerId + " eye:" + eye + " imageIndex:" + imageIndex + " image:" + + image); + } + + public static void DestroyLayerByRender(int layerId) + { + PLog.i("DestroyLayerByRender() layerId:" + layerId); +#if UNITY_ANDROID && !UNITY_EDITOR + xrDestroyLayerByRender(layerId); +#endif + } + + public static bool SubmitLayerQuad(IntPtr ptr) + { + int result = 0; +#if UNITY_ANDROID && !UNITY_EDITOR + result = xrSubmitLayerQuad(ptr); +#endif + PLog.d("SubmitLayerQuad() ptr:" + ptr + " result:" + result); + return result == -8; + } + + public static bool SubmitLayerCylinder(IntPtr ptr) + { + int result = 0; +#if UNITY_ANDROID && !UNITY_EDITOR + result = xrSubmitLayerCylinder(ptr); +#endif + PLog.d("SubmitLayerCylinder() ptr:" + ptr + " result:" + result); + return result == -8; + } + + public static bool SubmitLayerEquirect(IntPtr ptr) + { + int result = 0; +#if UNITY_ANDROID && !UNITY_EDITOR + result = xrSubmitLayerEquirect(ptr); +#endif + PLog.d("SubmitLayerEquirect() ptr:" + ptr + " result:" + result); + return result == -8; + } + + public static bool SubmitLayerCube(IntPtr ptr) + { + int result = 0; +#if UNITY_ANDROID && !UNITY_EDITOR + result = xrSubmitLayerCube(ptr); +#endif + PLog.d("xrSubmitLayerCube() ptr:" + ptr + " result:" + result); + return result == -8; + } + + public static int GetLayerNextImageIndex(int layerId, ref int imageIndex) + { + int result = 0; +#if UNITY_ANDROID && !UNITY_EDITOR + result = xrGetLayerNextImageIndex(layerId, ref imageIndex); +#endif + PLog.d("GetLayerNextImageIndex() layerId:" + layerId + " imageIndex:" + imageIndex + " result:" + result); + return result; + } + + protected override void OnSystemChange(ulong xrSystem) + { + base.OnSystemChange(xrSystem); + SystemChange(xrSystem); + } + + public static float GetLocationHeight() + { + float height = 0; + getLocationHeight( ref height); + return height; + } + + public static int GetControllerType() + { + int type = 0; + Pxr_GetControllerType(ref type); + return type; + } + + [MonoPInvokeCallback(typeof(XrEventDataBufferCallBack))] + static void XrEventDataBufferFunction(ref XrEventDataBuffer eventDB) + { + int status, action; + PLog.i($"XrEventDataBufferFunction eventType={eventDB.type}"); + switch (eventDB.type) + { + case XrStructureType.XR_TYPE_EVENT_DATA_SENSE_DATA_PROVIDER_STATE_CHANGED: + { + if (SenseDataProviderStateChanged != null) + { + PxrEventSenseDataProviderStateChanged data = new PxrEventSenseDataProviderStateChanged() + { + providerHandle = BitConverter.ToUInt64(eventDB.data, 0), + newState = (PxrSenseDataProviderState)BitConverter.ToInt32(eventDB.data, 8), + }; + SenseDataProviderStateChanged(data); + } + break; + } + case XrStructureType.XR_TYPE_EVENT_DATA_SENSE_DATA_UPDATED: + { + ulong providerHandle = BitConverter.ToUInt64(eventDB.data, 0); + PLog.i($"providerHandle ={providerHandle}"); + if (SenseDataUpdated != null) + { + SenseDataUpdated(providerHandle); + } + + if (providerHandle == PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor)) + { + if (SpatialAnchorDataUpdated != null) + { + SpatialAnchorDataUpdated(); + } + } + + if (providerHandle == PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SceneCapture)) + { + if (SceneAnchorDataUpdated != null) + { + SceneAnchorDataUpdated(); + } + } + + if (providerHandle == PXR_Plugin.MixedReality.UPxr_GetSpatialMeshProviderHandle()) + { + if (!isCoroutineRunning) + { + QuerySpatialMeshAnchor(); + } + } + + break; + } + } + } + + + static async void QuerySpatialMeshAnchor() + { + isCoroutineRunning = true; + var task = await PXR_MixedReality.QueryMeshAnchorAsync(); + isCoroutineRunning = false; + var (result, meshInfos) = task; + for (int i = 0; i < meshInfos.Count; i++) + { + switch (meshInfos[i].state) + { + case MeshChangeState.Added: + case MeshChangeState.Updated: + { + PXR_Plugin.MixedReality.UPxr_AddOrUpdateMesh(meshInfos[i]); + } + break; + case MeshChangeState.Removed: + { + PXR_Plugin.MixedReality.UPxr_RemoveMesh(meshInfos[i].uuid); + } + break; + case MeshChangeState.Unchanged: + { + break; + } + } + } + + if (result == PxrResult.SUCCESS) + { + SpatialMeshDataUpdated?.Invoke(meshInfos); + } + } +#if AR_FOUNDATION + public bool isSessionSubsystem=true; + private static List sessionSubsystemDescriptors = new List(); + protected override void OnSubsystemCreate() + { + base.OnSubsystemCreate(); + if (isSessionSubsystem) + { + CreateSubsystem(sessionSubsystemDescriptors, PICOSessionSubsystem.k_SubsystemId); + } + } + protected override void OnSubsystemStart() + { + if (isSessionSubsystem) + { + StartSubsystem(); + } + } + protected override void OnSubsystemStop() + { + if (isSessionSubsystem) + { + StopSubsystem(); + } + } + protected override void OnSubsystemDestroy() + { + if (isSessionSubsystem) + { + DestroySubsystem(); + } + } +#endif + + const string extLib = "openxr_pico"; + + [DllImport(extLib, EntryPoint = "PICO_Initialize", CallingConvention = CallingConvention.Cdecl)] + private static extern void Initialize(IntPtr xrGetInstanceProcAddr, ulong xrInstance, ulong xrSession); + + [DllImport(extLib, EntryPoint = "PICO_HookCreateInstance", CallingConvention = CallingConvention.Cdecl)] + public static extern IntPtr HookCreateInstance(IntPtr func); + + [DllImport(extLib, EntryPoint = "PICO_OnAppSpaceChange", CallingConvention = CallingConvention.Cdecl)] + private static extern void SpaceChange(ulong xrSession); + [DllImport(extLib, EntryPoint = "PICO_OnSystemChange", CallingConvention = CallingConvention.Cdecl)] + public static extern void SystemChange(ulong xrSystem); + + [DllImport(extLib, EntryPoint = "PICO_xrEnumerateReferenceSpaces", CallingConvention = CallingConvention.Cdecl)] + private static extern int xrEnumerateReferenceSpaces(ulong xrSession, UInt32 CountInput, ref UInt32 CountOutput, + XrReferenceSpaceType[] Spaces); + + [DllImport(extLib, EntryPoint = "PICO_xrGetReferenceSpaceBoundsRect", CallingConvention = CallingConvention.Cdecl)] + private static extern int xrGetReferenceSpaceBoundsRect(ulong xrSession, XrReferenceSpaceType referenceSpace, + ref XrExtent2Df extent2D); + + [DllImport(extLib, EntryPoint = "PICO_CreateLayerParam", CallingConvention = CallingConvention.Cdecl)] + private static extern void xrCreateLayerParam(PxrLayerParam layerParam); + + [DllImport(extLib, EntryPoint = "PICO_GetLayerImageCount", CallingConvention = CallingConvention.Cdecl)] + private static extern int xrGetLayerImageCount(int layerId, EyeType eye, ref UInt32 imageCount); + + [DllImport(extLib, EntryPoint = "PICO_GetLayerImagePtr", CallingConvention = CallingConvention.Cdecl)] + public static extern void xrGetLayerImagePtr(int layerId, EyeType eye, int imageIndex, ref IntPtr image); + + [DllImport(extLib, EntryPoint = "PICO_DestroyLayerByRender", CallingConvention = CallingConvention.Cdecl)] + private static extern void xrDestroyLayerByRender(int layerId); + + [DllImport(extLib, EntryPoint = "PICO_SubmitLayerQuad", CallingConvention = CallingConvention.Cdecl)] + private static extern int xrSubmitLayerQuad(IntPtr ptr); + + [DllImport(extLib, EntryPoint = "PICO_SubmitLayerCylinder", CallingConvention = CallingConvention.Cdecl)] + private static extern int xrSubmitLayerCylinder(IntPtr ptr); + + [DllImport(extLib, EntryPoint = "PICO_SubmitLayerEquirect", CallingConvention = CallingConvention.Cdecl)] + private static extern int xrSubmitLayerEquirect(IntPtr ptr); + + [DllImport(extLib, EntryPoint = "PICO_SubmitLayerCube", CallingConvention = CallingConvention.Cdecl)] + private static extern int xrSubmitLayerCube(IntPtr ptr); + + [DllImport(extLib, EntryPoint = "PICO_GetLayerNextImageIndex", CallingConvention = CallingConvention.Cdecl)] + private static extern int xrGetLayerNextImageIndex(int layerId, ref int imageIndex); + + [DllImport(extLib, EntryPoint = "PICO_SetColorSpace", CallingConvention = CallingConvention.Cdecl)] + private static extern int setColorSpace(int colorSpace); + [DllImport(extLib, EntryPoint = "PICO_GetLocationHeight", CallingConvention = CallingConvention.Cdecl)] + private static extern XrResult getLocationHeight(ref float delaY); + [DllImport(extLib, EntryPoint = "PICO_SetMarkMode", CallingConvention = CallingConvention.Cdecl)] + public static extern void SetMarkMode(); + [DllImport(extLib, CallingConvention = CallingConvention.Cdecl)] + private static extern void Pxr_GetControllerType(ref int type); + [DllImport(extLib, CallingConvention = CallingConvention.Cdecl)] + private static extern void Pxr_SetEventDataBufferCallBack(XrEventDataBufferCallBack callback); + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/OpenXRExtensions.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/OpenXRExtensions.cs.meta new file mode 100644 index 0000000..15e7c1f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/OpenXRExtensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 077bca9897b444788c83491c066a79b1 +timeCreated: 1689921014 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO.meta new file mode 100644 index 0000000..3a7f669 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 97367776cd8a48ddb9070381398beda6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSceneCapture.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSceneCapture.cs new file mode 100644 index 0000000..afceaf9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSceneCapture.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using Unity.XR.CoreUtils; +using Unity.XR.PXR; +using UnityEditor; +using UnityEngine; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; +using Object = UnityEngine.Object; + +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif + + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ +#if UNITY_EDITOR + [OpenXRFeature(UiName = "PICO Scene Capture", + Hidden = false, + BuildTargetGroups = new[] { UnityEditor.BuildTargetGroup.Android }, + Company = "PICO", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + FeatureId = featureId)] +#endif + public class PICOSceneCapture: OpenXRFeature + { + public const string featureId = "com.pico.openxr.feature.scenecapture"; + public const string extensionString = "XR_PICO_scene_capture XR_PICO_spatial_sensing XR_EXT_future"; + public static bool isEnable => OpenXRRuntime.IsExtensionEnabled("XR_PICO_scene_capture"); + protected override void OnSessionCreate(ulong xrSession) + { + base.OnSessionCreate(xrSession); + PXR_Plugin.MixedReality.UPxr_CreateSceneCaptureSenseDataProvider(); + } + + protected override void OnSessionExiting(ulong xrSession) + { + PXR_MixedReality.GetSenseDataProviderState(PxrSenseDataProviderType.SceneCapture, out var providerState); + if (providerState == PxrSenseDataProviderState.Running) + { + PXR_MixedReality.StopSenseDataProvider(PxrSenseDataProviderType.SceneCapture); + } + + PXR_Plugin.MixedReality.UPxr_DestroySenseDataProvider( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SceneCapture)); + + base.OnSessionExiting(xrSession); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSceneCapture.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSceneCapture.cs.meta new file mode 100644 index 0000000..274aa80 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSceneCapture.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a0b5403262c64d5888bf5672e1e1f3bb +timeCreated: 1721806849 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialAnchor.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialAnchor.cs new file mode 100644 index 0000000..cd2200f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialAnchor.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using Unity.XR.CoreUtils; +using Unity.XR.PXR; +using UnityEditor; +using UnityEngine; +#if AR_FOUNDATION +using UnityEngine.XR.ARSubsystems; +#endif +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; +using Object = UnityEngine.Object; + +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif + + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ +#if UNITY_EDITOR + [OpenXRFeature(UiName = "PICO Spatial Anchor", + Hidden = false, + BuildTargetGroups = new[] { UnityEditor.BuildTargetGroup.Android }, + Company = "PICO", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + FeatureId = featureId)] +#endif + public class PICOSpatialAnchor: OpenXRFeature + { + public const string featureId = "com.pico.openxr.feature.spatialanchor"; + public const string extensionString = "XR_PICO_spatial_anchor XR_PICO_spatial_sensing XR_EXT_future"; + + public static bool isEnable => OpenXRRuntime.IsExtensionEnabled("XR_PICO_spatial_anchor"); + + protected override void OnSessionCreate(ulong xrSession) + { + base.OnSessionCreate(xrSession); + PXR_Plugin.MixedReality.UPxr_CreateSpatialAnchorSenseDataProvider(); + } + protected override void OnSessionExiting(ulong xrSession) + { + PXR_MixedReality.GetSenseDataProviderState(PxrSenseDataProviderType.SpatialAnchor, out var providerState); + if (providerState == PxrSenseDataProviderState.Running) + { + PXR_MixedReality.StopSenseDataProvider(PxrSenseDataProviderType.SpatialAnchor); + } + + PXR_Plugin.MixedReality.UPxr_DestroySenseDataProvider( + PXR_Plugin.MixedReality.UPxr_GetSenseDataProviderHandle(PxrSenseDataProviderType.SpatialAnchor)); + + base.OnSessionExiting(xrSession); + } + +#if AR_FOUNDATION + public bool isAnchorSubsystem=true; + static List anchorSubsystemDescriptors = new List(); + protected override void OnSubsystemCreate() + { + base.OnSubsystemCreate(); + if (isAnchorSubsystem) + { + CreateSubsystem( + anchorSubsystemDescriptors, + PICOAnchorSubsystem.k_SubsystemId); + } + + } + protected override void OnSubsystemStart() + { + if (isAnchorSubsystem) + { + StartSubsystem(); + } + } + protected override void OnSubsystemStop() + { + if (isAnchorSubsystem) + { + StopSubsystem(); + } + } + protected override void OnSubsystemDestroy() + { + if (isAnchorSubsystem) + { + DestroySubsystem(); + } + } +#endif + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialAnchor.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialAnchor.cs.meta new file mode 100644 index 0000000..f0042da --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialAnchor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a8b7731b990240c0b289e41fb880787b +timeCreated: 1721806849 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialMesh.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialMesh.cs new file mode 100644 index 0000000..f1b4172 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialMesh.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using Unity.XR.CoreUtils; +using Unity.XR.PXR; +using UnityEditor; +using UnityEngine; +using UnityEngine.XR; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; +using Object = UnityEngine.Object; + +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif + + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ +#if UNITY_EDITOR + [OpenXRFeature(UiName = "PICO Spatial Mesh", + Hidden = false, + BuildTargetGroups = new[] { UnityEditor.BuildTargetGroup.Android }, + Company = "PICO", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + FeatureId = featureId)] +#endif + public class PICOSpatialMesh: OpenXRFeature + { + public const string featureId = "com.pico.openxr.feature.spatialmesh"; + public const string extensionString = "XR_PICO_spatial_mesh XR_PICO_spatial_sensing XR_EXT_future"; + private static List meshSubsystemDescriptors = new List(); + + public PxrMeshLod LOD; + + private XRMeshSubsystem subsystem; + public static bool isEnable => OpenXRRuntime.IsExtensionEnabled("XR_PICO_spatial_mesh"); + protected override void OnSubsystemCreate() + { + base.OnSubsystemCreate(); + PXR_Plugin.MixedReality.Pxr_SetMeshLOD(Convert.ToUInt16(LOD)); + + } + + protected override void OnSessionCreate(ulong xrSession) + { + base.OnSessionCreate(xrSession); + CreateSubsystem(meshSubsystemDescriptors, "PICO Mesh"); + } + + protected override void OnSubsystemStop() + { + base.OnSubsystemStop(); + StopSubsystem(); + + } + + protected override void OnSubsystemDestroy() + { + base.OnSubsystemDestroy(); + PXR_Plugin.MixedReality.UPxr_DisposeMesh(); + DestroySubsystem(); + } + + + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialMesh.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialMesh.cs.meta new file mode 100644 index 0000000..00beae0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PICO/PICOSpatialMesh.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b1248416ce414cd0a788c5240bec5766 +timeCreated: 1721806849 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughFeature.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughFeature.cs new file mode 100644 index 0000000..c11a016 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughFeature.cs @@ -0,0 +1,532 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; +using Unity.XR.CoreUtils; +using UnityEditor; +using UnityEngine; + +#if AR_FOUNDATION +using UnityEngine.XR.ARSubsystems; +#endif +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; +using Object = UnityEngine.Object; + +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ +#if UNITY_EDITOR + [OpenXRFeature(UiName = "OpenXR Passthrough", + Hidden = false, + BuildTargetGroups = new[] { UnityEditor.BuildTargetGroup.Android }, + Company = "PICO", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + FeatureId = featureId)] +#endif + public class PassthroughFeature : OpenXRFeatureBase + { + public const string featureId = "com.pico.openxr.feature.passthrough"; + public const string extensionString = "XR_FB_passthrough"; + public static bool isExtensionEnable = false; + public const int XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB = 256; + private static byte[] colorData; + private static uint Size = 0; + private static bool isInit = false; + private static bool isPause = false; + private static int _enableVideoSeeThrough=-1; + public static event Action EnableVideoSeeThroughAction; + [HideInInspector] + public static bool EnableVideoSeeThrough + { + get => _enableVideoSeeThrough==1; + set + { + if (value) + { + if (_enableVideoSeeThrough != 1) + { + _enableVideoSeeThrough = 1; + EnableSeeThroughManual(value); + + if (EnableVideoSeeThroughAction != null) + { + EnableVideoSeeThroughAction(value); + } + } + } + else + { + if (_enableVideoSeeThrough == 1) + { + _enableVideoSeeThrough = 0; + EnableSeeThroughManual(value); + + if (EnableVideoSeeThroughAction != null) + { + EnableVideoSeeThroughAction(value); + } + } + } + } + } + public override void Initialize(IntPtr intPtr) + { + isExtensionEnable = _isExtensionEnable; + initialize(intPtr, xrInstance); + } + + public override string GetExtensionString() + { + return extensionString; + } + + public static void PassthroughStart() + { + passthroughStart(); + isPause = false; + } + + public static void PassthroughPause() + { + passthroughPause(); + isPause = true; + } + + public static bool EnableSeeThroughManual(bool value) + { + if (!isExtensionEnable) + { + return false; + } + + if (!isInit) + { + isInit = initializePassthrough(); + } + + if (value) + { + createFullScreenLayer(); + if (!isPause) + { + passthroughStart(); + } + } + else + { + passthroughPause(); + } + + return true; + } + + public static void Destroy() + { + if (!isExtensionEnable) + { + return; + } + + Passthrough_Destroy(); + } + + private void OnDestroy() + { + Destroy(); + } + + private static void AllocateColorMapData(uint size) + { + if (colorData != null && size != colorData.Length) + { + Clear(); + } + + if (colorData == null) + { + colorData = new byte[size]; + } + } + + private static void Clear() + { + if (colorData != null) + { + colorData = null; + } + } + + private static void WriteVector3ToColorMap(int colorIndex, ref Vector3 color) + { + for (int c = 0; c < 3; c++) + { + byte[] bytes = BitConverter.GetBytes(color[c]); + Buffer.BlockCopy(bytes, 0, colorData, colorIndex * 12 + c * 4, 4); + } + } + + private static void WriteFloatToColorMap(int index, float value) + { + byte[] bytes = BitConverter.GetBytes(value); + Buffer.BlockCopy(bytes, 0, colorData, index * sizeof(float), sizeof(float)); + } + + private static void WriteColorToColorMap(int colorIndex, ref Color color) + { + for (int c = 0; c < 4; c++) + { + byte[] bytes = BitConverter.GetBytes(color[c]); + Buffer.BlockCopy(bytes, 0, colorData, colorIndex * 16 + c * 4, 4); + } + } + + + public static unsafe void SetBrightnessContrastSaturation(ref PassthroughStyle style, float brightness = 0.0f, + float contrast = 0.0f, float saturation = 0.0f) + { + style.enableColorMap = true; + style.TextureColorMapType = PassthroughColorMapType.BrightnessContrastSaturation; + Size = 3 * sizeof(float); + AllocateColorMapData(Size); + WriteFloatToColorMap(0, brightness); + + WriteFloatToColorMap(1, contrast); + + WriteFloatToColorMap(2, saturation); + fixed (byte* p = colorData) + { + style.TextureColorMapData = (IntPtr)p; + } + + style.TextureColorMapDataSize = Size; + StringBuilder str = new StringBuilder(); + for (int i = 0; i < Size; i++) + { + str.Append(colorData[i]); + } + + Debug.Log("SetPassthroughStyle SetBrightnessContrastSaturation colorData:" + str); + } + + public static unsafe void SetColorMapbyMonoToMono(ref PassthroughStyle style, int[] values) + { + if (values.Length != XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB) + throw new ArgumentException("Must provide exactly 256 values"); + style.enableColorMap = true; + style.TextureColorMapType = PassthroughColorMapType.MonoToMono; + Size = XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB * 4; + AllocateColorMapData(Size); + Buffer.BlockCopy(values, 0, colorData, 0, (int)Size); + + fixed (byte* p = colorData) + { + style.TextureColorMapData = (IntPtr)p; + } + + style.TextureColorMapDataSize = Size; + } + + public static unsafe void SetColorMapbyMonoToRgba(ref PassthroughStyle style, Color[] values) + { + if (values.Length != XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB) + throw new ArgumentException("Must provide exactly 256 colors"); + + style.TextureColorMapType = PassthroughColorMapType.MonoToRgba; + style.enableColorMap = true; + Size = XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB * 4 * 4; + + AllocateColorMapData(Size); + + for (int i = 0; i < XR_PASSTHROUGH_COLOR_MAP_MONO_SIZE_FB; i++) + { + WriteColorToColorMap(i, ref values[i]); + } + + fixed (byte* p = colorData) + { + style.TextureColorMapData = (IntPtr)p; + } + + style.TextureColorMapDataSize = Size; + } + + public static _PassthroughStyle ToPassthroughStyle(PassthroughStyle c) + { + _PassthroughStyle mPassthroughStyle = new _PassthroughStyle(); + mPassthroughStyle.enableEdgeColor = (uint)(c.enableEdgeColor ? 1 : 0); + mPassthroughStyle.enableColorMap = (uint)(c.enableColorMap ? 1 : 0); + mPassthroughStyle.TextureOpacityFactor = c.TextureOpacityFactor; + mPassthroughStyle.TextureColorMapType = c.TextureColorMapType; + mPassthroughStyle.TextureColorMapDataSize = c.TextureColorMapDataSize; + mPassthroughStyle.TextureColorMapData = c.TextureColorMapData; + mPassthroughStyle.EdgeColor = new Colorf() + { r = c.EdgeColor.r, g = c.EdgeColor.g, b = c.EdgeColor.b, a = c.EdgeColor.a }; + return mPassthroughStyle; + } + + public static void SetPassthroughStyle(PassthroughStyle style) + { + setPassthroughStyle(ToPassthroughStyle(style)); + } + + public static bool IsPassthroughSupported() + { + return isPassthroughSupported(); + } + + + public static unsafe bool CreateTriangleMesh(int id, Vector3[] vertices, int[] triangles, + GeometryInstanceTransform transform) + { + if (vertices == null || triangles == null || vertices.Length == 0 || triangles.Length == 0) + { + return false; + } + + if (!isInit) + { + isInit = initializePassthrough(); + } + + int vertexCount = vertices.Length; + int triangleCount = triangles.Length; + + Size = (uint)vertexCount * 3 * 4; + + AllocateColorMapData(Size); + + for (int i = 0; i < vertexCount; i++) + { + WriteVector3ToColorMap(i, ref vertices[i]); + } + + IntPtr vertexDataPtr = IntPtr.Zero; + + fixed (byte* p = colorData) + { + vertexDataPtr = (IntPtr)p; + } + + StringBuilder str = new StringBuilder(); + for (int i = 0; i < 3 * 4; i++) + { + str.Append(colorData[i]); + } + + Debug.Log("CreateTriangleMesh vertexDataPtr colorData:" + str); + str.Clear(); + + Size = (uint)triangleCount * 4; + AllocateColorMapData(Size); + Buffer.BlockCopy(triangles, 0, colorData, 0, (int)Size); + IntPtr triangleDataPtr = IntPtr.Zero; + fixed (byte* p = colorData) + { + triangleDataPtr = (IntPtr)p; + } + + for (int i = 0; i < colorData.Length; i++) + { + str.Append(colorData[i]); + } + + // Debug.Log("CreateTriangleMesh triangleDataPtr colorData:" + str); + // + // Debug.Log("CreateTriangleMesh vertexDataPtr=" + vertexDataPtr + " vertexCount=" + vertexCount); + // Debug.Log("CreateTriangleMesh triangleDataPtr=" + triangleDataPtr + " triangleCount=" + triangleCount); + + XrResult result = + createTriangleMesh(id, vertexDataPtr, vertexCount, triangleDataPtr, triangleCount, transform); + Clear(); + if (result == XrResult.Success) + { + return true; + } + + return false; + } + + public static void UpdateMeshTransform(int id, GeometryInstanceTransform transform) + { + updatePassthroughMeshTransform(id, transform); + } + +#if UNITY_EDITOR + /// + /// Validation Rules for ARCameraFeature. + /// + protected override void GetValidationChecks(List rules, BuildTargetGroup targetGroup) + { + var AdditionalRules = new ValidationRule[] + { + new ValidationRule(this) + { + message = "Passthrough requires Camera clear flags set to solid color with alpha value zero.", + checkPredicate = () => + { + + var xrOrigin = FindObjectsOfType(); + + if (xrOrigin != null && xrOrigin.Length > 0) + { + if (!xrOrigin[0].enabled) return true; + } + else + { + return true; + } + + var camera = xrOrigin[0].Camera; + if (camera == null) return true; + + return camera.clearFlags == CameraClearFlags.SolidColor && Mathf.Approximately(camera.backgroundColor.a, 0); + }, + fixItAutomatic = true, + fixItMessage = "Set your XR Origin camera's Clear Flags to solid color with alpha value zero.", + fixIt = () => + { + var xrOrigin = FindObjectsOfType(); + if (xrOrigin!=null&&xrOrigin.Length>0) + { + if (xrOrigin[0].enabled) + { + var camera = xrOrigin[0].Camera; + if (camera != null ) + { + camera.clearFlags = CameraClearFlags.SolidColor; + Color clearColor = camera.backgroundColor; + clearColor.a = 0; + camera.backgroundColor = clearColor; + } + } + } + + }, + error = false + } + }; + + rules.AddRange(AdditionalRules); + } +#endif + +#if AR_FOUNDATION + public bool isCameraSubsystem=true; + static List s_CameraDescriptors = new List(); + protected override void OnSubsystemCreate() + { + base.OnSubsystemCreate(); + if (isCameraSubsystem) + { + CreateSubsystem( + s_CameraDescriptors, + PICOCameraSubsystem.k_SubsystemId); + } + + } + protected override void OnSubsystemStart() + { + if (isCameraSubsystem) + { + StartSubsystem(); + } + } + protected override void OnSubsystemStop() + { + if (isCameraSubsystem) + { + StopSubsystem(); + } + } + protected override void OnSubsystemDestroy() + { + if (isCameraSubsystem) + { + DestroySubsystem(); + } + } + +#endif + protected override void OnSessionStateChange(int oldState, int newState) + { + base.OnSessionStateChange(oldState, newState); + if (newState == 1) + { +#if AR_FOUNDATION + if (isCameraSubsystem) + { + StopSubsystem(); + }else{ + if (_enableVideoSeeThrough!=-1) + { + EnableSeeThroughManual(false); + } + } +#else + if (_enableVideoSeeThrough!=-1) + { + EnableSeeThroughManual(false); + } +#endif + } + else if (newState == 5) + { +#if AR_FOUNDATION + if (isCameraSubsystem) + { + StartSubsystem(); + }else{ + if (_enableVideoSeeThrough!=-1) + { + EnableSeeThroughManual(EnableVideoSeeThrough); + } + } +#else + if (_enableVideoSeeThrough!=-1) + { + EnableSeeThroughManual(EnableVideoSeeThrough); + } + +#endif + } + } + private const string ExtLib = "openxr_pico"; + + [DllImport(ExtLib, EntryPoint = "PICO_initialize_Passthrough", CallingConvention = CallingConvention.Cdecl)] + private static extern void initialize(IntPtr xrGetInstanceProcAddr, ulong xrInstance); + + [DllImport(ExtLib, EntryPoint = "PICO_InitializePassthrough", CallingConvention = CallingConvention.Cdecl)] + private static extern bool initializePassthrough(); + + [DllImport(ExtLib, EntryPoint = "PICO_CreateFullScreenLayer", CallingConvention = CallingConvention.Cdecl)] + private static extern bool createFullScreenLayer(); + + [DllImport(ExtLib, EntryPoint = "PICO_PassthroughStart", CallingConvention = CallingConvention.Cdecl)] + private static extern void passthroughStart(); + + [DllImport(ExtLib, EntryPoint = "PICO_PassthroughPause", CallingConvention = CallingConvention.Cdecl)] + private static extern void passthroughPause(); + + [DllImport(ExtLib, EntryPoint = "PICO_SetPassthroughStyle", CallingConvention = CallingConvention.Cdecl)] + private static extern void setPassthroughStyle(_PassthroughStyle style); + + [DllImport(ExtLib, EntryPoint = "PICO_IsPassthroughSupported", CallingConvention = CallingConvention.Cdecl)] + private static extern bool isPassthroughSupported(); + + [DllImport(ExtLib, EntryPoint = "PICO_Passthrough_Destroy", CallingConvention = CallingConvention.Cdecl)] + private static extern void Passthrough_Destroy(); + + [DllImport(ExtLib, EntryPoint = "PICO_CreateTriangleMesh", CallingConvention = CallingConvention.Cdecl)] + private static extern XrResult createTriangleMesh(int id, IntPtr vertices, int vertexCount, IntPtr triangles, + int triangleCount, GeometryInstanceTransform transform); + + [DllImport(ExtLib, EntryPoint = "PICO_UpdatePassthroughMeshTransform", + CallingConvention = CallingConvention.Cdecl)] + private static extern void updatePassthroughMeshTransform(int id, GeometryInstanceTransform transform); + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughFeature.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughFeature.cs.meta new file mode 100644 index 0000000..79d04a5 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughFeature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7d49168b6dfb469dadf8cd56e4ab8884 +timeCreated: 1689933482 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughLayerFeature.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughLayerFeature.cs new file mode 100644 index 0000000..e566208 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughLayerFeature.cs @@ -0,0 +1,81 @@ +using System; +using UnityEngine; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public class PassthroughLayerFeature : LayerBase + { + private int id = 0; + private Vector3[] vertices; + private int[] triangles; + private Mesh mesh; + private bool isPassthroughSupported = false; + private bool isCreateTriangleMesh = false; + + private void Awake() + { + base.Awake(); + id = ID; + Debug.Log("AAA:"+this.gameObject.name+" ID="+id); + } + + private void Start() + { + MeshFilter meshFilter = this.gameObject.GetComponent(); + if (meshFilter == null) + { + Debug.LogError("Passthrough GameObject does not have a mesh component."); + return; + } + + mesh = meshFilter.sharedMesh; + vertices = mesh.vertices; + triangles = mesh.triangles; + isPassthroughSupported = PassthroughFeature.IsPassthroughSupported(); + } + + private void Update() + { + if (isPassthroughSupported && !isCreateTriangleMesh) + { + GeometryInstanceTransform Transform = new GeometryInstanceTransform(); + UpdateCoords(); + GetCurrentTransform(ref Transform); + isCreateTriangleMesh = PassthroughFeature.CreateTriangleMesh(id, vertices, triangles, Transform); + } + } + + private void OnEnable() + { + Camera.onPostRender += OnPostRenderCallBack; + } + + private void OnDisable() + { + Camera.onPostRender -= OnPostRenderCallBack; + } + + + private void OnPostRenderCallBack(Camera cam) + { + GeometryInstanceTransform Transform = new GeometryInstanceTransform(); + UpdateCoords(); + GetCurrentTransform(ref Transform); + PassthroughFeature.UpdateMeshTransform(id, Transform); + } + + void OnApplicationPause(bool pause) + { + if (pause) + { + PassthroughFeature.PassthroughPause(); + } + else + { + PassthroughFeature.PassthroughStart(); + } + } + + + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughLayerFeature.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughLayerFeature.cs.meta new file mode 100644 index 0000000..87ea2aa --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PassthroughLayerFeature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8853b182e1e842fbb91b68c168d5b587 +timeCreated: 1694522562 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PerformanceSettingsFeature.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PerformanceSettingsFeature.cs new file mode 100644 index 0000000..8159416 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PerformanceSettingsFeature.cs @@ -0,0 +1,113 @@ +using System; +using System.Runtime.InteropServices; +using AOT; +using UnityEngine; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; + +#if UNITY_EDITOR +using UnityEditor.XR.OpenXR.Features; +#endif + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public enum XrPerfSettingsDomainEXT + { + XR_PERF_SETTINGS_DOMAIN_CPU_EXT = 1, + XR_PERF_SETTINGS_DOMAIN_GPU_EXT = 2, + } + + public 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, + } + + public 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, + } + + public 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, + } +#if UNITY_EDITOR + [OpenXRFeature(UiName = "OpenXR Performance Settings", + Hidden = false, + BuildTargetGroups = new[] { UnityEditor.BuildTargetGroup.Android }, + Company = "PICO", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + FeatureId = featureId)] +#endif + + public class PerformanceSettingsFeature : OpenXRFeatureBase + { + public const string featureId = "com.pico.openxr.feature.performancesettings"; + public const string extensionString = "XR_EXT_performance_settings"; + public static bool isExtensionEnable = false; + + private static Action mCallback; + + public delegate void EventDelegate(XrPerfSettingsDomainEXT domain, XrPerfSettingsSubDomainEXT subDomain, + XrPerfSettingsNotificationLevelEXT fromLevel, + XrPerfSettingsNotificationLevelEXT toLevel); + + public override void Initialize(IntPtr intPtr) + { + isExtensionEnable = _isExtensionEnable; + initialize(intPtr, xrInstance, EventFromCpp); + } + + + [MonoPInvokeCallback(typeof(EventDelegate))] + public static void EventFromCpp(XrPerfSettingsDomainEXT domain, XrPerfSettingsSubDomainEXT subDomain, + XrPerfSettingsNotificationLevelEXT fromLevel, + XrPerfSettingsNotificationLevelEXT toLevel) + { + if (mCallback != null) + { + mCallback(domain, subDomain, fromLevel, toLevel); + } + } + + public override string GetExtensionString() + { + return extensionString; + } + + public static XrResult XrPerfSettingsSetPerformanceLevelEXT(XrPerfSettingsDomainEXT domain, + XrPerfSettingsLevelEXT level) + { + return xrPerfSettingsSetPerformanceLevelEXT(xrSession, domain, level); + } + + + public static void AddPerfSettingsSetPerformanceEvent( + Action callback) + { + mCallback = callback; + } + + private const string ExtLib = "openxr_pico"; + + [DllImport(ExtLib, EntryPoint = "PICO_initialize_PerformanceSettings", + CallingConvention = CallingConvention.Cdecl)] + private static extern void initialize(IntPtr xrGetInstanceProcAddr, ulong xrInstance, + EventDelegate eventDelegate); + + [DllImport(ExtLib, EntryPoint = "PICO_xrPerfSettingsSetPerformanceLevelEXT", + CallingConvention = CallingConvention.Cdecl)] + private static extern XrResult xrPerfSettingsSetPerformanceLevelEXT(ulong xrSession, + XrPerfSettingsDomainEXT domain, XrPerfSettingsLevelEXT level); + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PerformanceSettingsFeature.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PerformanceSettingsFeature.cs.meta new file mode 100644 index 0000000..ab56a96 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/PerformanceSettingsFeature.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 48a4218836ed47e2b2fe51c7c56925c7 +timeCreated: 1695634496 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils.meta new file mode 100644 index 0000000..6987216 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: eef38826347e4f57aadf5fa0a9a299cd +timeCreated: 1687328262 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LayerBase.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LayerBase.cs new file mode 100644 index 0000000..148f956 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LayerBase.cs @@ -0,0 +1,108 @@ +using System; +using UnityEngine; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public class LayerBase : MonoBehaviour + { + public static int ID = 0; + private Transform overlayTransform; + private Camera[] overlayEyeCamera = new Camera[2]; + private Camera xrRig; + private Matrix4x4[] mvMatrixs = new Matrix4x4[2]; + private Vector3[] modelScales = new Vector3[2]; + private Vector3[] modelTranslations = new Vector3[2]; + private Quaternion[] modelRotations = new Quaternion[2]; + private Quaternion[] cameraRotations = new Quaternion[2]; + private Vector3[] cameraTranslations = new Vector3[2]; + + public void Awake() + { + ID++; + xrRig = Camera.main; + overlayEyeCamera[0] = xrRig; + overlayEyeCamera[1] = xrRig; + overlayTransform = GetComponent(); +#if UNITY_ANDROID && !UNITY_EDITOR + if (overlayTransform != null) + { + MeshRenderer render = overlayTransform.GetComponent(); + if (render != null) + { + render.enabled = false; + } + } +#endif + } + private void OnDestroy() + { + ID--; + } + public void UpdateCoords() + { + if (null == overlayTransform || !overlayTransform.gameObject.activeSelf || null == overlayEyeCamera[0] || + null == overlayEyeCamera[1]) + { + return; + } + + for (int i = 0; i < mvMatrixs.Length; i++) + { + mvMatrixs[i] = overlayEyeCamera[i].worldToCameraMatrix * overlayTransform.localToWorldMatrix; + if (overlayTransform is RectTransform uiTransform) + { + var rect = uiTransform.rect; + var lossyScale = overlayTransform.lossyScale; + modelScales[i] = new Vector3(rect.width * lossyScale.x, + rect.height * lossyScale.y, 1); + modelTranslations[i] = uiTransform.TransformPoint(rect.center); + } + else + { + modelScales[i] = overlayTransform.lossyScale; + modelTranslations[i] = overlayTransform.position; + } + + modelRotations[i] = overlayTransform.rotation; + cameraRotations[i] = overlayEyeCamera[i].transform.rotation; + cameraTranslations[i] = overlayEyeCamera[i].transform.position; + } + } + + public void GetCurrentTransform(ref GeometryInstanceTransform geometryInstanceTransform) + { + Quaternion quaternion = new Quaternion(modelRotations[0].x, + modelRotations[0].y, modelRotations[0].z, + modelRotations[0].w); + Vector3 cameraPos = Vector3.zero; + Quaternion cameraRot = Quaternion.identity; + Transform origin = null; + bool ret = PICOManager.Instance.GetOrigin(ref cameraPos, ref cameraRot, ref origin); + if (!ret) + { + return; + } + + Quaternion lQuaternion = new Quaternion(-cameraRot.x, -cameraRot.y, -cameraRot.z, cameraRot.w); + Vector3 pos = new Vector3(modelTranslations[0].x - cameraPos.x, + modelTranslations[0].y - PICOManager.Instance.getCameraYOffset() + + PICOManager.Instance.GetOriginY() - cameraPos.y, modelTranslations[0].z - cameraPos.z); + + quaternion *= lQuaternion; + origin.rotation *= lQuaternion; + pos = origin.TransformPoint(pos); + + geometryInstanceTransform.pose.position.x = pos.x; + geometryInstanceTransform.pose.position.y = pos.y; + geometryInstanceTransform.pose.position.z = -pos.z; + geometryInstanceTransform.pose.orientation.x = -quaternion.x; + geometryInstanceTransform.pose.orientation.y = -quaternion.y; + geometryInstanceTransform.pose.orientation.z = quaternion.z; + geometryInstanceTransform.pose.orientation.w = quaternion.w; + + geometryInstanceTransform.scale.x = modelScales[0].x; + geometryInstanceTransform.scale.y = modelScales[0].y; + geometryInstanceTransform.scale.z = 1; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LayerBase.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LayerBase.cs.meta new file mode 100644 index 0000000..2243b92 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LayerBase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 619cbe0f286043ec9552bc759e03b9d7 +timeCreated: 1695197751 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson.meta new file mode 100644 index 0000000..bdc22f9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2e80d58020bdd4b42b9c135992067180 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/IJsonWrapper.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/IJsonWrapper.cs new file mode 100644 index 0000000..9b7e2d1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/IJsonWrapper.cs @@ -0,0 +1,60 @@ +#region Header +/** + * IJsonWrapper.cs + * Interface that represents a type capable of handling all kinds of JSON + * data. This is mainly used when mapping objects through JsonMapper, and + * it's implemented by JsonData. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System.Collections; +using System.Collections.Specialized; + + +namespace LitJson +{ + public enum JsonType + { + None, + + Object, + Array, + String, + Int, + Long, + Double, + Boolean + } + + public interface IJsonWrapper : IList, IOrderedDictionary + { + bool IsArray { get; } + bool IsBoolean { get; } + bool IsDouble { get; } + bool IsInt { get; } + bool IsLong { get; } + bool IsObject { get; } + bool IsString { get; } + + bool GetBoolean (); + double GetDouble (); + int GetInt (); + JsonType GetJsonType (); + long GetLong (); + string GetString (); + + void SetBoolean (bool val); + void SetDouble (double val); + void SetInt (int val); + void SetJsonType (JsonType type); + void SetLong (long val); + void SetString (string val); + + string ToJson (); + void ToJson (JsonWriter writer); + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/IJsonWrapper.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/IJsonWrapper.cs.meta new file mode 100644 index 0000000..7e456d6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/IJsonWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e1ef0f496c0fb5146b7aa4877024fa79 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonData.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonData.cs new file mode 100644 index 0000000..e89e4b1 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonData.cs @@ -0,0 +1,1059 @@ +#region Header +/** + * JsonData.cs + * Generic type to hold JSON data (objects, arrays, and so on). This is + * the default type returned by JsonMapper.ToObject(). + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; + + +namespace LitJson +{ + public class JsonData : IJsonWrapper, IEquatable + { + #region Fields + private IList inst_array; + private bool inst_boolean; + private double inst_double; + private int inst_int; + private long inst_long; + private IDictionary inst_object; + private string inst_string; + private string json; + private JsonType type; + + // Used to implement the IOrderedDictionary interface + private IList> object_list; + #endregion + + + #region Properties + public int Count { + get { return EnsureCollection ().Count; } + } + + public bool IsArray { + get { return type == JsonType.Array; } + } + + public bool IsBoolean { + get { return type == JsonType.Boolean; } + } + + public bool IsDouble { + get { return type == JsonType.Double; } + } + + public bool IsInt { + get { return type == JsonType.Int; } + } + + public bool IsLong { + get { return type == JsonType.Long; } + } + + public bool IsObject { + get { return type == JsonType.Object; } + } + + public bool IsString { + get { return type == JsonType.String; } + } + + public ICollection Keys { + get { EnsureDictionary (); return inst_object.Keys; } + } + + /// + /// Determines whether the json contains an element that has the specified key. + /// + /// The key to locate in the json. + /// true if the json contains an element that has the specified key; otherwise, false. + public Boolean ContainsKey(String key) { + EnsureDictionary(); + return this.inst_object.Keys.Contains(key); + } + #endregion + + + #region ICollection Properties + int ICollection.Count { + get { + return Count; + } + } + + bool ICollection.IsSynchronized { + get { + return EnsureCollection ().IsSynchronized; + } + } + + object ICollection.SyncRoot { + get { + return EnsureCollection ().SyncRoot; + } + } + #endregion + + + #region IDictionary Properties + bool IDictionary.IsFixedSize { + get { + return EnsureDictionary ().IsFixedSize; + } + } + + bool IDictionary.IsReadOnly { + get { + return EnsureDictionary ().IsReadOnly; + } + } + + ICollection IDictionary.Keys { + get { + EnsureDictionary (); + IList keys = new List (); + + foreach (KeyValuePair entry in + object_list) { + keys.Add (entry.Key); + } + + return (ICollection) keys; + } + } + + ICollection IDictionary.Values { + get { + EnsureDictionary (); + IList values = new List (); + + foreach (KeyValuePair entry in + object_list) { + values.Add (entry.Value); + } + + return (ICollection) values; + } + } + #endregion + + + + #region IJsonWrapper Properties + bool IJsonWrapper.IsArray { + get { return IsArray; } + } + + bool IJsonWrapper.IsBoolean { + get { return IsBoolean; } + } + + bool IJsonWrapper.IsDouble { + get { return IsDouble; } + } + + bool IJsonWrapper.IsInt { + get { return IsInt; } + } + + bool IJsonWrapper.IsLong { + get { return IsLong; } + } + + bool IJsonWrapper.IsObject { + get { return IsObject; } + } + + bool IJsonWrapper.IsString { + get { return IsString; } + } + #endregion + + + #region IList Properties + bool IList.IsFixedSize { + get { + return EnsureList ().IsFixedSize; + } + } + + bool IList.IsReadOnly { + get { + return EnsureList ().IsReadOnly; + } + } + #endregion + + + #region IDictionary Indexer + object IDictionary.this[object key] { + get { + return EnsureDictionary ()[key]; + } + + set { + if (! (key is String)) + throw new ArgumentException ( + "The key has to be a string"); + + JsonData data = ToJsonData (value); + + this[(string) key] = data; + } + } + #endregion + + + #region IOrderedDictionary Indexer + object IOrderedDictionary.this[int idx] { + get { + EnsureDictionary (); + return object_list[idx].Value; + } + + set { + EnsureDictionary (); + JsonData data = ToJsonData (value); + + KeyValuePair old_entry = object_list[idx]; + + inst_object[old_entry.Key] = data; + + KeyValuePair entry = + new KeyValuePair (old_entry.Key, data); + + object_list[idx] = entry; + } + } + #endregion + + + #region IList Indexer + object IList.this[int index] { + get { + return EnsureList ()[index]; + } + + set { + EnsureList (); + JsonData data = ToJsonData (value); + + this[index] = data; + } + } + #endregion + + + #region Public Indexers + public JsonData this[string prop_name] { + get { + EnsureDictionary (); + return inst_object[prop_name]; + } + + set { + EnsureDictionary (); + + KeyValuePair entry = + new KeyValuePair (prop_name, value); + + if (inst_object.ContainsKey (prop_name)) { + for (int i = 0; i < object_list.Count; i++) { + if (object_list[i].Key == prop_name) { + object_list[i] = entry; + break; + } + } + } else + object_list.Add (entry); + + inst_object[prop_name] = value; + + json = null; + } + } + + public JsonData this[int index] { + get { + EnsureCollection (); + + if (type == JsonType.Array) + return inst_array[index]; + + return object_list[index].Value; + } + + set { + EnsureCollection (); + + if (type == JsonType.Array) + inst_array[index] = value; + else { + KeyValuePair entry = object_list[index]; + KeyValuePair new_entry = + new KeyValuePair (entry.Key, value); + + object_list[index] = new_entry; + inst_object[entry.Key] = value; + } + + json = null; + } + } + #endregion + + + #region Constructors + public JsonData () + { + } + + public JsonData (bool boolean) + { + type = JsonType.Boolean; + inst_boolean = boolean; + } + + public JsonData (double number) + { + type = JsonType.Double; + inst_double = number; + } + + public JsonData (int number) + { + type = JsonType.Int; + inst_int = number; + } + + public JsonData (long number) + { + type = JsonType.Long; + inst_long = number; + } + + public JsonData (object obj) + { + if (obj is Boolean) { + type = JsonType.Boolean; + inst_boolean = (bool) obj; + return; + } + + if (obj is Double) { + type = JsonType.Double; + inst_double = (double) obj; + return; + } + + if (obj is Int32) { + type = JsonType.Int; + inst_int = (int) obj; + return; + } + + if (obj is Int64) { + type = JsonType.Long; + inst_long = (long) obj; + return; + } + + if (obj is String) { + type = JsonType.String; + inst_string = (string) obj; + return; + } + + throw new ArgumentException ( + "Unable to wrap the given object with JsonData"); + } + + public JsonData (string str) + { + type = JsonType.String; + inst_string = str; + } + #endregion + + + #region Implicit Conversions + public static implicit operator JsonData (Boolean data) + { + return new JsonData (data); + } + + public static implicit operator JsonData (Double data) + { + return new JsonData (data); + } + + public static implicit operator JsonData (Int32 data) + { + return new JsonData (data); + } + + public static implicit operator JsonData (Int64 data) + { + return new JsonData (data); + } + + public static implicit operator JsonData (String data) + { + return new JsonData (data); + } + #endregion + + + #region Explicit Conversions + public static explicit operator Boolean (JsonData data) + { + if (data.type != JsonType.Boolean) + throw new InvalidCastException ( + "Instance of JsonData doesn't hold a double"); + + return data.inst_boolean; + } + + public static explicit operator Double (JsonData data) + { + if (data.type != JsonType.Double) + throw new InvalidCastException ( + "Instance of JsonData doesn't hold a double"); + + return data.inst_double; + } + + public static explicit operator Int32(JsonData data) + { + if (data.type != JsonType.Int && data.type != JsonType.Long) + { + throw new InvalidCastException( + "Instance of JsonData doesn't hold an int"); + } + + // cast may truncate data... but that's up to the user to consider + return data.type == JsonType.Int ? data.inst_int : (int)data.inst_long; + } + + public static explicit operator Int64(JsonData data) + { + if (data.type != JsonType.Long && data.type != JsonType.Int) + { + throw new InvalidCastException( + "Instance of JsonData doesn't hold a long"); + } + + return data.type == JsonType.Long ? data.inst_long : data.inst_int; + } + + public static explicit operator String (JsonData data) + { + if (data.type != JsonType.String) + throw new InvalidCastException ( + "Instance of JsonData doesn't hold a string"); + + return data.inst_string; + } + #endregion + + + #region ICollection Methods + void ICollection.CopyTo (Array array, int index) + { + EnsureCollection ().CopyTo (array, index); + } + #endregion + + + #region IDictionary Methods + void IDictionary.Add (object key, object value) + { + JsonData data = ToJsonData (value); + + EnsureDictionary ().Add (key, data); + + KeyValuePair entry = + new KeyValuePair ((string) key, data); + object_list.Add (entry); + + json = null; + } + + void IDictionary.Clear () + { + EnsureDictionary ().Clear (); + object_list.Clear (); + json = null; + } + + bool IDictionary.Contains (object key) + { + return EnsureDictionary ().Contains (key); + } + + IDictionaryEnumerator IDictionary.GetEnumerator () + { + return ((IOrderedDictionary) this).GetEnumerator (); + } + + void IDictionary.Remove (object key) + { + EnsureDictionary ().Remove (key); + + for (int i = 0; i < object_list.Count; i++) { + if (object_list[i].Key == (string) key) { + object_list.RemoveAt (i); + break; + } + } + + json = null; + } + #endregion + + + #region IEnumerable Methods + IEnumerator IEnumerable.GetEnumerator () + { + return EnsureCollection ().GetEnumerator (); + } + #endregion + + + #region IJsonWrapper Methods + bool IJsonWrapper.GetBoolean () + { + if (type != JsonType.Boolean) + throw new InvalidOperationException ( + "JsonData instance doesn't hold a boolean"); + + return inst_boolean; + } + + double IJsonWrapper.GetDouble () + { + if (type != JsonType.Double) + throw new InvalidOperationException ( + "JsonData instance doesn't hold a double"); + + return inst_double; + } + + int IJsonWrapper.GetInt () + { + if (type != JsonType.Int) + throw new InvalidOperationException ( + "JsonData instance doesn't hold an int"); + + return inst_int; + } + + long IJsonWrapper.GetLong () + { + if (type != JsonType.Long) + throw new InvalidOperationException ( + "JsonData instance doesn't hold a long"); + + return inst_long; + } + + string IJsonWrapper.GetString () + { + if (type != JsonType.String) + throw new InvalidOperationException ( + "JsonData instance doesn't hold a string"); + + return inst_string; + } + + void IJsonWrapper.SetBoolean (bool val) + { + type = JsonType.Boolean; + inst_boolean = val; + json = null; + } + + void IJsonWrapper.SetDouble (double val) + { + type = JsonType.Double; + inst_double = val; + json = null; + } + + void IJsonWrapper.SetInt (int val) + { + type = JsonType.Int; + inst_int = val; + json = null; + } + + void IJsonWrapper.SetLong (long val) + { + type = JsonType.Long; + inst_long = val; + json = null; + } + + void IJsonWrapper.SetString (string val) + { + type = JsonType.String; + inst_string = val; + json = null; + } + + string IJsonWrapper.ToJson () + { + return ToJson (); + } + + void IJsonWrapper.ToJson (JsonWriter writer) + { + ToJson (writer); + } + #endregion + + + #region IList Methods + int IList.Add (object value) + { + return Add (value); + } + + void IList.Clear () + { + EnsureList ().Clear (); + json = null; + } + + bool IList.Contains (object value) + { + return EnsureList ().Contains (value); + } + + int IList.IndexOf (object value) + { + return EnsureList ().IndexOf (value); + } + + void IList.Insert (int index, object value) + { + EnsureList ().Insert (index, value); + json = null; + } + + void IList.Remove (object value) + { + EnsureList ().Remove (value); + json = null; + } + + void IList.RemoveAt (int index) + { + EnsureList ().RemoveAt (index); + json = null; + } + #endregion + + + #region IOrderedDictionary Methods + IDictionaryEnumerator IOrderedDictionary.GetEnumerator () + { + EnsureDictionary (); + + return new OrderedDictionaryEnumerator ( + object_list.GetEnumerator ()); + } + + void IOrderedDictionary.Insert (int idx, object key, object value) + { + string property = (string) key; + JsonData data = ToJsonData (value); + + this[property] = data; + + KeyValuePair entry = + new KeyValuePair (property, data); + + object_list.Insert (idx, entry); + } + + void IOrderedDictionary.RemoveAt (int idx) + { + EnsureDictionary (); + + inst_object.Remove (object_list[idx].Key); + object_list.RemoveAt (idx); + } + #endregion + + + #region Private Methods + private ICollection EnsureCollection () + { + if (type == JsonType.Array) + return (ICollection) inst_array; + + if (type == JsonType.Object) + return (ICollection) inst_object; + + throw new InvalidOperationException ( + "The JsonData instance has to be initialized first"); + } + + private IDictionary EnsureDictionary () + { + if (type == JsonType.Object) + return (IDictionary) inst_object; + + if (type != JsonType.None) + throw new InvalidOperationException ( + "Instance of JsonData is not a dictionary"); + + type = JsonType.Object; + inst_object = new Dictionary (); + object_list = new List> (); + + return (IDictionary) inst_object; + } + + private IList EnsureList () + { + if (type == JsonType.Array) + return (IList) inst_array; + + if (type != JsonType.None) + throw new InvalidOperationException ( + "Instance of JsonData is not a list"); + + type = JsonType.Array; + inst_array = new List (); + + return (IList) inst_array; + } + + private JsonData ToJsonData (object obj) + { + if (obj == null) + return null; + + if (obj is JsonData) + return (JsonData) obj; + + return new JsonData (obj); + } + + private static void WriteJson (IJsonWrapper obj, JsonWriter writer) + { + if (obj == null) { + writer.Write (null); + return; + } + + if (obj.IsString) { + writer.Write (obj.GetString ()); + return; + } + + if (obj.IsBoolean) { + writer.Write (obj.GetBoolean ()); + return; + } + + if (obj.IsDouble) { + writer.Write (obj.GetDouble ()); + return; + } + + if (obj.IsInt) { + writer.Write (obj.GetInt ()); + return; + } + + if (obj.IsLong) { + writer.Write (obj.GetLong ()); + return; + } + + if (obj.IsArray) { + writer.WriteArrayStart (); + foreach (object elem in (IList) obj) + WriteJson ((JsonData) elem, writer); + writer.WriteArrayEnd (); + + return; + } + + if (obj.IsObject) { + writer.WriteObjectStart (); + + foreach (DictionaryEntry entry in ((IDictionary) obj)) { + writer.WritePropertyName ((string) entry.Key); + WriteJson ((JsonData) entry.Value, writer); + } + writer.WriteObjectEnd (); + + return; + } + } + #endregion + + + public int Add (object value) + { + JsonData data = ToJsonData (value); + + json = null; + + return EnsureList ().Add (data); + } + + public bool Remove(object obj) + { + json = null; + if(IsObject) + { + JsonData value = null; + if (inst_object.TryGetValue((string)obj, out value)) + return inst_object.Remove((string)obj) && object_list.Remove(new KeyValuePair((string)obj, value)); + else + throw new KeyNotFoundException("The specified key was not found in the JsonData object."); + } + if(IsArray) + { + return inst_array.Remove(ToJsonData(obj)); + } + throw new InvalidOperationException ( + "Instance of JsonData is not an object or a list."); + } + + public void Clear () + { + if (IsObject) { + ((IDictionary) this).Clear (); + return; + } + + if (IsArray) { + ((IList) this).Clear (); + return; + } + } + + public bool Equals (JsonData x) + { + if (x == null) + return false; + + if (x.type != this.type) + { + // further check to see if this is a long to int comparison + if ((x.type != JsonType.Int && x.type != JsonType.Long) + || (this.type != JsonType.Int && this.type != JsonType.Long)) + { + return false; + } + } + + switch (this.type) { + case JsonType.None: + return true; + + case JsonType.Object: + return this.inst_object.Equals (x.inst_object); + + case JsonType.Array: + return this.inst_array.Equals (x.inst_array); + + case JsonType.String: + return this.inst_string.Equals (x.inst_string); + + case JsonType.Int: + { + if (x.IsLong) + { + if (x.inst_long < Int32.MinValue || x.inst_long > Int32.MaxValue) + return false; + return this.inst_int.Equals((int)x.inst_long); + } + return this.inst_int.Equals(x.inst_int); + } + + case JsonType.Long: + { + if (x.IsInt) + { + if (this.inst_long < Int32.MinValue || this.inst_long > Int32.MaxValue) + return false; + return x.inst_int.Equals((int)this.inst_long); + } + return this.inst_long.Equals(x.inst_long); + } + + case JsonType.Double: + return this.inst_double.Equals (x.inst_double); + + case JsonType.Boolean: + return this.inst_boolean.Equals (x.inst_boolean); + } + + return false; + } + + public JsonType GetJsonType () + { + return type; + } + + public void SetJsonType (JsonType type) + { + if (this.type == type) + return; + + switch (type) { + case JsonType.None: + break; + + case JsonType.Object: + inst_object = new Dictionary (); + object_list = new List> (); + break; + + case JsonType.Array: + inst_array = new List (); + break; + + case JsonType.String: + inst_string = default (String); + break; + + case JsonType.Int: + inst_int = default (Int32); + break; + + case JsonType.Long: + inst_long = default (Int64); + break; + + case JsonType.Double: + inst_double = default (Double); + break; + + case JsonType.Boolean: + inst_boolean = default (Boolean); + break; + } + + this.type = type; + } + + public string ToJson () + { + if (json != null) + return json; + + StringWriter sw = new StringWriter (); + JsonWriter writer = new JsonWriter (sw); + writer.Validate = false; + + WriteJson (this, writer); + json = sw.ToString (); + + return json; + } + + public void ToJson (JsonWriter writer) + { + bool old_validate = writer.Validate; + + writer.Validate = false; + + WriteJson (this, writer); + + writer.Validate = old_validate; + } + + public override string ToString () + { + switch (type) { + case JsonType.Array: + return "JsonData array"; + + case JsonType.Boolean: + return inst_boolean.ToString (); + + case JsonType.Double: + return inst_double.ToString (); + + case JsonType.Int: + return inst_int.ToString (); + + case JsonType.Long: + return inst_long.ToString (); + + case JsonType.Object: + return "JsonData object"; + + case JsonType.String: + return inst_string; + } + + return "Uninitialized JsonData"; + } + } + + + internal class OrderedDictionaryEnumerator : IDictionaryEnumerator + { + IEnumerator> list_enumerator; + + + public object Current { + get { return Entry; } + } + + public DictionaryEntry Entry { + get { + KeyValuePair curr = list_enumerator.Current; + return new DictionaryEntry (curr.Key, curr.Value); + } + } + + public object Key { + get { return list_enumerator.Current.Key; } + } + + public object Value { + get { return list_enumerator.Current.Value; } + } + + + public OrderedDictionaryEnumerator ( + IEnumerator> enumerator) + { + list_enumerator = enumerator; + } + + + public bool MoveNext () + { + return list_enumerator.MoveNext (); + } + + public void Reset () + { + list_enumerator.Reset (); + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonData.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonData.cs.meta new file mode 100644 index 0000000..b8940a8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d3ae25b6b7cd44b40a54c07476a52456 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonException.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonException.cs new file mode 100644 index 0000000..4efd890 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonException.cs @@ -0,0 +1,65 @@ +#region Header +/** + * JsonException.cs + * Base class throwed by LitJSON when a parsing error occurs. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; + + +namespace LitJson +{ + public class JsonException : +#if NETSTANDARD1_5 + Exception +#else + ApplicationException +#endif + { + public JsonException () : base () + { + } + + internal JsonException (ParserToken token) : + base (String.Format ( + "Invalid token '{0}' in input string", token)) + { + } + + internal JsonException (ParserToken token, + Exception inner_exception) : + base (String.Format ( + "Invalid token '{0}' in input string", token), + inner_exception) + { + } + + internal JsonException (int c) : + base (String.Format ( + "Invalid character '{0}' in input string", (char) c)) + { + } + + internal JsonException (int c, Exception inner_exception) : + base (String.Format ( + "Invalid character '{0}' in input string", (char) c), + inner_exception) + { + } + + + public JsonException (string message) : base (message) + { + } + + public JsonException (string message, Exception inner_exception) : + base (message, inner_exception) + { + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonException.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonException.cs.meta new file mode 100644 index 0000000..b6b7b41 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 81e400e6b0dcff7418936a822864e3a6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMapper.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMapper.cs new file mode 100644 index 0000000..99946cf --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMapper.cs @@ -0,0 +1,987 @@ +#region Header +/** + * JsonMapper.cs + * JSON to .Net object and object to JSON conversions. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Reflection; + + +namespace LitJson +{ + internal struct PropertyMetadata + { + public MemberInfo Info; + public bool IsField; + public Type Type; + } + + + internal struct ArrayMetadata + { + private Type element_type; + private bool is_array; + private bool is_list; + + + public Type ElementType { + get { + if (element_type == null) + return typeof (JsonData); + + return element_type; + } + + set { element_type = value; } + } + + public bool IsArray { + get { return is_array; } + set { is_array = value; } + } + + public bool IsList { + get { return is_list; } + set { is_list = value; } + } + } + + + internal struct ObjectMetadata + { + private Type element_type; + private bool is_dictionary; + + private IDictionary properties; + + + public Type ElementType { + get { + if (element_type == null) + return typeof (JsonData); + + return element_type; + } + + set { element_type = value; } + } + + public bool IsDictionary { + get { return is_dictionary; } + set { is_dictionary = value; } + } + + public IDictionary Properties { + get { return properties; } + set { properties = value; } + } + } + + + internal delegate void ExporterFunc (object obj, JsonWriter writer); + public delegate void ExporterFunc (T obj, JsonWriter writer); + + internal delegate object ImporterFunc (object input); + public delegate TValue ImporterFunc (TJson input); + + public delegate IJsonWrapper WrapperFactory (); + + + public class JsonMapper + { + #region Fields + private static readonly int max_nesting_depth; + + private static readonly IFormatProvider datetime_format; + + private static readonly IDictionary base_exporters_table; + private static readonly IDictionary custom_exporters_table; + + private static readonly IDictionary> base_importers_table; + private static readonly IDictionary> custom_importers_table; + + private static readonly IDictionary array_metadata; + private static readonly object array_metadata_lock = new Object (); + + private static readonly IDictionary> conv_ops; + private static readonly object conv_ops_lock = new Object (); + + private static readonly IDictionary object_metadata; + private static readonly object object_metadata_lock = new Object (); + + private static readonly IDictionary> type_properties; + private static readonly object type_properties_lock = new Object (); + + private static readonly JsonWriter static_writer; + private static readonly object static_writer_lock = new Object (); + #endregion + + + #region Constructors + static JsonMapper () + { + max_nesting_depth = 100; + + array_metadata = new Dictionary (); + conv_ops = new Dictionary> (); + object_metadata = new Dictionary (); + type_properties = new Dictionary> (); + + static_writer = new JsonWriter (); + + datetime_format = DateTimeFormatInfo.InvariantInfo; + + base_exporters_table = new Dictionary (); + custom_exporters_table = new Dictionary (); + + base_importers_table = new Dictionary> (); + custom_importers_table = new Dictionary> (); + + RegisterBaseExporters (); + RegisterBaseImporters (); + } + #endregion + + + #region Private Methods + private static void AddArrayMetadata (Type type) + { + if (array_metadata.ContainsKey (type)) + return; + + ArrayMetadata data = new ArrayMetadata (); + + data.IsArray = type.IsArray; + + if (type.GetInterface ("System.Collections.IList") != null) + data.IsList = true; + + foreach (PropertyInfo p_info in type.GetProperties ()) { + if (p_info.Name != "Item") + continue; + + ParameterInfo[] parameters = p_info.GetIndexParameters (); + + if (parameters.Length != 1) + continue; + + if (parameters[0].ParameterType == typeof (int)) + data.ElementType = p_info.PropertyType; + } + + lock (array_metadata_lock) { + try { + array_metadata.Add (type, data); + } catch (ArgumentException) { + return; + } + } + } + + private static void AddObjectMetadata (Type type) + { + if (object_metadata.ContainsKey (type)) + return; + + ObjectMetadata data = new ObjectMetadata (); + + if (type.GetInterface ("System.Collections.IDictionary") != null) + data.IsDictionary = true; + + data.Properties = new Dictionary (); + + foreach (PropertyInfo p_info in type.GetProperties ()) { + if (p_info.Name == "Item") { + ParameterInfo[] parameters = p_info.GetIndexParameters (); + + if (parameters.Length != 1) + continue; + + if (parameters[0].ParameterType == typeof (string)) + data.ElementType = p_info.PropertyType; + + continue; + } + + PropertyMetadata p_data = new PropertyMetadata (); + p_data.Info = p_info; + p_data.Type = p_info.PropertyType; + + data.Properties.Add (p_info.Name, p_data); + } + + foreach (FieldInfo f_info in type.GetFields ()) { + PropertyMetadata p_data = new PropertyMetadata (); + p_data.Info = f_info; + p_data.IsField = true; + p_data.Type = f_info.FieldType; + + data.Properties.Add (f_info.Name, p_data); + } + + lock (object_metadata_lock) { + try { + object_metadata.Add (type, data); + } catch (ArgumentException) { + return; + } + } + } + + private static void AddTypeProperties (Type type) + { + if (type_properties.ContainsKey (type)) + return; + + IList props = new List (); + + foreach (PropertyInfo p_info in type.GetProperties ()) { + if (p_info.Name == "Item") + continue; + + PropertyMetadata p_data = new PropertyMetadata (); + p_data.Info = p_info; + p_data.IsField = false; + props.Add (p_data); + } + + foreach (FieldInfo f_info in type.GetFields ()) { + PropertyMetadata p_data = new PropertyMetadata (); + p_data.Info = f_info; + p_data.IsField = true; + + props.Add (p_data); + } + + lock (type_properties_lock) { + try { + type_properties.Add (type, props); + } catch (ArgumentException) { + return; + } + } + } + + private static MethodInfo GetConvOp (Type t1, Type t2) + { + lock (conv_ops_lock) { + if (! conv_ops.ContainsKey (t1)) + conv_ops.Add (t1, new Dictionary ()); + } + + if (conv_ops[t1].ContainsKey (t2)) + return conv_ops[t1][t2]; + + MethodInfo op = t1.GetMethod ( + "op_Implicit", new Type[] { t2 }); + + lock (conv_ops_lock) { + try { + conv_ops[t1].Add (t2, op); + } catch (ArgumentException) { + return conv_ops[t1][t2]; + } + } + + return op; + } + + private static object ReadValue (Type inst_type, JsonReader reader) + { + reader.Read (); + + if (reader.Token == JsonToken.ArrayEnd) + return null; + + Type underlying_type = Nullable.GetUnderlyingType(inst_type); + Type value_type = underlying_type ?? inst_type; + + if (reader.Token == JsonToken.Null) { + #if NETSTANDARD1_5 + if (inst_type.IsClass() || underlying_type != null) { + return null; + } + #else + if (inst_type.IsClass || underlying_type != null) { + return null; + } + #endif + + throw new JsonException (String.Format ( + "Can't assign null to an instance of type {0}", + inst_type)); + } + + if (reader.Token == JsonToken.Double || + reader.Token == JsonToken.Int || + reader.Token == JsonToken.Long || + reader.Token == JsonToken.String || + reader.Token == JsonToken.Boolean) { + + Type json_type = reader.Value.GetType (); + + if (value_type.IsAssignableFrom (json_type)) + return reader.Value; + + // If there's a custom importer that fits, use it + if (custom_importers_table.ContainsKey (json_type) && + custom_importers_table[json_type].ContainsKey ( + value_type)) { + + ImporterFunc importer = + custom_importers_table[json_type][value_type]; + + return importer (reader.Value); + } + + // Maybe there's a base importer that works + if (base_importers_table.ContainsKey (json_type) && + base_importers_table[json_type].ContainsKey ( + value_type)) { + + ImporterFunc importer = + base_importers_table[json_type][value_type]; + + return importer (reader.Value); + } + + // Maybe it's an enum + #if NETSTANDARD1_5 + if (value_type.IsEnum()) + return Enum.ToObject (value_type, reader.Value); + #else + if (value_type.IsEnum) + return Enum.ToObject (value_type, reader.Value); + #endif + // Try using an implicit conversion operator + MethodInfo conv_op = GetConvOp (value_type, json_type); + + if (conv_op != null) + return conv_op.Invoke (null, + new object[] { reader.Value }); + + // No luck + throw new JsonException (String.Format ( + "Can't assign value '{0}' (type {1}) to type {2}", + reader.Value, json_type, inst_type)); + } + + object instance = null; + + if (reader.Token == JsonToken.ArrayStart) { + + AddArrayMetadata (inst_type); + ArrayMetadata t_data = array_metadata[inst_type]; + + if (! t_data.IsArray && ! t_data.IsList) + throw new JsonException (String.Format ( + "Type {0} can't act as an array", + inst_type)); + + IList list; + Type elem_type; + + if (! t_data.IsArray) { + list = (IList) Activator.CreateInstance (inst_type); + elem_type = t_data.ElementType; + } else { + list = new ArrayList (); + elem_type = inst_type.GetElementType (); + } + + list.Clear(); + + while (true) { + object item = ReadValue (elem_type, reader); + if (item == null && reader.Token == JsonToken.ArrayEnd) + break; + + list.Add (item); + } + + if (t_data.IsArray) { + int n = list.Count; + instance = Array.CreateInstance (elem_type, n); + + for (int i = 0; i < n; i++) + ((Array) instance).SetValue (list[i], i); + } else + instance = list; + + } else if (reader.Token == JsonToken.ObjectStart) { + AddObjectMetadata (value_type); + ObjectMetadata t_data = object_metadata[value_type]; + + instance = Activator.CreateInstance (value_type); + + while (true) { + reader.Read (); + + if (reader.Token == JsonToken.ObjectEnd) + break; + + string property = (string) reader.Value; + + if (t_data.Properties.ContainsKey (property)) { + PropertyMetadata prop_data = + t_data.Properties[property]; + + if (prop_data.IsField) { + ((FieldInfo) prop_data.Info).SetValue ( + instance, ReadValue (prop_data.Type, reader)); + } else { + PropertyInfo p_info = + (PropertyInfo) prop_data.Info; + + if (p_info.CanWrite) + p_info.SetValue ( + instance, + ReadValue (prop_data.Type, reader), + null); + else + ReadValue (prop_data.Type, reader); + } + + } else { + if (! t_data.IsDictionary) { + + if (! reader.SkipNonMembers) { + throw new JsonException (String.Format ( + "The type {0} doesn't have the " + + "property '{1}'", + inst_type, property)); + } else { + ReadSkip (reader); + continue; + } + } + + ((IDictionary) instance).Add ( + property, ReadValue ( + t_data.ElementType, reader)); + } + + } + + } + + return instance; + } + + private static IJsonWrapper ReadValue (WrapperFactory factory, + JsonReader reader) + { + reader.Read (); + + if (reader.Token == JsonToken.ArrayEnd || + reader.Token == JsonToken.Null) + return null; + + IJsonWrapper instance = factory (); + + if (reader.Token == JsonToken.String) { + instance.SetString ((string) reader.Value); + return instance; + } + + if (reader.Token == JsonToken.Double) { + instance.SetDouble ((double) reader.Value); + return instance; + } + + if (reader.Token == JsonToken.Int) { + instance.SetInt ((int) reader.Value); + return instance; + } + + if (reader.Token == JsonToken.Long) { + instance.SetLong ((long) reader.Value); + return instance; + } + + if (reader.Token == JsonToken.Boolean) { + instance.SetBoolean ((bool) reader.Value); + return instance; + } + + if (reader.Token == JsonToken.ArrayStart) { + instance.SetJsonType (JsonType.Array); + + while (true) { + IJsonWrapper item = ReadValue (factory, reader); + if (item == null && reader.Token == JsonToken.ArrayEnd) + break; + + ((IList) instance).Add (item); + } + } + else if (reader.Token == JsonToken.ObjectStart) { + instance.SetJsonType (JsonType.Object); + + while (true) { + reader.Read (); + + if (reader.Token == JsonToken.ObjectEnd) + break; + + string property = (string) reader.Value; + + ((IDictionary) instance)[property] = ReadValue ( + factory, reader); + } + + } + + return instance; + } + + private static void ReadSkip (JsonReader reader) + { + ToWrapper ( + delegate { return new JsonMockWrapper (); }, reader); + } + + private static void RegisterBaseExporters () + { + base_exporters_table[typeof (byte)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToInt32 ((byte) obj)); + }; + + base_exporters_table[typeof (char)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToString ((char) obj)); + }; + + base_exporters_table[typeof (DateTime)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToString ((DateTime) obj, + datetime_format)); + }; + + base_exporters_table[typeof (decimal)] = + delegate (object obj, JsonWriter writer) { + writer.Write ((decimal) obj); + }; + + base_exporters_table[typeof (sbyte)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToInt32 ((sbyte) obj)); + }; + + base_exporters_table[typeof (short)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToInt32 ((short) obj)); + }; + + base_exporters_table[typeof (ushort)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToInt32 ((ushort) obj)); + }; + + base_exporters_table[typeof (uint)] = + delegate (object obj, JsonWriter writer) { + writer.Write (Convert.ToUInt64 ((uint) obj)); + }; + + base_exporters_table[typeof (ulong)] = + delegate (object obj, JsonWriter writer) { + writer.Write ((ulong) obj); + }; + + base_exporters_table[typeof(DateTimeOffset)] = + delegate (object obj, JsonWriter writer) { + writer.Write(((DateTimeOffset)obj).ToString("yyyy-MM-ddTHH:mm:ss.fffffffzzz", datetime_format)); + }; + } + + private static void RegisterBaseImporters () + { + ImporterFunc importer; + + importer = delegate (object input) { + return Convert.ToByte ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (byte), importer); + + importer = delegate (object input) { + return Convert.ToUInt64 ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (ulong), importer); + + importer = delegate (object input) { + return Convert.ToInt64((int)input); + }; + RegisterImporter(base_importers_table, typeof(int), + typeof(long), importer); + + importer = delegate (object input) { + return Convert.ToSByte ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (sbyte), importer); + + importer = delegate (object input) { + return Convert.ToInt16 ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (short), importer); + + importer = delegate (object input) { + return Convert.ToUInt16 ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (ushort), importer); + + importer = delegate (object input) { + return Convert.ToUInt32 ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (uint), importer); + + importer = delegate (object input) { + return Convert.ToSingle ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (float), importer); + + importer = delegate (object input) { + return Convert.ToDouble ((int) input); + }; + RegisterImporter (base_importers_table, typeof (int), + typeof (double), importer); + + importer = delegate (object input) { + return Convert.ToDecimal ((double) input); + }; + RegisterImporter (base_importers_table, typeof (double), + typeof (decimal), importer); + + importer = delegate (object input) { + return Convert.ToSingle((double)input); + }; + RegisterImporter(base_importers_table, typeof(double), + typeof(float), importer); + + importer = delegate (object input) { + return Convert.ToUInt32 ((long) input); + }; + RegisterImporter (base_importers_table, typeof (long), + typeof (uint), importer); + + importer = delegate (object input) { + return Convert.ToChar ((string) input); + }; + RegisterImporter (base_importers_table, typeof (string), + typeof (char), importer); + + importer = delegate (object input) { + return Convert.ToDateTime ((string) input, datetime_format); + }; + RegisterImporter (base_importers_table, typeof (string), + typeof (DateTime), importer); + + importer = delegate (object input) { + return DateTimeOffset.Parse((string)input, datetime_format); + }; + RegisterImporter(base_importers_table, typeof(string), + typeof(DateTimeOffset), importer); + } + + private static void RegisterImporter ( + IDictionary> table, + Type json_type, Type value_type, ImporterFunc importer) + { + if (! table.ContainsKey (json_type)) + table.Add (json_type, new Dictionary ()); + + table[json_type][value_type] = importer; + } + + private static void WriteValue (object obj, JsonWriter writer, + bool writer_is_private, + int depth) + { + if (depth > max_nesting_depth) + throw new JsonException ( + String.Format ("Max allowed object depth reached while " + + "trying to export from type {0}", + obj.GetType ())); + + if (obj == null) { + writer.Write (null); + return; + } + + if (obj is IJsonWrapper) { + if (writer_is_private) + writer.TextWriter.Write (((IJsonWrapper) obj).ToJson ()); + else + ((IJsonWrapper) obj).ToJson (writer); + + return; + } + + if (obj is String) { + writer.Write ((string) obj); + return; + } + + if (obj is Double) { + writer.Write ((double) obj); + return; + } + + if (obj is Single) + { + writer.Write((float)obj); + return; + } + + if (obj is Int32) { + writer.Write ((int) obj); + return; + } + + if (obj is Boolean) { + writer.Write ((bool) obj); + return; + } + + if (obj is Int64) { + writer.Write ((long) obj); + return; + } + + if (obj is Array) { + writer.WriteArrayStart (); + + foreach (object elem in (Array) obj) + WriteValue (elem, writer, writer_is_private, depth + 1); + + writer.WriteArrayEnd (); + + return; + } + + if (obj is IList) { + writer.WriteArrayStart (); + foreach (object elem in (IList) obj) + WriteValue (elem, writer, writer_is_private, depth + 1); + writer.WriteArrayEnd (); + + return; + } + + if (obj is IDictionary dictionary) { + writer.WriteObjectStart (); + foreach (DictionaryEntry entry in dictionary) { + var propertyName = entry.Key is string key ? + key + : Convert.ToString(entry.Key, CultureInfo.InvariantCulture); + writer.WritePropertyName (propertyName); + WriteValue (entry.Value, writer, writer_is_private, + depth + 1); + } + writer.WriteObjectEnd (); + + return; + } + + Type obj_type = obj.GetType (); + + // See if there's a custom exporter for the object + if (custom_exporters_table.ContainsKey (obj_type)) { + ExporterFunc exporter = custom_exporters_table[obj_type]; + exporter (obj, writer); + + return; + } + + // If not, maybe there's a base exporter + if (base_exporters_table.ContainsKey (obj_type)) { + ExporterFunc exporter = base_exporters_table[obj_type]; + exporter (obj, writer); + + return; + } + + // Last option, let's see if it's an enum + if (obj is Enum) { + Type e_type = Enum.GetUnderlyingType (obj_type); + + if (e_type == typeof (long)) + writer.Write ((long) obj); + else if (e_type == typeof (uint)) + writer.Write ((uint) obj); + else if (e_type == typeof (ulong)) + writer.Write ((ulong) obj); + else if (e_type == typeof(ushort)) + writer.Write ((ushort)obj); + else if (e_type == typeof(short)) + writer.Write ((short)obj); + else if (e_type == typeof(byte)) + writer.Write ((byte)obj); + else if (e_type == typeof(sbyte)) + writer.Write ((sbyte)obj); + else + writer.Write ((int) obj); + + return; + } + + // Okay, so it looks like the input should be exported as an + // object + AddTypeProperties (obj_type); + IList props = type_properties[obj_type]; + + writer.WriteObjectStart (); + foreach (PropertyMetadata p_data in props) { + if (p_data.IsField) { + writer.WritePropertyName (p_data.Info.Name); + WriteValue (((FieldInfo) p_data.Info).GetValue (obj), + writer, writer_is_private, depth + 1); + } + else { + PropertyInfo p_info = (PropertyInfo) p_data.Info; + + if (p_info.CanRead) { + writer.WritePropertyName (p_data.Info.Name); + WriteValue (p_info.GetValue (obj, null), + writer, writer_is_private, depth + 1); + } + } + } + writer.WriteObjectEnd (); + } + #endregion + + + public static string ToJson (object obj) + { + lock (static_writer_lock) { + static_writer.Reset (); + + WriteValue (obj, static_writer, true, 0); + + return static_writer.ToString (); + } + } + + public static void ToJson (object obj, JsonWriter writer) + { + WriteValue (obj, writer, false, 0); + } + + public static JsonData ToObject (JsonReader reader) + { + return (JsonData) ToWrapper ( + delegate { return new JsonData (); }, reader); + } + + public static JsonData ToObject (TextReader reader) + { + JsonReader json_reader = new JsonReader (reader); + + return (JsonData) ToWrapper ( + delegate { return new JsonData (); }, json_reader); + } + + public static JsonData ToObject (string json) + { + return (JsonData) ToWrapper ( + delegate { return new JsonData (); }, json); + } + + public static T ToObject (JsonReader reader) + { + return (T) ReadValue (typeof (T), reader); + } + + public static T ToObject (TextReader reader) + { + JsonReader json_reader = new JsonReader (reader); + + return (T) ReadValue (typeof (T), json_reader); + } + + public static T ToObject (string json) + { + JsonReader reader = new JsonReader (json); + + return (T) ReadValue (typeof (T), reader); + } + + public static object ToObject(string json, Type ConvertType ) + { + JsonReader reader = new JsonReader(json); + + return ReadValue(ConvertType, reader); + } + + public static IJsonWrapper ToWrapper (WrapperFactory factory, + JsonReader reader) + { + return ReadValue (factory, reader); + } + + public static IJsonWrapper ToWrapper (WrapperFactory factory, + string json) + { + JsonReader reader = new JsonReader (json); + + return ReadValue (factory, reader); + } + + public static void RegisterExporter (ExporterFunc exporter) + { + ExporterFunc exporter_wrapper = + delegate (object obj, JsonWriter writer) { + exporter ((T) obj, writer); + }; + + custom_exporters_table[typeof (T)] = exporter_wrapper; + } + + public static void RegisterImporter ( + ImporterFunc importer) + { + ImporterFunc importer_wrapper = + delegate (object input) { + return importer ((TJson) input); + }; + + RegisterImporter (custom_importers_table, typeof (TJson), + typeof (TValue), importer_wrapper); + } + + public static void UnregisterExporters () + { + custom_exporters_table.Clear (); + } + + public static void UnregisterImporters () + { + custom_importers_table.Clear (); + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMapper.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMapper.cs.meta new file mode 100644 index 0000000..b569a8a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e63e0f11bef8d6429a261ce53a94f70 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMockWrapper.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMockWrapper.cs new file mode 100644 index 0000000..dfe7adb --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMockWrapper.cs @@ -0,0 +1,105 @@ +#region Header +/** + * JsonMockWrapper.cs + * Mock object implementing IJsonWrapper, to facilitate actions like + * skipping data more efficiently. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections; +using System.Collections.Specialized; + + +namespace LitJson +{ + public class JsonMockWrapper : IJsonWrapper + { + public bool IsArray { get { return false; } } + public bool IsBoolean { get { return false; } } + public bool IsDouble { get { return false; } } + public bool IsInt { get { return false; } } + public bool IsLong { get { return false; } } + public bool IsObject { get { return false; } } + public bool IsString { get { return false; } } + + public bool GetBoolean () { return false; } + public double GetDouble () { return 0.0; } + public int GetInt () { return 0; } + public JsonType GetJsonType () { return JsonType.None; } + public long GetLong () { return 0L; } + public string GetString () { return ""; } + + public void SetBoolean (bool val) {} + public void SetDouble (double val) {} + public void SetInt (int val) {} + public void SetJsonType (JsonType type) {} + public void SetLong (long val) {} + public void SetString (string val) {} + + public string ToJson () { return ""; } + public void ToJson (JsonWriter writer) {} + + + bool IList.IsFixedSize { get { return true; } } + bool IList.IsReadOnly { get { return true; } } + + object IList.this[int index] { + get { return null; } + set {} + } + + int IList.Add (object value) { return 0; } + void IList.Clear () {} + bool IList.Contains (object value) { return false; } + int IList.IndexOf (object value) { return -1; } + void IList.Insert (int i, object v) {} + void IList.Remove (object value) {} + void IList.RemoveAt (int index) {} + + + int ICollection.Count { get { return 0; } } + bool ICollection.IsSynchronized { get { return false; } } + object ICollection.SyncRoot { get { return null; } } + + void ICollection.CopyTo (Array array, int index) {} + + + IEnumerator IEnumerable.GetEnumerator () { return null; } + + + bool IDictionary.IsFixedSize { get { return true; } } + bool IDictionary.IsReadOnly { get { return true; } } + + ICollection IDictionary.Keys { get { return null; } } + ICollection IDictionary.Values { get { return null; } } + + object IDictionary.this[object key] { + get { return null; } + set {} + } + + void IDictionary.Add (object k, object v) {} + void IDictionary.Clear () {} + bool IDictionary.Contains (object key) { return false; } + void IDictionary.Remove (object key) {} + + IDictionaryEnumerator IDictionary.GetEnumerator () { return null; } + + + object IOrderedDictionary.this[int idx] { + get { return null; } + set {} + } + + IDictionaryEnumerator IOrderedDictionary.GetEnumerator () { + return null; + } + void IOrderedDictionary.Insert (int i, object k, object v) {} + void IOrderedDictionary.RemoveAt (int i) {} + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMockWrapper.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMockWrapper.cs.meta new file mode 100644 index 0000000..2b67513 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonMockWrapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: eccf65801d671bc41b6df3f29c184857 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonReader.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonReader.cs new file mode 100644 index 0000000..e47eabc --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonReader.cs @@ -0,0 +1,478 @@ +#region Header +/** + * JsonReader.cs + * Stream-like access to JSON text. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; + + +namespace LitJson +{ + public enum JsonToken + { + None, + + ObjectStart, + PropertyName, + ObjectEnd, + + ArrayStart, + ArrayEnd, + + Int, + Long, + Double, + + String, + + Boolean, + Null + } + + + public class JsonReader + { + #region Fields + private static readonly IDictionary> parse_table; + + private Stack automaton_stack; + private int current_input; + private int current_symbol; + private bool end_of_json; + private bool end_of_input; + private Lexer lexer; + private bool parser_in_string; + private bool parser_return; + private bool read_started; + private TextReader reader; + private bool reader_is_owned; + private bool skip_non_members; + private object token_value; + private JsonToken token; + #endregion + + + #region Public Properties + public bool AllowComments { + get { return lexer.AllowComments; } + set { lexer.AllowComments = value; } + } + + public bool AllowSingleQuotedStrings { + get { return lexer.AllowSingleQuotedStrings; } + set { lexer.AllowSingleQuotedStrings = value; } + } + + public bool SkipNonMembers { + get { return skip_non_members; } + set { skip_non_members = value; } + } + + public bool EndOfInput { + get { return end_of_input; } + } + + public bool EndOfJson { + get { return end_of_json; } + } + + public JsonToken Token { + get { return token; } + } + + public object Value { + get { return token_value; } + } + #endregion + + + #region Constructors + static JsonReader () + { + parse_table = PopulateParseTable (); + } + + public JsonReader (string json_text) : + this (new StringReader (json_text), true) + { + } + + public JsonReader (TextReader reader) : + this (reader, false) + { + } + + private JsonReader (TextReader reader, bool owned) + { + if (reader == null) + throw new ArgumentNullException ("reader"); + + parser_in_string = false; + parser_return = false; + + read_started = false; + automaton_stack = new Stack (); + automaton_stack.Push ((int) ParserToken.End); + automaton_stack.Push ((int) ParserToken.Text); + + lexer = new Lexer (reader); + + end_of_input = false; + end_of_json = false; + + skip_non_members = true; + + this.reader = reader; + reader_is_owned = owned; + } + #endregion + + + #region Static Methods + private static IDictionary> PopulateParseTable () + { + // See section A.2. of the manual for details + IDictionary> parse_table = new Dictionary> (); + + TableAddRow (parse_table, ParserToken.Array); + TableAddCol (parse_table, ParserToken.Array, '[', + '[', + (int) ParserToken.ArrayPrime); + + TableAddRow (parse_table, ParserToken.ArrayPrime); + TableAddCol (parse_table, ParserToken.ArrayPrime, '"', + (int) ParserToken.Value, + + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, '[', + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, ']', + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, '{', + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.Number, + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.True, + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.False, + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + TableAddCol (parse_table, ParserToken.ArrayPrime, (int) ParserToken.Null, + (int) ParserToken.Value, + (int) ParserToken.ValueRest, + ']'); + + TableAddRow (parse_table, ParserToken.Object); + TableAddCol (parse_table, ParserToken.Object, '{', + '{', + (int) ParserToken.ObjectPrime); + + TableAddRow (parse_table, ParserToken.ObjectPrime); + TableAddCol (parse_table, ParserToken.ObjectPrime, '"', + (int) ParserToken.Pair, + (int) ParserToken.PairRest, + '}'); + TableAddCol (parse_table, ParserToken.ObjectPrime, '}', + '}'); + + TableAddRow (parse_table, ParserToken.Pair); + TableAddCol (parse_table, ParserToken.Pair, '"', + (int) ParserToken.String, + ':', + (int) ParserToken.Value); + + TableAddRow (parse_table, ParserToken.PairRest); + TableAddCol (parse_table, ParserToken.PairRest, ',', + ',', + (int) ParserToken.Pair, + (int) ParserToken.PairRest); + TableAddCol (parse_table, ParserToken.PairRest, '}', + (int) ParserToken.Epsilon); + + TableAddRow (parse_table, ParserToken.String); + TableAddCol (parse_table, ParserToken.String, '"', + '"', + (int) ParserToken.CharSeq, + '"'); + + TableAddRow (parse_table, ParserToken.Text); + TableAddCol (parse_table, ParserToken.Text, '[', + (int) ParserToken.Array); + TableAddCol (parse_table, ParserToken.Text, '{', + (int) ParserToken.Object); + + TableAddRow (parse_table, ParserToken.Value); + TableAddCol (parse_table, ParserToken.Value, '"', + (int) ParserToken.String); + TableAddCol (parse_table, ParserToken.Value, '[', + (int) ParserToken.Array); + TableAddCol (parse_table, ParserToken.Value, '{', + (int) ParserToken.Object); + TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.Number, + (int) ParserToken.Number); + TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.True, + (int) ParserToken.True); + TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.False, + (int) ParserToken.False); + TableAddCol (parse_table, ParserToken.Value, (int) ParserToken.Null, + (int) ParserToken.Null); + + TableAddRow (parse_table, ParserToken.ValueRest); + TableAddCol (parse_table, ParserToken.ValueRest, ',', + ',', + (int) ParserToken.Value, + (int) ParserToken.ValueRest); + TableAddCol (parse_table, ParserToken.ValueRest, ']', + (int) ParserToken.Epsilon); + + return parse_table; + } + + private static void TableAddCol (IDictionary> parse_table, ParserToken row, int col, + params int[] symbols) + { + parse_table[(int) row].Add (col, symbols); + } + + private static void TableAddRow (IDictionary> parse_table, ParserToken rule) + { + parse_table.Add ((int) rule, new Dictionary ()); + } + #endregion + + + #region Private Methods + private void ProcessNumber (string number) + { + if (number.IndexOf ('.') != -1 || + number.IndexOf ('e') != -1 || + number.IndexOf ('E') != -1) { + + double n_double; + if (double.TryParse (number, NumberStyles.Any, CultureInfo.InvariantCulture, out n_double)) { + token = JsonToken.Double; + token_value = n_double; + + return; + } + } + + int n_int32; + if (int.TryParse (number, NumberStyles.Integer, CultureInfo.InvariantCulture, out n_int32)) { + token = JsonToken.Int; + token_value = n_int32; + + return; + } + + long n_int64; + if (long.TryParse (number, NumberStyles.Integer, CultureInfo.InvariantCulture, out n_int64)) { + token = JsonToken.Long; + token_value = n_int64; + + return; + } + + ulong n_uint64; + if (ulong.TryParse(number, NumberStyles.Integer, CultureInfo.InvariantCulture, out n_uint64)) + { + token = JsonToken.Long; + token_value = n_uint64; + + return; + } + + // Shouldn't happen, but just in case, return something + token = JsonToken.Int; + token_value = 0; + } + + private void ProcessSymbol () + { + if (current_symbol == '[') { + token = JsonToken.ArrayStart; + parser_return = true; + + } else if (current_symbol == ']') { + token = JsonToken.ArrayEnd; + parser_return = true; + + } else if (current_symbol == '{') { + token = JsonToken.ObjectStart; + parser_return = true; + + } else if (current_symbol == '}') { + token = JsonToken.ObjectEnd; + parser_return = true; + + } else if (current_symbol == '"') { + if (parser_in_string) { + parser_in_string = false; + + parser_return = true; + + } else { + if (token == JsonToken.None) + token = JsonToken.String; + + parser_in_string = true; + } + + } else if (current_symbol == (int) ParserToken.CharSeq) { + token_value = lexer.StringValue; + + } else if (current_symbol == (int) ParserToken.False) { + token = JsonToken.Boolean; + token_value = false; + parser_return = true; + + } else if (current_symbol == (int) ParserToken.Null) { + token = JsonToken.Null; + parser_return = true; + + } else if (current_symbol == (int) ParserToken.Number) { + ProcessNumber (lexer.StringValue); + + parser_return = true; + + } else if (current_symbol == (int) ParserToken.Pair) { + token = JsonToken.PropertyName; + + } else if (current_symbol == (int) ParserToken.True) { + token = JsonToken.Boolean; + token_value = true; + parser_return = true; + + } + } + + private bool ReadToken () + { + if (end_of_input) + return false; + + lexer.NextToken (); + + if (lexer.EndOfInput) { + Close (); + + return false; + } + + current_input = lexer.Token; + + return true; + } + #endregion + + + public void Close () + { + if (end_of_input) + return; + + end_of_input = true; + end_of_json = true; + + if (reader_is_owned) + { + using(reader){} + } + + reader = null; + } + + public bool Read () + { + if (end_of_input) + return false; + + if (end_of_json) { + end_of_json = false; + automaton_stack.Clear (); + automaton_stack.Push ((int) ParserToken.End); + automaton_stack.Push ((int) ParserToken.Text); + } + + parser_in_string = false; + parser_return = false; + + token = JsonToken.None; + token_value = null; + + if (! read_started) { + read_started = true; + + if (! ReadToken ()) + return false; + } + + + int[] entry_symbols; + + while (true) { + if (parser_return) { + if (automaton_stack.Peek () == (int) ParserToken.End) + end_of_json = true; + + return true; + } + + current_symbol = automaton_stack.Pop (); + + ProcessSymbol (); + + if (current_symbol == current_input) { + if (! ReadToken ()) { + if (automaton_stack.Peek () != (int) ParserToken.End) + throw new JsonException ( + "Input doesn't evaluate to proper JSON text"); + + if (parser_return) + return true; + + return false; + } + + continue; + } + + try { + + entry_symbols = + parse_table[current_symbol][current_input]; + + } catch (KeyNotFoundException e) { + throw new JsonException ((ParserToken) current_input, e); + } + + if (entry_symbols[0] == (int) ParserToken.Epsilon) + continue; + + for (int i = entry_symbols.Length - 1; i >= 0; i--) + automaton_stack.Push (entry_symbols[i]); + } + } + + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonReader.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonReader.cs.meta new file mode 100644 index 0000000..8899898 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonReader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a9e68f25477380e49b9cc15cf5aeabe4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonWriter.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonWriter.cs new file mode 100644 index 0000000..4bfaaac --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonWriter.cs @@ -0,0 +1,484 @@ +#region Header +/** + * JsonWriter.cs + * Stream-like facility to output JSON text. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; + + +namespace LitJson +{ + internal enum Condition + { + InArray, + InObject, + NotAProperty, + Property, + Value + } + + internal class WriterContext + { + public int Count; + public bool InArray; + public bool InObject; + public bool ExpectingValue; + public int Padding; + } + + public class JsonWriter + { + #region Fields + private static readonly NumberFormatInfo number_format; + + private WriterContext context; + private Stack ctx_stack; + private bool has_reached_end; + private char[] hex_seq; + private int indentation; + private int indent_value; + private StringBuilder inst_string_builder; + private bool pretty_print; + private bool validate; + private bool lower_case_properties; + private TextWriter writer; + #endregion + + + #region Properties + public int IndentValue { + get { return indent_value; } + set { + indentation = (indentation / indent_value) * value; + indent_value = value; + } + } + + public bool PrettyPrint { + get { return pretty_print; } + set { pretty_print = value; } + } + + public TextWriter TextWriter { + get { return writer; } + } + + public bool Validate { + get { return validate; } + set { validate = value; } + } + + public bool LowerCaseProperties { + get { return lower_case_properties; } + set { lower_case_properties = value; } + } + #endregion + + + #region Constructors + static JsonWriter () + { + number_format = NumberFormatInfo.InvariantInfo; + } + + public JsonWriter () + { + inst_string_builder = new StringBuilder (); + writer = new StringWriter (inst_string_builder); + + Init (); + } + + public JsonWriter (StringBuilder sb) : + this (new StringWriter (sb)) + { + } + + public JsonWriter (TextWriter writer) + { + if (writer == null) + throw new ArgumentNullException ("writer"); + + this.writer = writer; + + Init (); + } + #endregion + + + #region Private Methods + private void DoValidation (Condition cond) + { + if (! context.ExpectingValue) + context.Count++; + + if (! validate) + return; + + if (has_reached_end) + throw new JsonException ( + "A complete JSON symbol has already been written"); + + switch (cond) { + case Condition.InArray: + if (! context.InArray) + throw new JsonException ( + "Can't close an array here"); + break; + + case Condition.InObject: + if (! context.InObject || context.ExpectingValue) + throw new JsonException ( + "Can't close an object here"); + break; + + case Condition.NotAProperty: + if (context.InObject && ! context.ExpectingValue) + throw new JsonException ( + "Expected a property"); + break; + + case Condition.Property: + if (! context.InObject || context.ExpectingValue) + throw new JsonException ( + "Can't add a property here"); + break; + + case Condition.Value: + if (! context.InArray && + (! context.InObject || ! context.ExpectingValue)) + throw new JsonException ( + "Can't add a value here"); + + break; + } + } + + private void Init () + { + has_reached_end = false; + hex_seq = new char[4]; + indentation = 0; + indent_value = 4; + pretty_print = false; + validate = true; + lower_case_properties = false; + + ctx_stack = new Stack (); + context = new WriterContext (); + ctx_stack.Push (context); + } + + private static void IntToHex (int n, char[] hex) + { + int num; + + for (int i = 0; i < 4; i++) { + num = n % 16; + + if (num < 10) + hex[3 - i] = (char) ('0' + num); + else + hex[3 - i] = (char) ('A' + (num - 10)); + + n >>= 4; + } + } + + private void Indent () + { + if (pretty_print) + indentation += indent_value; + } + + + private void Put (string str) + { + if (pretty_print && ! context.ExpectingValue) + for (int i = 0; i < indentation; i++) + writer.Write (' '); + + writer.Write (str); + } + + private void PutNewline () + { + PutNewline (true); + } + + private void PutNewline (bool add_comma) + { + if (add_comma && ! context.ExpectingValue && + context.Count > 1) + writer.Write (','); + + if (pretty_print && ! context.ExpectingValue) + writer.Write (Environment.NewLine); + } + + private void PutString (string str) + { + Put (String.Empty); + + writer.Write ('"'); + + int n = str.Length; + for (int i = 0; i < n; i++) { + switch (str[i]) { + case '\n': + writer.Write ("\\n"); + continue; + + case '\r': + writer.Write ("\\r"); + continue; + + case '\t': + writer.Write ("\\t"); + continue; + + case '"': + case '\\': + writer.Write ('\\'); + writer.Write (str[i]); + continue; + + case '\f': + writer.Write ("\\f"); + continue; + + case '\b': + writer.Write ("\\b"); + continue; + } + + if ((int) str[i] >= 32 && (int) str[i] <= 126) { + writer.Write (str[i]); + continue; + } + + // Default, turn into a \uXXXX sequence + IntToHex ((int) str[i], hex_seq); + writer.Write ("\\u"); + writer.Write (hex_seq); + } + + writer.Write ('"'); + } + + private void Unindent () + { + if (pretty_print) + indentation -= indent_value; + } + #endregion + + + public override string ToString () + { + if (inst_string_builder == null) + return String.Empty; + + return inst_string_builder.ToString (); + } + + public void Reset () + { + has_reached_end = false; + + ctx_stack.Clear (); + context = new WriterContext (); + ctx_stack.Push (context); + + if (inst_string_builder != null) + inst_string_builder.Remove (0, inst_string_builder.Length); + } + + public void Write (bool boolean) + { + DoValidation (Condition.Value); + PutNewline (); + + Put (boolean ? "true" : "false"); + + context.ExpectingValue = false; + } + + public void Write (decimal number) + { + DoValidation (Condition.Value); + PutNewline (); + + Put (Convert.ToString (number, number_format)); + + context.ExpectingValue = false; + } + + public void Write (double number) + { + DoValidation (Condition.Value); + PutNewline (); + + string str = Convert.ToString (number, number_format); + Put (str); + + if (str.IndexOf ('.') == -1 && + str.IndexOf ('E') == -1) + writer.Write (".0"); + + context.ExpectingValue = false; + } + + public void Write(float number) + { + DoValidation(Condition.Value); + PutNewline(); + + string str = Convert.ToString(number, number_format); + Put(str); + + context.ExpectingValue = false; + } + + public void Write (int number) + { + DoValidation (Condition.Value); + PutNewline (); + + Put (Convert.ToString (number, number_format)); + + context.ExpectingValue = false; + } + + public void Write (long number) + { + DoValidation (Condition.Value); + PutNewline (); + + Put (Convert.ToString (number, number_format)); + + context.ExpectingValue = false; + } + + public void Write (string str) + { + DoValidation (Condition.Value); + PutNewline (); + + if (str == null) + Put ("null"); + else + PutString (str); + + context.ExpectingValue = false; + } + + [CLSCompliant(false)] + public void Write (ulong number) + { + DoValidation (Condition.Value); + PutNewline (); + + Put (Convert.ToString (number, number_format)); + + context.ExpectingValue = false; + } + + public void WriteArrayEnd () + { + DoValidation (Condition.InArray); + PutNewline (false); + + ctx_stack.Pop (); + if (ctx_stack.Count == 1) + has_reached_end = true; + else { + context = ctx_stack.Peek (); + context.ExpectingValue = false; + } + + Unindent (); + Put ("]"); + } + + public void WriteArrayStart () + { + DoValidation (Condition.NotAProperty); + PutNewline (); + + Put ("["); + + context = new WriterContext (); + context.InArray = true; + ctx_stack.Push (context); + + Indent (); + } + + public void WriteObjectEnd () + { + DoValidation (Condition.InObject); + PutNewline (false); + + ctx_stack.Pop (); + if (ctx_stack.Count == 1) + has_reached_end = true; + else { + context = ctx_stack.Peek (); + context.ExpectingValue = false; + } + + Unindent (); + Put ("}"); + } + + public void WriteObjectStart () + { + DoValidation (Condition.NotAProperty); + PutNewline (); + + Put ("{"); + + context = new WriterContext (); + context.InObject = true; + ctx_stack.Push (context); + + Indent (); + } + + public void WritePropertyName (string property_name) + { + DoValidation (Condition.Property); + PutNewline (); + string propertyName = (property_name == null || !lower_case_properties) + ? property_name + : property_name.ToLowerInvariant(); + + PutString (propertyName); + + if (pretty_print) { + if (propertyName.Length > context.Padding) + context.Padding = propertyName.Length; + + for (int i = context.Padding - propertyName.Length; + i >= 0; i--) + writer.Write (' '); + + writer.Write (": "); + } else + writer.Write (':'); + + context.ExpectingValue = true; + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonWriter.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonWriter.cs.meta new file mode 100644 index 0000000..0d25795 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/JsonWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a4dd365314ca7114282641abfb814cdb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Lexer.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Lexer.cs new file mode 100644 index 0000000..cb62d55 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Lexer.cs @@ -0,0 +1,912 @@ +#region Header +/** + * Lexer.cs + * JSON lexer implementation based on a finite state machine. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + + +namespace LitJson +{ + internal class FsmContext + { + public bool Return; + public int NextState; + public Lexer L; + public int StateStack; + } + + + internal class Lexer + { + #region Fields + private delegate bool StateHandler (FsmContext ctx); + + private static readonly int[] fsm_return_table; + private static readonly StateHandler[] fsm_handler_table; + + private bool allow_comments; + private bool allow_single_quoted_strings; + private bool end_of_input; + private FsmContext fsm_context; + private int input_buffer; + private int input_char; + private TextReader reader; + private int state; + private StringBuilder string_buffer; + private string string_value; + private int token; + private int unichar; + #endregion + + + #region Properties + public bool AllowComments { + get { return allow_comments; } + set { allow_comments = value; } + } + + public bool AllowSingleQuotedStrings { + get { return allow_single_quoted_strings; } + set { allow_single_quoted_strings = value; } + } + + public bool EndOfInput { + get { return end_of_input; } + } + + public int Token { + get { return token; } + } + + public string StringValue { + get { return string_value; } + } + #endregion + + + #region Constructors + static Lexer () + { + PopulateFsmTables (out fsm_handler_table, out fsm_return_table); + } + + public Lexer (TextReader reader) + { + allow_comments = true; + allow_single_quoted_strings = true; + + input_buffer = 0; + string_buffer = new StringBuilder (128); + state = 1; + end_of_input = false; + this.reader = reader; + + fsm_context = new FsmContext (); + fsm_context.L = this; + } + #endregion + + + #region Static Methods + private static int HexValue (int digit) + { + switch (digit) { + case 'a': + case 'A': + return 10; + + case 'b': + case 'B': + return 11; + + case 'c': + case 'C': + return 12; + + case 'd': + case 'D': + return 13; + + case 'e': + case 'E': + return 14; + + case 'f': + case 'F': + return 15; + + default: + return digit - '0'; + } + } + + private static void PopulateFsmTables (out StateHandler[] fsm_handler_table, out int[] fsm_return_table) + { + // See section A.1. of the manual for details of the finite + // state machine. + fsm_handler_table = new StateHandler[28] { + State1, + State2, + State3, + State4, + State5, + State6, + State7, + State8, + State9, + State10, + State11, + State12, + State13, + State14, + State15, + State16, + State17, + State18, + State19, + State20, + State21, + State22, + State23, + State24, + State25, + State26, + State27, + State28 + }; + + fsm_return_table = new int[28] { + (int) ParserToken.Char, + 0, + (int) ParserToken.Number, + (int) ParserToken.Number, + 0, + (int) ParserToken.Number, + 0, + (int) ParserToken.Number, + 0, + 0, + (int) ParserToken.True, + 0, + 0, + 0, + (int) ParserToken.False, + 0, + 0, + (int) ParserToken.Null, + (int) ParserToken.CharSeq, + (int) ParserToken.Char, + 0, + 0, + (int) ParserToken.CharSeq, + (int) ParserToken.Char, + 0, + 0, + 0, + 0 + }; + } + + private static char ProcessEscChar (int esc_char) + { + switch (esc_char) { + case '"': + case '\'': + case '\\': + case '/': + return Convert.ToChar (esc_char); + + case 'n': + return '\n'; + + case 't': + return '\t'; + + case 'r': + return '\r'; + + case 'b': + return '\b'; + + case 'f': + return '\f'; + + default: + // Unreachable + return '?'; + } + } + + private static bool State1 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char == ' ' || + ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') + continue; + + if (ctx.L.input_char >= '1' && ctx.L.input_char <= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 3; + return true; + } + + switch (ctx.L.input_char) { + case '"': + ctx.NextState = 19; + ctx.Return = true; + return true; + + case ',': + case ':': + case '[': + case ']': + case '{': + case '}': + ctx.NextState = 1; + ctx.Return = true; + return true; + + case '-': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 2; + return true; + + case '0': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 4; + return true; + + case 'f': + ctx.NextState = 12; + return true; + + case 'n': + ctx.NextState = 16; + return true; + + case 't': + ctx.NextState = 9; + return true; + + case '\'': + if (! ctx.L.allow_single_quoted_strings) + return false; + + ctx.L.input_char = '"'; + ctx.NextState = 23; + ctx.Return = true; + return true; + + case '/': + if (! ctx.L.allow_comments) + return false; + + ctx.NextState = 25; + return true; + + default: + return false; + } + } + + return true; + } + + private static bool State2 (FsmContext ctx) + { + ctx.L.GetChar (); + + if (ctx.L.input_char >= '1' && ctx.L.input_char<= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 3; + return true; + } + + switch (ctx.L.input_char) { + case '0': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 4; + return true; + + default: + return false; + } + } + + private static bool State3 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + continue; + } + + if (ctx.L.input_char == ' ' || + ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') { + ctx.Return = true; + ctx.NextState = 1; + return true; + } + + switch (ctx.L.input_char) { + case ',': + case ']': + case '}': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 1; + return true; + + case '.': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 5; + return true; + + case 'e': + case 'E': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 7; + return true; + + default: + return false; + } + } + return true; + } + + private static bool State4 (FsmContext ctx) + { + ctx.L.GetChar (); + + if (ctx.L.input_char == ' ' || + ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') { + ctx.Return = true; + ctx.NextState = 1; + return true; + } + + switch (ctx.L.input_char) { + case ',': + case ']': + case '}': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 1; + return true; + + case '.': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 5; + return true; + + case 'e': + case 'E': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 7; + return true; + + default: + return false; + } + } + + private static bool State5 (FsmContext ctx) + { + ctx.L.GetChar (); + + if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 6; + return true; + } + + return false; + } + + private static bool State6 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + continue; + } + + if (ctx.L.input_char == ' ' || + ctx.L.input_char >= '\t' && ctx.L.input_char <= '\r') { + ctx.Return = true; + ctx.NextState = 1; + return true; + } + + switch (ctx.L.input_char) { + case ',': + case ']': + case '}': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 1; + return true; + + case 'e': + case 'E': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 7; + return true; + + default: + return false; + } + } + + return true; + } + + private static bool State7 (FsmContext ctx) + { + ctx.L.GetChar (); + + if (ctx.L.input_char >= '0' && ctx.L.input_char<= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 8; + return true; + } + + switch (ctx.L.input_char) { + case '+': + case '-': + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + ctx.NextState = 8; + return true; + + default: + return false; + } + } + + private static bool State8 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char >= '0' && ctx.L.input_char<= '9') { + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + continue; + } + + if (ctx.L.input_char == ' ' || + ctx.L.input_char >= '\t' && ctx.L.input_char<= '\r') { + ctx.Return = true; + ctx.NextState = 1; + return true; + } + + switch (ctx.L.input_char) { + case ',': + case ']': + case '}': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + return true; + } + + private static bool State9 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'r': + ctx.NextState = 10; + return true; + + default: + return false; + } + } + + private static bool State10 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'u': + ctx.NextState = 11; + return true; + + default: + return false; + } + } + + private static bool State11 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'e': + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + private static bool State12 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'a': + ctx.NextState = 13; + return true; + + default: + return false; + } + } + + private static bool State13 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'l': + ctx.NextState = 14; + return true; + + default: + return false; + } + } + + private static bool State14 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 's': + ctx.NextState = 15; + return true; + + default: + return false; + } + } + + private static bool State15 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'e': + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + private static bool State16 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'u': + ctx.NextState = 17; + return true; + + default: + return false; + } + } + + private static bool State17 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'l': + ctx.NextState = 18; + return true; + + default: + return false; + } + } + + private static bool State18 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'l': + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + private static bool State19 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + switch (ctx.L.input_char) { + case '"': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 20; + return true; + + case '\\': + ctx.StateStack = 19; + ctx.NextState = 21; + return true; + + default: + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + continue; + } + } + + return true; + } + + private static bool State20 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case '"': + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + private static bool State21 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case 'u': + ctx.NextState = 22; + return true; + + case '"': + case '\'': + case '/': + case '\\': + case 'b': + case 'f': + case 'n': + case 'r': + case 't': + ctx.L.string_buffer.Append ( + ProcessEscChar (ctx.L.input_char)); + ctx.NextState = ctx.StateStack; + return true; + + default: + return false; + } + } + + private static bool State22 (FsmContext ctx) + { + int counter = 0; + int mult = 4096; + + ctx.L.unichar = 0; + + while (ctx.L.GetChar ()) { + + if (ctx.L.input_char >= '0' && ctx.L.input_char <= '9' || + ctx.L.input_char >= 'A' && ctx.L.input_char <= 'F' || + ctx.L.input_char >= 'a' && ctx.L.input_char <= 'f') { + + ctx.L.unichar += HexValue (ctx.L.input_char) * mult; + + counter++; + mult /= 16; + + if (counter == 4) { + ctx.L.string_buffer.Append ( + Convert.ToChar (ctx.L.unichar)); + ctx.NextState = ctx.StateStack; + return true; + } + + continue; + } + + return false; + } + + return true; + } + + private static bool State23 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + switch (ctx.L.input_char) { + case '\'': + ctx.L.UngetChar (); + ctx.Return = true; + ctx.NextState = 24; + return true; + + case '\\': + ctx.StateStack = 23; + ctx.NextState = 21; + return true; + + default: + ctx.L.string_buffer.Append ((char) ctx.L.input_char); + continue; + } + } + + return true; + } + + private static bool State24 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case '\'': + ctx.L.input_char = '"'; + ctx.Return = true; + ctx.NextState = 1; + return true; + + default: + return false; + } + } + + private static bool State25 (FsmContext ctx) + { + ctx.L.GetChar (); + + switch (ctx.L.input_char) { + case '*': + ctx.NextState = 27; + return true; + + case '/': + ctx.NextState = 26; + return true; + + default: + return false; + } + } + + private static bool State26 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char == '\n') { + ctx.NextState = 1; + return true; + } + } + + return true; + } + + private static bool State27 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char == '*') { + ctx.NextState = 28; + return true; + } + } + + return true; + } + + private static bool State28 (FsmContext ctx) + { + while (ctx.L.GetChar ()) { + if (ctx.L.input_char == '*') + continue; + + if (ctx.L.input_char == '/') { + ctx.NextState = 1; + return true; + } + + ctx.NextState = 27; + return true; + } + + return true; + } + #endregion + + + private bool GetChar () + { + if ((input_char = NextChar ()) != -1) + return true; + + end_of_input = true; + return false; + } + + private int NextChar () + { + if (input_buffer != 0) { + int tmp = input_buffer; + input_buffer = 0; + + return tmp; + } + + return reader.Read (); + } + + public bool NextToken () + { + StateHandler handler; + fsm_context.Return = false; + + while (true) { + handler = fsm_handler_table[state - 1]; + + if (! handler (fsm_context)) + throw new JsonException (input_char); + + if (end_of_input) + return false; + + if (fsm_context.Return) { + string_value = string_buffer.ToString (); + string_buffer.Remove (0, string_buffer.Length); + token = fsm_return_table[state - 1]; + + if (token == (int) ParserToken.Char) + token = input_char; + + state = fsm_context.NextState; + + return true; + } + + state = fsm_context.NextState; + } + } + + private void UngetChar () + { + input_buffer = input_char; + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Lexer.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Lexer.cs.meta new file mode 100644 index 0000000..4d4061b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Lexer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: aadd9cba7eae43a42b4cc217ba457e54 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Netstandard15Polyfill.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Netstandard15Polyfill.cs new file mode 100644 index 0000000..55b02a2 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Netstandard15Polyfill.cs @@ -0,0 +1,24 @@ +#if NETSTANDARD1_5 +using System; +using System.Reflection; +namespace LitJson +{ + internal static class Netstandard15Polyfill + { + internal static Type GetInterface(this Type type, string name) + { + return type.GetTypeInfo().GetInterface(name); + } + + internal static bool IsClass(this Type type) + { + return type.GetTypeInfo().IsClass; + } + + internal static bool IsEnum(this Type type) + { + return type.GetTypeInfo().IsEnum; + } + } +} +#endif \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Netstandard15Polyfill.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Netstandard15Polyfill.cs.meta new file mode 100644 index 0000000..4b57541 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/Netstandard15Polyfill.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd46d201658351647a556d32b2cd1edb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/ParserToken.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/ParserToken.cs new file mode 100644 index 0000000..e23d477 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/ParserToken.cs @@ -0,0 +1,44 @@ +#region Header +/** + * ParserToken.cs + * Internal representation of the tokens used by the lexer and the parser. + * + * The authors disclaim copyright to this source code. For more details, see + * the COPYING file included with this distribution. + **/ +#endregion + + +namespace LitJson +{ + internal enum ParserToken + { + // Lexer tokens (see section A.1.1. of the manual) + None = System.Char.MaxValue + 1, + Number, + True, + False, + Null, + CharSeq, + // Single char + Char, + + // Parser Rules (see section A.2.1 of the manual) + Text, + Object, + ObjectPrime, + Pair, + PairRest, + Array, + ArrayPrime, + Value, + ValueRest, + String, + + // End of input + End, + + // The empty rule + Epsilon + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/ParserToken.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/ParserToken.cs.meta new file mode 100644 index 0000000..c828c62 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/LitJson/ParserToken.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6e84bd194d881f84e81d978238a310ea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRFeatureBase.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRFeatureBase.cs new file mode 100644 index 0000000..aa46047 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRFeatureBase.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public abstract class OpenXRFeatureBase : OpenXRFeature + { + protected static ulong xrInstance = 0ul; + protected static ulong xrSession = 0ul; + protected string extensionUrl = ""; + protected bool _isExtensionEnable = false; + + protected override bool OnInstanceCreate(ulong instance) + { + extensionUrl = GetExtensionString(); + _isExtensionEnable = isExtensionEnabled(); + if (!_isExtensionEnable) + { + return false; + } + + xrInstance = instance; + xrSession = 0ul; + + Initialize(xrGetInstanceProcAddr); + return true; + } + +#if UNITY_EDITOR + protected override void GetValidationChecks(List rules, BuildTargetGroup targetGroup) + { + var settings = OpenXRSettings.GetSettingsForBuildTargetGroup(targetGroup); + rules.Add(new ValidationRule(this) + { + message = "No PICO OpenXR Features selected.", + checkPredicate = () => + { + if (null == settings) + return false; + + foreach (var feature in settings.GetFeatures()) + { + if (feature is OpenXRExtensions) + { + return feature.enabled; + } + } + + return false; + }, + fixIt = () => + { + if (null == settings) + return ; + var openXRExtensions = settings.GetFeature(); + if (openXRExtensions != null) + { + openXRExtensions.enabled = true; + } + }, + error = true + }); + } +#endif + + public bool isExtensionEnabled() + { + string[] exts = extensionUrl.Split(' '); + if (exts.Length>0) + { + foreach (var _ext in exts) + { + if (!string.IsNullOrEmpty(_ext) && !OpenXRRuntime.IsExtensionEnabled(_ext)) + { + PLog.e(_ext + " is not enabled"); + return false; + } + } + } + else + { + if (!string.IsNullOrEmpty(extensionUrl) && !OpenXRRuntime.IsExtensionEnabled(extensionUrl)) + { + PLog.e(extensionUrl + " is not enabled"); + return false; + } + + } + return true; + } + + protected override void OnSessionCreate(ulong xrSessionId) + { + xrSession = xrSessionId; + base.OnSessionCreate(xrSession); + SessionCreate(); + } + + protected override void OnInstanceDestroy(ulong xrInstance) + { + base.OnInstanceDestroy(xrInstance); + xrInstance = 0ul; + } + + protected override void OnSessionDestroy(ulong xrSessionId) + { + base.OnSessionDestroy(xrSessionId); + xrSession = 0ul; + } + + public virtual void Initialize(IntPtr intPtr) + { + } + + public abstract string GetExtensionString(); + + public virtual void SessionCreate() + { + } + public static bool IsSuccess(XrResult result) => result == 0; + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRFeatureBase.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRFeatureBase.cs.meta new file mode 100644 index 0000000..057cf39 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRFeatureBase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 350057506ea44d55a5e042ce07f9f3b7 +timeCreated: 1687328246 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRNativeTypes.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRNativeTypes.cs new file mode 100644 index 0000000..6d54b06 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRNativeTypes.cs @@ -0,0 +1,755 @@ +using System; +using System.Runtime.InteropServices; +using UnityEngine; + + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public enum XrResult + { + Success = 0, + TimeoutExpored = 1, + LossPending = 3, + EventUnavailable = 4, + SpaceBoundsUnavailable = 7, + SessionNotFocused = 8, + FrameDiscarded = 9, + ValidationFailure = -1, + RuntimeFailure = -2, + OutOfMemory = -3, + ApiVersionUnsupported = -4, + InitializationFailed = -6, + FunctionUnsupported = -7, + FeatureUnsupported = -8, + ExtensionNotPresent = -9, + LimitReached = -10, + SizeInsufficient = -11, + HandleInvalid = -12, + InstanceLOst = -13, + SessionRunning = -14, + SessionNotRunning = -16, + SessionLost = -17, + SystemInvalid = -18, + PathInvalid = -19, + PathCountExceeded = -20, + PathFormatInvalid = -21, + PathUnsupported = -22, + LayerInvalid = -23, + LayerLimitExceeded = -24, + SpwachainRectInvalid = -25, + SwapchainFormatUnsupported = -26, + ActionTypeMismatch = -27, + SessionNotReady = -28, + SessionNotStopping = -29, + TimeInvalid = -30, + ReferenceSpaceUnsupported = -31, + FileAccessError = -32, + FileContentsInvalid = -33, + FormFactorUnsupported = -34, + FormFactorUnavailable = -35, + ApiLayerNotPresent = -36, + CallOrderInvalid = -37, + GraphicsDeviceInvalid = -38, + PoseInvalid = -39, + IndexOutOfRange = -40, + ViewConfigurationTypeUnsupported = -41, + EnvironmentBlendModeUnsupported = -42, + NameDuplicated = -44, + NameInvalid = -45, + ActionsetNotAttached = -46, + ActionsetsAlreadyAttached = -47, + LocalizedNameDuplicated = -48, + LocalizedNameInvalid = -49, + AndroidThreadSettingsIdInvalidKHR = -1000003000, + AndroidThreadSettingsdFailureKHR = -1000003001, + CreateSpatialAnchorFailedMSFT = -1000039001, + SecondaryViewConfigurationTypeNotEnabledMSFT = -1000053000, + MaxResult = 0x7FFFFFFF + } + + public struct XrExtent2Df + { + public float width; + public float height; + + public XrExtent2Df(float x, float y) + { + this.width = x; + this.height = y; + } + + public XrExtent2Df(Vector2 value) + { + width = value.x; + height = value.y; + } + + public Vector2 ToVector2() + { + return new Vector2() { x = width, y = height }; + } + public override string ToString() + { + return $"{nameof(width)}: {width}, {nameof(height)}: {height}"; + } + }; + + // [Flags] + public enum XrReferenceSpaceType + { + View = 1, + Local = 2, + Stage = 3, + UnboundedMsft = 1000038000, + CombinedEyeVarjo = 1000121000, + LocalizationMap = 1000139000, + LocalFloor = 1000426000, + MAX_ENUM = 0x7FFFFFFF + + } + + public enum XrBodyJointSetBD + { + XR_BODY_JOINT_SET_DEFAULT_BD = 0, //default joint set XR_BODY_JOINT_SET_BODY_STAR_WITHOUT_ARM_BD + XR_BODY_JOINT_SET_BODY_STAR_WITHOUT_ARM_BD = 1, + XR_BODY_JOINT_SET_BODY_FULL_STAR_BD = 2 + } + + public struct xrPose + { + public double PosX; // position of x + public double PosY; // position of y + public double PosZ; // position of z + public double RotQx; // x components of Quaternion + public double RotQy; // y components of Quaternion + public double RotQz; // z components of Quaternion + public double RotQw; // w components of Quaternion + } + + public struct BodyTrackerResult + { + public bool IsActive; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)] + public FPICOBodyState[] trackingdata; + } + + public struct FPICOBodyState + { + public bool bIsValid; + public xrPose pose; + } + + public enum SecureContentFlag + { + SECURE_CONTENT_OFF = 0, + SECURE_CONTENT_EXCLUDE_LAYER = 1, + SECURE_CONTENT_REPLACE_LAYER = 2 + } + + public enum XrFaceTrackingModeBD + { + DEFAULT_BD = 0, // face + COMBINED_AUDIO_BD = 1, // combined bs + COMBINED_AUDIO_WITH_LIP_BD = 2, // combined vis + ONLY_AUDIO_WITH_LIP_BD = 3, // lip sync + } + + /// + /// Enum values that identify the face action units affecting the expression on the face. + /// + /// Each action unit corresponds to a facial feature that can move. A coefficient of zero for the + /// feature represents the neutral position, while a coefficient of one represents the fully articulated + /// position. + /// + public enum BlendShapeLocation + { + /// + /// The coefficient describing closure of the eyelids over the left eye. + /// + EyeBlinkLeft = 0, + + /// + /// The coefficient describing movement of the left eyelids consistent with a downward gaze. + /// + EyeLookDownLeft = 1, + + /// + /// The coefficient describing movement of the left eyelids consistent with a rightward gaze. + /// + EyeLookInLeft = 2, + + /// + /// The coefficient describing movement of the left eyelids consistent with a leftward gaze. + /// + EyeLookOutLeft = 3, + + /// + /// The coefficient describing movement of the left eyelids consistent with an upward gaze. + /// + EyeLookUpLeft = 4, + + /// + /// The coefficient describing contraction of the face around the left eye. + /// + EyeSquintLeft = 5, + + /// + /// The coefficient describing a widening of the eyelids around the left eye. + /// + EyeWideLeft = 6, + + /// + /// The coefficient describing closure of the eyelids over the right eye. + /// + EyeBlinkRight = 7, + + /// + /// The coefficient describing movement of the right eyelids consistent with a downward gaze. + /// + EyeLookDownRight = 8, + + /// + /// The coefficient describing movement of the right eyelids consistent with a leftward gaze. + /// + EyeLookInRight = 9, + + /// + /// The coefficient describing movement of the right eyelids consistent with a rightward gaze. + /// + EyeLookOutRight = 10, + + /// + /// The coefficient describing movement of the right eyelids consistent with an upward gaze. + /// + EyeLookUpRight = 11, + + /// + /// The coefficient describing contraction of the face around the right eye. + /// + EyeSquintRight = 12, + + /// + /// The coefficient describing a widening of the eyelids around the right eye. + /// + EyeWideRight = 13, + + /// + /// The coefficient describing forward movement of the lower jaw. + /// + JawForward = 14, + + /// + /// The coefficient describing leftward movement of the lower jaw. + /// + JawLeft = 15, + + /// + /// The coefficient describing rightward movement of the lower jaw. + /// + JawRight = 16, + + /// + /// The coefficient describing an opening of the lower jaw. + /// + JawOpen = 17, + + /// + /// The coefficient describing closure of the lips independent of jaw position. + /// + MouthClose = 18, + + /// + /// The coefficient describing contraction of both lips into an open shape. + /// + MouthFunnel = 19, + + /// + /// The coefficient describing contraction and compression of both closed lips. + /// + MouthPucker = 20, + + /// + /// The coefficient describing leftward movement of both lips together. + /// + MouthLeft = 21, + + /// + /// The coefficient describing rightward movement of both lips together. + /// + MouthRight = 22, + + /// + /// The coefficient describing upward movement of the left corner of the mouth. + /// + MouthSmileLeft = 23, + + /// + /// The coefficient describing upward movement of the right corner of the mouth. + /// + MouthSmileRight = 24, + + /// + /// The coefficient describing downward movement of the left corner of the mouth. + /// + MouthFrownLeft = 25, + + /// + /// The coefficient describing downward movement of the right corner of the mouth. + /// + MouthFrownRight = 26, + + /// + /// The coefficient describing backward movement of the left corner of the mouth. + /// + MouthDimpleLeft = 27, + + /// + /// The coefficient describing backward movement of the right corner of the mouth. + /// + MouthDimpleRight = 28, + + /// + /// The coefficient describing leftward movement of the left corner of the mouth. + /// + MouthStretchLeft = 29, + + /// + /// The coefficient describing rightward movement of the left corner of the mouth. + /// + MouthStretchRight = 30, + + /// + /// The coefficient describing movement of the lower lip toward the inside of the mouth. + /// + MouthRollLower = 31, + + /// + /// The coefficient describing movement of the upper lip toward the inside of the mouth. + /// + MouthRollUpper = 32, + + /// + /// The coefficient describing outward movement of the lower lip. + /// + MouthShrugLower = 33, + + /// + /// The coefficient describing outward movement of the upper lip. + /// + MouthShrugUpper = 34, + + /// + /// The coefficient describing upward compression of the lower lip on the left side. + /// + MouthPressLeft = 35, + + /// + /// The coefficient describing upward compression of the lower lip on the right side. + /// + MouthPressRight = 36, + + /// + /// The coefficient describing downward movement of the lower lip on the left side. + /// + MouthLowerDownLeft = 37, + + /// + /// The coefficient describing downward movement of the lower lip on the right side. + /// + MouthLowerDownRight = 38, + + /// + /// The coefficient describing upward movement of the upper lip on the left side. + /// + MouthUpperUpLeft = 39, + + /// + /// The coefficient describing upward movement of the upper lip on the right side. + /// + MouthUpperUpRight = 40, + + /// + /// The coefficient describing downward movement of the outer portion of the left eyebrow. + /// + BrowDownLeft = 41, + + /// + /// The coefficient describing downward movement of the outer portion of the right eyebrow. + /// + BrowDownRight = 42, + + /// + /// The coefficient describing upward movement of the inner portion of both eyebrows. + /// + BrowInnerUp = 43, + + /// + /// The coefficient describing upward movement of the outer portion of the left eyebrow. + /// + BrowOuterUpLeft = 44, + + /// + /// The coefficient describing upward movement of the outer portion of the right eyebrow. + /// + BrowOuterUpRight = 45, + + /// + /// The coefficient describing outward movement of both cheeks. + /// + CheekPuff = 46, + + /// + /// The coefficient describing upward movement of the cheek around and below the left eye. + /// + CheekSquintLeft = 47, + + /// + /// The coefficient describing upward movement of the cheek around and below the right eye. + /// + CheekSquintRight = 48, + + /// + /// The coefficient describing a raising of the left side of the nose around the nostril. + /// + NoseSneerLeft = 49, + + /// + /// The coefficient describing a raising of the right side of the nose around the nostril. + /// + NoseSneerRight = 50, + + /// + /// The coefficient describing extension of the tongue. + /// + TongueOut = 51 + } + + [StructLayout(LayoutKind.Sequential)] + public unsafe struct PxrFaceTrackingInfo + { + public Int64 timestamp; // + public fixed float faceExpressionWeights[52]; // + public fixed float lipsyncExpressionWeights[20]; // + public bool isUpperFaceDataValid; // + public bool isLowerFaceDataValid; // + }; + + public enum ConfigsEXT + { + RENDER_TEXTURE_WIDTH = 0, + RENDER_TEXTURE_HEIGHT, + SHOW_FPS, + RUNTIME_LOG_LEVEL, + PXRPLUGIN_LOG_LEVEL, + UNITY_LOG_LEVEL, + UNREAL_LOG_LEVEL, + NATIVE_LOG_LEVEL, + TARGET_FRAME_RATE, + NECK_MODEL_X, + NECK_MODEL_Y, + NECK_MODEL_Z, + DISPLAY_REFRESH_RATE, + ENABLE_6DOF, + CONTROLLER_TYPE, + PHYSICAL_IPD, + TO_DELTA_SENSOR_Y, + GET_DISPLAY_RATE, + FOVEATION_SUBSAMPLED_ENABLED = 18, + TRACKING_ORIGIN_HEIGHT = 19, + RENDER_FPS = 20, + MRC_POSITION_Y_OFFSET, + GET_SINGLEPASS = 22, + GET_FOVLEVEL, + SDK_TRACE_ENABLE, + SDK_SEETHROUGH_DELAY_LOG_ENABLE = 25, + GET_SEETHROUGH_STATE = 26, + EYEORIENTATAION_LEFT_X = 27, + EYEORIENTATAION_LEFT_Y = 28, + EYEORIENTATAION_LEFT_Z = 29, + EYEORIENTATAION_LEFT_W = 30, + EYEORIENTATAION_RIGHT_X = 31, + EYEORIENTATAION_RIGHT_Y = 32, + EYEORIENTATAION_RIGHT_Z = 33, + EYEORIENTATAION_RIGHT_W = 34, + SDK_SEETHROUGH_DELAY_DATA_REPORT = 35, + }; + + public struct PxrRecti + { + public int x; + public int y; + public int width; + public int height; + }; + + public enum PxrBlendFactor + { + Zero = 0, + One = 1, + SrcAlpha = 2, + OneMinusSrcAlpha = 3, + DstAlpha = 4, + OneMinusDstAlpha = 5 + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PxrLayerParam + { + public int layerId; + public CompositeLayerFeature.OverlayShape layerShape; + public CompositeLayerFeature.OverlayType layerType; + public CompositeLayerFeature.LayerLayout layerLayout; + public UInt64 format; + public UInt32 width; + public UInt32 height; + public UInt32 sampleCount; + public UInt32 faceCount; + public UInt32 arraySize; + public UInt32 mipmapCount; + public UInt32 layerFlags; + public UInt32 externalImageCount; + public IntPtr leftExternalImages; + public IntPtr rightExternalImages; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PxrVector4f + { + public float x; + public float y; + public float z; + public float w; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PxrVector3f + { + public float x; + public float y; + public float z; + }; + [StructLayout(LayoutKind.Sequential)] + public struct XrExtent3Df + { + public float width; + public float height; + public float depth; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PxrPosef + { + public PxrVector4f orientation; + public PxrVector3f position; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PxrLayerBlend + { + public PxrBlendFactor srcColor; + public PxrBlendFactor dstColor; + public PxrBlendFactor srcAlpha; + public PxrBlendFactor dstAlpha; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PxrLayerHeader2 + { + public int layerId; + public UInt32 layerFlags; + public float colorScaleX; + public float colorScaleY; + public float colorScaleZ; + public float colorScaleW; + public float colorBiasX; + public float colorBiasY; + public float colorBiasZ; + public float colorBiasW; + public int compositionDepth; + public int sensorFrameIndex; + public int imageIndex; + public PxrPosef headPose; + public CompositeLayerFeature.OverlayShape layerShape; + public UInt32 useLayerBlend; + public PxrLayerBlend layerBlend; + public UInt32 useImageRect; + public PxrRecti imageRectLeft; + public PxrRecti imageRectRight; + public UInt64 reserved0; + public UInt64 reserved1; + public UInt64 reserved2; + public UInt64 reserved3; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PxrVector2f + { + public float x; + public float y; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PxrLayerQuad + { + public PxrLayerHeader2 header; + public PxrPosef poseLeft; + public PxrPosef poseRight; + public PxrVector2f sizeLeft; + public PxrVector2f sizeRight; + }; + + [StructLayout(LayoutKind.Sequential)] + public unsafe struct PxrLayerCylinder + { + public PxrLayerHeader2 header; + public PxrPosef poseLeft; + public PxrPosef poseRight; + public float radiusLeft; + public float radiusRight; + public float centralAngleLeft; + public float centralAngleRight; + public float heightLeft; + public float heightRight; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PxrLayerEquirect + { + public PxrLayerHeader2 header; + public PxrPosef poseLeft; + public PxrPosef poseRight; + public float radiusLeft; + public float radiusRight; + public float centralHorizontalAngleLeft; + public float centralHorizontalAngleRight; + public float upperVerticalAngleLeft; + public float upperVerticalAngleRight; + public float lowerVerticalAngleLeft; + public float lowerVerticalAngleRight; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct PxrLayerCube + { + public PxrLayerHeader2 header; + public PxrPosef poseLeft; + public PxrPosef poseRight; + }; + + public enum PxrLayerSubmitFlags + { + PxrLayerFlagNoCompositionDepthTesting = 1 << 3, + PxrLayerFlagUseExternalHeadPose = 1 << 5, + PxrLayerFlagLayerPoseNotInTrackingSpace = 1 << 6, + PxrLayerFlagHeadLocked = 1 << 7, + PxrLayerFlagUseExternalImageIndex = 1 << 8, + } + + public enum PxrLayerCreateFlags + { + PxrLayerFlagAndroidSurface = 1 << 0, + PxrLayerFlagProtectedContent = 1 << 1, + PxrLayerFlagStaticImage = 1 << 2, + PxrLayerFlagUseExternalImages = 1 << 4, + PxrLayerFlag3DLeftRightSurface = 1 << 5, + PxrLayerFlag3DTopBottomSurface = 1 << 6, + PxrLayerFlagEnableFrameExtrapolation = 1 << 7, + PxrLayerFlagEnableSubsampled = 1 << 8, + PxrLayerFlagEnableFrameExtrapolationPTW = 1 << 9, + PxrLayerFlagSharedImagesBetweenLayers = 1 << 10, + } + + public enum EyeType + { + EyeLeft, + EyeRight, + EyeBoth + }; + + /// + /// Information about PICO Motion Tracker's connection state. + /// + [StructLayout(LayoutKind.Sequential)] + public unsafe struct PxrFitnessBandConnectState + { + /// + /// + /// + public Byte num; + /// + /// + /// + public fixed Byte trackerID[12]; + } + + public enum PassthroughColorMapType + { + None = 0, + MonoToRgba = 1, + MonoToMono = 2, + BrightnessContrastSaturation = 3 + } + + [StructLayout(LayoutKind.Sequential)] + public struct Colorf + { + public float r; + public float g; + public float b; + public float a; + + public override string ToString() + { + return string.Format(System.Globalization.CultureInfo.InvariantCulture, + "R:{0:F3} G:{1:F3} B:{2:F3} A:{3:F3}", r, g, b, a); + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct _PassthroughStyle + { + public uint enableEdgeColor; + public uint enableColorMap; + public float TextureOpacityFactor; + public Colorf EdgeColor; + public PassthroughColorMapType TextureColorMapType; + public uint TextureColorMapDataSize; + public IntPtr TextureColorMapData; + } + public struct PassthroughStyle + { + public bool enableEdgeColor; + public bool enableColorMap; + public float TextureOpacityFactor; + public Color EdgeColor; + public PassthroughColorMapType TextureColorMapType; + public uint TextureColorMapDataSize; + public IntPtr TextureColorMapData; + } + [StructLayout(LayoutKind.Sequential)] + public struct GeometryInstanceTransform + { + public PxrPosef pose; + public PxrVector3f scale; + + public override string ToString() + { + return string.Format(System.Globalization.CultureInfo.InvariantCulture, + "Rotation:({0:F3},{1:F3},{2:F3},{3:F3}) Position:({4:F3},{5:F3},{6:F3}) scale:({7},{8},{9})", pose.orientation.x, + pose.orientation.y, pose.orientation.z, pose.orientation.w, pose.position.x, pose.position.y, + pose.position.z,scale.x,scale.y,scale.z); + } + }; + [StructLayout(LayoutKind.Sequential)] + public struct PxrSensorState2 + { + public int status; + public PxrPosef pose; + public PxrPosef globalPose; + public PxrVector3f angularVelocity; + public PxrVector3f linearVelocity; + public PxrVector3f angularAcceleration; + public PxrVector3f linearAcceleration; + public UInt64 poseTimeStampNs; + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRNativeTypes.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRNativeTypes.cs.meta new file mode 100644 index 0000000..0cf5b2c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/OpenXRNativeTypes.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 70222e482e03417ab1388191c49f1c23 +timeCreated: 1686552171 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PLog.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PLog.cs new file mode 100644 index 0000000..9f5af0a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PLog.cs @@ -0,0 +1,104 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained hererin are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +#if UNITY_ANDROID && !UNITY_EDITOR +using System.Runtime.InteropServices; +#endif +using UnityEngine; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public class PLog + { + public static string TAG = "[PoxrUnity] "; + // 7--all print, 4--info to fatal, 3--warning to fatal, + // 2--error to fatal, 1--only fatal print + public static LogLevel logLevel = LogLevel.LogInfo; + + public enum LogLevel + { + LogFatal = 1, + LogError = 2, + LogWarn = 3, + LogInfo = 4, + LogDebug = 5, + LogVerbose, + } + + public static void v(string message) + { + v(TAG,message); + } + + public static void d(string message) + { + d(TAG,message); + } + + public static void i(string message) + { + i(TAG,message); + } + + public static void w(string message) + { + w(TAG,message); + } + + public static void e(string message) + { + e(TAG,message); + } + + public static void f(string message) + { + f(TAG,message); + } + + + public static void v(string tag,string message) + { + if (LogLevel.LogVerbose <= logLevel) + Debug.Log(string.Format("{0} FrameID={1}>>>>>>{2}", TAG, Time.frameCount, message)); + } + + public static void d(string tag,string message) + { + if (LogLevel.LogDebug <= logLevel) + Debug.Log(string.Format("{0} FrameID={1}>>>>>>{2}", TAG, Time.frameCount, message)); + } + + public static void i(string tag,string message) + { + if (LogLevel.LogInfo <= logLevel) + Debug.Log(string.Format("{0} FrameID={1}>>>>>>{2}", TAG, Time.frameCount, message)); + } + + public static void w(string tag,string message) + { + if (LogLevel.LogWarn <= logLevel) + Debug.LogWarning(string.Format("{0} FrameID={1}>>>>>>{2}", TAG, Time.frameCount, message)); + } + + public static void e(string tag,string message) + { + if (LogLevel.LogError <= logLevel) + Debug.LogError(string.Format("{0} FrameID={1}>>>>>>{2}", TAG, Time.frameCount, message)); + } + + public static void f(string tag,string message) + { + if (LogLevel.LogFatal <= logLevel) + Debug.LogError(string.Format("{0} FrameID={1}>>>>>>{2}", TAG, Time.frameCount, message)); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PLog.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PLog.cs.meta new file mode 100644 index 0000000..5cb68c6 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PLog.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df58f5069538b8c4ba1ccb810f392606 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_PermissionRequest.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_PermissionRequest.cs new file mode 100644 index 0000000..56c0790 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_PermissionRequest.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Android; + +public class PXR_PermissionRequest : MonoBehaviour +{ + public bool requestMR=false; + + + private List _permissions = new List(); + private const string _permissionMr = "com.picovr.permission.SPATIAL_DATA"; + + private void Awake() + { + if (requestMR) + { + _permissions.Add(_permissionMr); + } + RequestUserPermissionAll(); + + } + + // Update is called once per frame + void Update() + { + + } + + public void RequestUserPermissionAll() + { + var callbacks = new PermissionCallbacks(); + callbacks.PermissionDenied += PermissionCallbacks_PermissionDenied; + callbacks.PermissionGranted += PermissionCallbacks_PermissionGranted; + callbacks.PermissionDeniedAndDontAskAgain += PermissionCallbacks_PermissionDeniedAndDontAskAgain; + Debug.Log("HHHH Permission.Camera Request"); + Permission.RequestUserPermissions(_permissions.ToArray(), callbacks); + } + + internal void PermissionCallbacks_PermissionDeniedAndDontAskAgain(string permissionName) + { + Debug.Log($"HHHH {permissionName} PermissionDeniedAndDontAskAgain"); + } + + internal void PermissionCallbacks_PermissionGranted(string permissionName) + { + Debug.Log($"HHHH {permissionName} PermissionCallbacks_PermissionGranted"); + } + + internal void PermissionCallbacks_PermissionDenied(string permissionName) + { + Debug.Log($"HHHH {permissionName} PermissionCallbacks_PermissionDenied"); + } + + + public static void RequestUserPermissionMR(Action _PermissionDenied=null,Action _PermissionGranted=null,Action _PermissionDeniedAndDontAskAgain=null) + { + if (Permission.HasUserAuthorizedPermission(_permissionMr)) + { + if (_PermissionGranted != null) + { + _PermissionGranted(_permissionMr); + } + } + else + { + var callbacks = new PermissionCallbacks(); + callbacks.PermissionDenied += _PermissionDenied; + callbacks.PermissionGranted += _PermissionGranted; + callbacks.PermissionDeniedAndDontAskAgain += _PermissionDeniedAndDontAskAgain; + Permission.RequestUserPermission(_permissionMr,callbacks); + } + } + + public static void RequestUserPermissionMR(Action _PermissionGranted) + { + if (Permission.HasUserAuthorizedPermission(_permissionMr)) + { + if (_PermissionGranted != null) + { + _PermissionGranted(_permissionMr); + } + } + else + { + var callbacks = new PermissionCallbacks(); + callbacks.PermissionGranted += _PermissionGranted; + Permission.RequestUserPermission(_permissionMr,callbacks); + } + } + +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_PermissionRequest.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_PermissionRequest.cs.meta new file mode 100644 index 0000000..89be546 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_PermissionRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: abf8973c00047e14e86e0c66151edeaf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Plugin.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Plugin.cs new file mode 100644 index 0000000..83bcf41 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Plugin.cs @@ -0,0 +1,251 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using Unity.XR.OpenXR.Features.PICOSupport; +using UnityEngine; +using UnityEngine.XR; + +namespace Unity.XR.PXR +{ + public delegate void XrEventDataBufferCallBack(ref XrEventDataBuffer dataBuffer); + [StructLayout(LayoutKind.Sequential)] + public struct XrEventDataBuffer + { + public XrStructureType type; + public IntPtr next; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4000)] + public byte[] data; + }; + public enum PxrSenseDataProviderState + { + Initialized, + Running, + Stopped + } + public enum PxrFutureState + { + Pending = 1, + Ready = 2 + } + public enum PxrSemanticLabel + { + Unknown = 0, + Floor, + Ceiling, + Wall, + Door, + Window, + Opening, + Table, + Sofa, + Chair, + Human = 10, + VirtualWall = 18, + } + public enum PxrSceneComponentType + { + Location = 0, + Semantic, + Box2D, + Polygon, + Box3D, + TriangleMesh = 5, + } + + public enum PxrSenseDataProviderType + { + SpatialAnchor, + SceneCapture, + } + [StructLayout(LayoutKind.Sequential)] + public struct PxrSceneBox2D + { + public Vector2 offset; + public XrExtent2Df extent; + } + [StructLayout(LayoutKind.Sequential)] + public struct PxrScenePolygon + { + public Vector2[] vertices; + } + [StructLayout(LayoutKind.Sequential)] + public struct PxrSceneBox3D + { + public Vector3 position; + public Quaternion rotation; + public Vector3 extent; + } + public struct PxrSceneComponentData + { + public Guid uuid; + public Vector3 position; + public Quaternion rotation; + public PxrSemanticLabel label; + public PxrSceneComponentType[] types; + public PxrSceneBox3D box3D; + public PxrSceneBox2D box2D; + public PxrScenePolygon polygon; + } + public enum PxrMeshLod + { + Low, + Medium, + High + } + [StructLayout(LayoutKind.Sequential)] + public struct PxrSpatialMeshInfo + { + public Guid uuid; + public MeshChangeState state; + public Vector3 position; + public Quaternion rotation; + public ushort[] indices; + public Vector3[] vertices; + public PxrSemanticLabel[] labels; + } + [StructLayout(LayoutKind.Sequential)] + public struct PxrEventSenseDataProviderStateChanged + { + public ulong providerHandle; + public PxrSenseDataProviderState newState; + } + public enum PxrResult + { + SUCCESS = 0, + TIMEOUT_EXPIRED = 1, + SESSION_LOSS_PENDING = 3, + EVENT_UNAVAILABLE = 4, + SPACE_BOUNDS_UNAVAILABLE = 7, + SESSION_NOT_FOCUSED = 8, + FRAME_DISCARDED = 9, + ERROR_VALIDATION_FAILURE = -1, + ERROR_RUNTIME_FAILURE = -2, + ERROR_OUT_OF_MEMORY = -3, + ERROR_API_VERSION_UNSUPPORTED = -4, + ERROR_INITIALIZATION_FAILED = -6, + ERROR_FUNCTION_UNSUPPORTED = -7, + ERROR_FEATURE_UNSUPPORTED = -8, + ERROR_EXTENSION_NOT_PRESENT = -9, + ERROR_LIMIT_REACHED = -10, + ERROR_SIZE_INSUFFICIENT = -11, + ERROR_HANDLE_INVALID = -12, + ERROR_INSTANCE_LOST = -13, + ERROR_SESSION_RUNNING = -14, + ERROR_SESSION_NOT_RUNNING = -16, + ERROR_SESSION_LOST = -17, + ERROR_SYSTEM_INVALID = -18, + ERROR_PATH_INVALID = -19, + ERROR_PATH_COUNT_EXCEEDED = -20, + ERROR_PATH_FORMAT_INVALID = -21, + ERROR_PATH_UNSUPPORTED = -22, + ERROR_LAYER_INVALID = -23, + ERROR_LAYER_LIMIT_EXCEEDED = -24, + ERROR_SWAPCHAIN_RECT_INVALID = -25, + ERROR_SWAPCHAIN_FORMAT_UNSUPPORTED = -26, + ERROR_ACTION_TYPE_MISMATCH = -27, + ERROR_SESSION_NOT_READY = -28, + ERROR_SESSION_NOT_STOPPING = -29, + ERROR_TIME_INVALID = -30, + ERROR_REFERENCE_SPACE_UNSUPPORTED = -31, + ERROR_FILE_ACCESS_ERROR = -32, + ERROR_FILE_CONTENTS_INVALID = -33, + ERROR_FORM_FACTOR_UNSUPPORTED = -34, + ERROR_FORM_FACTOR_UNAVAILABLE = -35, + ERROR_API_LAYER_NOT_PRESENT = -36, + ERROR_CALL_ORDER_INVALID = -37, + ERROR_GRAPHICS_DEVICE_INVALID = -38, + ERROR_POSE_INVALID = -39, + ERROR_INDEX_OUT_OF_RANGE = -40, + ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED = -41, + ERROR_ENVIRONMENT_BLEND_MODE_UNSUPPORTED = -42, + ERROR_NAME_DUPLICATED = -44, + ERROR_NAME_INVALID = -45, + ERROR_ACTIONSET_NOT_ATTACHED = -46, + ERROR_ACTIONSETS_ALREADY_ATTACHED = -47, + ERROR_LOCALIZED_NAME_DUPLICATED = -48, + ERROR_LOCALIZED_NAME_INVALID = -49, + ERROR_GRAPHICS_REQUIREMENTS_CALL_MISSING = -50, + ERROR_RUNTIME_UNAVAILABLE = -51, + ERROR_EXTENSION_NOT_ENABLED = -800, + + ERROR_SPATIAL_LOCALIZATION_RUNNING = -1000, + ERROR_SPATIAL_LOCALIZATION_NOT_RUNNING = -1001, + ERROR_SPATIAL_MAP_CREATED = -1002, + ERROR_SPATIAL_MAP_NOT_CREATED = -1003, + ERROR_COMPONENT_NOT_SUPPORTED = -501, + ERROR_COMPONENT_CONFLICT = -502, + ERROR_COMPONENT_NOT_ADDED = -503, + ERROR_COMPONENT_ADDED = -504, + ERROR_ANCHOR_ENTITY_NOT_FOUND = -505, + ERROR_TRACKING_STATE_INVALID = -506, + + ERROR_ANCHOR_SHARING_NETWORK_TIMEOUT = -601, + ERROR_ANCHOR_SHARING_AUTHENTICATION_FAILURE = -602, + ERROR_ANCHOR_SHARING_NETWORK_FAILURE = -603, + ERROR_ANCHOR_SHARING_LOCALIZATION_FAIL = -604, + ERROR_ANCHOR_SHARING_MAP_INSUFFICIENT = -605, + + + ERROR_EXTENSION_DEPENDENCY_NOT_ENABLED = -1000710001, + ERROR_PERMISSION_INSUFFICIENT = -1000710000, + ERROR_ANDROID_THREAD_SETTINGS_ID_INVALID_KHR = -1000003000, + ERROR_ANDROID_THREAD_SETTINGS_FAILURE_KHR = -1000003001, + ERROR_CREATE_SPATIAL_ANCHOR_FAILED_MSFT = -1000039001, + ERROR_SECONDARY_VIEW_CONFIGURATION_TYPE_NOT_ENABLED_MSFT = -1000053000, + ERROR_CONTROLLER_MODEL_KEY_INVALID_MSFT = -1000055000, + ERROR_REPROJECTION_MODE_UNSUPPORTED_MSFT = -1000066000, + ERROR_COMPUTE_NEW_SCENE_NOT_COMPLETED_MSFT = -1000097000, + ERROR_SCENE_COMPONENT_ID_INVALID_MSFT = -1000097001, + ERROR_SCENE_COMPONENT_TYPE_MISMATCH_MSFT = -1000097002, + ERROR_SCENE_MESH_BUFFER_ID_INVALID_MSFT = -1000097003, + ERROR_SCENE_COMPUTE_FEATURE_INCOMPATIBLE_MSFT = -1000097004, + ERROR_SCENE_COMPUTE_CONSISTENCY_MISMATCH_MSFT = -1000097005, + ERROR_DISPLAY_REFRESH_RATE_UNSUPPORTED_FB = -1000101000, + ERROR_COLOR_SPACE_UNSUPPORTED_FB = -1000108000, + ERROR_SPACE_COMPONENT_NOT_SUPPORTED_FB = -1000113000, + ERROR_SPACE_COMPONENT_NOT_ENABLED_FB = -1000113001, + ERROR_SPACE_COMPONENT_STATUS_PENDING_FB = -1000113002, + ERROR_SPACE_COMPONENT_STATUS_ALREADY_SET_FB = -1000113003, + ERROR_UNEXPECTED_STATE_PASSTHROUGH_FB = -1000118000, + ERROR_FEATURE_ALREADY_CREATED_PASSTHROUGH_FB = -1000118001, + ERROR_FEATURE_REQUIRED_PASSTHROUGH_FB = -1000118002, + ERROR_NOT_PERMITTED_PASSTHROUGH_FB = -1000118003, + ERROR_INSUFFICIENT_RESOURCES_PASSTHROUGH_FB = -1000118004, + ERROR_UNKNOWN_PASSTHROUGH_FB = -1000118050, + ERROR_RENDER_MODEL_KEY_INVALID_FB = -1000119000, + RENDER_MODEL_UNAVAILABLE_FB = 1000119020, + ERROR_MARKER_NOT_TRACKED_VARJO = -1000124000, + ERROR_MARKER_ID_INVALID_VARJO = -1000124001, + ERROR_MARKER_DETECTOR_PERMISSION_DENIED_ML = -1000138000, + ERROR_MARKER_DETECTOR_LOCATE_FAILED_ML = -1000138001, + ERROR_MARKER_DETECTOR_INVALID_DATA_QUERY_ML = -1000138002, + ERROR_MARKER_DETECTOR_INVALID_CREATE_INFO_ML = -1000138003, + ERROR_MARKER_INVALID_ML = -1000138004, + ERROR_LOCALIZATION_MAP_INCOMPATIBLE_ML = -1000139000, + ERROR_LOCALIZATION_MAP_UNAVAILABLE_ML = -1000139001, + ERROR_LOCALIZATION_MAP_FAIL_ML = -1000139002, + ERROR_LOCALIZATION_MAP_IMPORT_EXPORT_PERMISSION_DENIED_ML = -1000139003, + ERROR_LOCALIZATION_MAP_PERMISSION_DENIED_ML = -1000139004, + ERROR_LOCALIZATION_MAP_ALREADY_EXISTS_ML = -1000139005, + ERROR_LOCALIZATION_MAP_CANNOT_EXPORT_CLOUD_MAP_ML = -1000139006, + ERROR_SPATIAL_ANCHOR_NAME_NOT_FOUND_MSFT = -1000142001, + ERROR_SPATIAL_ANCHOR_NAME_INVALID_MSFT = -1000142002, + SCENE_MARKER_DATA_NOT_STRING_MSFT = 1000147000, + ERROR_SPACE_MAPPING_INSUFFICIENT_FB = -1000169000, + ERROR_SPACE_LOCALIZATION_FAILED_FB = -1000169001, + ERROR_SPACE_NETWORK_TIMEOUT_FB = -1000169002, + ERROR_SPACE_NETWORK_REQUEST_FAILED_FB = -1000169003, + ERROR_SPACE_CLOUD_STORAGE_DISABLED_FB = -1000169004, + ERROR_PASSTHROUGH_COLOR_LUT_BUFFER_SIZE_MISMATCH_META = -1000266000, + ENVIRONMENT_DEPTH_NOT_AVAILABLE_META = 1000291000, + ERROR_HINT_ALREADY_SET_QCOM = -1000306000, + ERROR_NOT_AN_ANCHOR_HTC = -1000319000, + ERROR_SPACE_NOT_LOCATABLE_EXT = -1000429000, + ERROR_PLANE_DETECTION_PERMISSION_DENIED_EXT = -1000429001, + ERROR_FUTURE_PENDING_EXT = -1000469001, + ERROR_FUTURE_INVALID_EXT = -1000469002, + ERROR_EXTENSION_DEPENDENCY_NOT_ENABLED_KHR = ERROR_EXTENSION_DEPENDENCY_NOT_ENABLED, + ERROR_PERMISSION_INSUFFICIENT_KHR = ERROR_PERMISSION_INSUFFICIENT, + } + +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Plugin.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Plugin.cs.meta new file mode 100644 index 0000000..d073e02 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Plugin.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 52865e17ab434793a960c1936684f6ec +timeCreated: 1721813797 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Type.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Type.cs new file mode 100644 index 0000000..0ee5d0a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Type.cs @@ -0,0 +1,711 @@ +using System; +using System.Runtime.InteropServices; +using Unity.XR.OpenXR.Features.PICOSupport; + +namespace Unity.XR.PXR +{ + + [StructLayout(LayoutKind.Sequential)] + public struct XrFuturePollInfoEXT + { + public XrStructureType type; + public IntPtr next; + public ulong future; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrFuturePollResultEXT + { + public XrStructureType type; + public IntPtr next; + public PxrFutureState state; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSenseDataProviderCreateInfoBaseHeader + { + public XrStructureType type; + public IntPtr next; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSenseDataProviderStartCompletion + { + public XrStructureType type; + public IntPtr next; + public PxrResult futureResult; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSenseDataQueryCompletion + { + public XrStructureType type; + public IntPtr next; + public PxrResult futureResult; + public ulong snapshotHandle; + } + + public struct PxrUuid + { + public ulong value0; + public ulong value1; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialAnchorCompletion + { + public XrStructureType type; + public IntPtr next; + public PxrResult futureResult; + public ulong anchorHandle; + public PxrUuid uuid; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialAnchorPersistInfo + { + public XrStructureType type; + public IntPtr next; + public PxrPersistenceLocation location; + public ulong anchorHandle; + } + + public enum PxrPersistenceLocation + { + Local = 0, + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSenseDataQueryInfo + { + public XrStructureType type; + public IntPtr next; + public IntPtr filter; //PxrSenseDataQueryFilterBaseHeader + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSenseDataFilterUuid + { + public XrStructureType type; + public IntPtr next; + public uint uuidCount; + public IntPtr uuidList; //=>PxrUuid[] + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSenseDataFilterSemantic + { + public XrStructureType type; + public IntPtr next; + public uint semanticCount; + public IntPtr semantics; //=>PxrSemanticLabel[] + } + [StructLayout(LayoutKind.Sequential)] + public struct XrQueriedSenseDataGetInfo + { + public XrStructureType type; + public IntPtr next; + public ulong snapshotHandle; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrQueriedSenseData + { + public XrStructureType type; + public IntPtr next; + public uint queriedSpatialEntityCapacityInput; + public uint queriedSpatialEntityCountOutput; + public IntPtr queriedSpatialEntities;//PxrQueriedSpatialEntityInfo[] + } + + [StructLayout(LayoutKind.Sequential)] + public struct PxrQueriedSpatialEntityInfo + { + public XrStructureType type; + public IntPtr next; + public ulong spatialEntity; + public ulong time; + public PxrUuid uuid; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialEntityAnchorRetrieveInfo + { + public XrStructureType type; + public IntPtr next; + public ulong spatialEntity; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSpaceLocation + { + public XrStructureType type; + public IntPtr next; + public ulong locationFlags; //PxrSpaceLocationFlags + public PxrPosef pose; + } + public enum PxrSpaceLocationFlags + { + OrientationValid = 0x00000001, + PositionValidBit = 0x00000002, + OrientationTracked = 0x00000004, + PositionTracked = 0x00000008 + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialAnchorUnpersistInfo + { + public XrStructureType type; + public IntPtr next; + public PxrPersistenceLocation location; + public ulong anchorHandle; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSceneCaptureStartCompletion + { + public XrStructureType type; + public IntPtr next; + public PxrResult futureResult; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialEntityComponentGetInfoBaseHeader + { + public XrStructureType type; + public IntPtr next; + public ulong entity; + public PxrSceneComponentType componentType; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialEntityComponentDataBaseHeader + { + public XrStructureType type; + public IntPtr next; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialEntityGetInfo + { + public XrStructureType type; + public IntPtr next; + public ulong entity; + public PxrSceneComponentType componentType; + } + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialEntitySemanticData + { + public XrStructureType type; + public IntPtr next; + public uint semanticCapacityInput; + public uint semanticCountOutput; + public IntPtr semanticLabels;//PxrSemanticLabel[] + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialEntityLocationGetInfo + { + public XrStructureType type; + public IntPtr next; + public ulong entity; + public PxrSceneComponentType componentType; + public ulong baseSpace; + public ulong time; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSpaceLocationData + { + public ulong locationFlags; + public PxrPosef pose; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialEntityLocationData + { + public XrStructureType type; + public IntPtr next; + public XrSpaceLocationData location; + } + + + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialEntityBoundingBox3DData + { + public XrStructureType type; + public IntPtr next; + public PxrBoxf box3D; + } + [StructLayout(LayoutKind.Sequential)] + public struct PxrBoxf + { + public PxrPosef center; + public XrExtent3Df extents; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialEntityBoundingBox2DData + { + public XrStructureType type; + public IntPtr next; + public PxrSceneBox2D box2D; + } + + [StructLayout(LayoutKind.Sequential)] + public struct XrSpatialEntityPolygonData + { + public XrStructureType type; + public IntPtr next; + public uint polygonCapacityInput; + public uint polygonCountOutput; + public IntPtr vertices; //PxrVector2f[] + } + [StructLayout(LayoutKind.Sequential)] + public struct PxrTriangleMeshInfo + { + public XrStructureType type; + public IntPtr next; + public uint vertexCapacityInput; + public uint vertexCountOutput; + public IntPtr vertices;//PxrVector3f[]; + public uint indexCapacityInput; + public uint indexCountOutput; + public IntPtr indices;// uint16_t[] + } + 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_SPACES_LOCATE_INFO = 1000471000, + XR_TYPE_SPACE_LOCATIONS = 1000471001, + XR_TYPE_SPACE_VELOCITIES = 1000471002, + 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_SPATIAL_GRAPH_STATIC_NODE_BINDING_CREATE_INFO_MSFT = 1000049001, + XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_GET_INFO_MSFT = 1000049002, + XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_MSFT = 1000049003, + 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_BODY_TRACKER_CREATE_INFO_FB = 1000076001, + XR_TYPE_BODY_JOINTS_LOCATE_INFO_FB = 1000076002, + XR_TYPE_SYSTEM_BODY_TRACKING_PROPERTIES_FB = 1000076004, + XR_TYPE_BODY_JOINT_LOCATIONS_FB = 1000076005, + XR_TYPE_BODY_SKELETON_FB = 1000076006, + XR_TYPE_INTERACTION_PROFILE_DPAD_BINDING_EXT = 1000078000, + 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_VIVE_TRACKER_PATHS_HTCX = 1000103000, + XR_TYPE_EVENT_DATA_VIVE_TRACKER_CONNECTED_HTCX = 1000103001, + 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_HAND_TRACKING_MESH_FB = 1000110001, + XR_TYPE_HAND_TRACKING_SCALE_FB = 1000110003, + XR_TYPE_HAND_TRACKING_AIM_STATE_FB = 1000111001, + XR_TYPE_HAND_TRACKING_CAPSULES_STATE_FB = 1000112000, + XR_TYPE_SYSTEM_SPATIAL_ENTITY_PROPERTIES_FB = 1000113004, + XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_FB = 1000113003, + XR_TYPE_SPACE_COMPONENT_STATUS_SET_INFO_FB = 1000113007, + XR_TYPE_SPACE_COMPONENT_STATUS_FB = 1000113001, + XR_TYPE_EVENT_DATA_SPATIAL_ANCHOR_CREATE_COMPLETE_FB = 1000113005, + XR_TYPE_EVENT_DATA_SPACE_SET_STATUS_COMPLETE_FB = 1000113006, + 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_KEYBOARD_SPACE_CREATE_INFO_FB = 1000116009, + XR_TYPE_KEYBOARD_TRACKING_QUERY_FB = 1000116004, + XR_TYPE_SYSTEM_KEYBOARD_TRACKING_PROPERTIES_FB = 1000116002, + XR_TYPE_TRIANGLE_MESH_CREATE_INFO_FB = 1000117001, + XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES_FB = 1000118000, + XR_TYPE_PASSTHROUGH_CREATE_INFO_FB = 1000118001, + XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_FB = 1000118002, + XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB = 1000118003, + XR_TYPE_GEOMETRY_INSTANCE_CREATE_INFO_FB = 1000118004, + XR_TYPE_GEOMETRY_INSTANCE_TRANSFORM_FB = 1000118005, + XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB = 1000118006, + XR_TYPE_PASSTHROUGH_STYLE_FB = 1000118020, + XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_RGBA_FB = 1000118021, + XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_MONO_FB = 1000118022, + XR_TYPE_PASSTHROUGH_BRIGHTNESS_CONTRAST_SATURATION_FB = 1000118023, + XR_TYPE_EVENT_DATA_PASSTHROUGH_STATE_CHANGED_FB = 1000118030, + XR_TYPE_RENDER_MODEL_PATH_INFO_FB = 1000119000, + XR_TYPE_RENDER_MODEL_PROPERTIES_FB = 1000119001, + XR_TYPE_RENDER_MODEL_BUFFER_FB = 1000119002, + XR_TYPE_RENDER_MODEL_LOAD_INFO_FB = 1000119003, + XR_TYPE_SYSTEM_RENDER_MODEL_PROPERTIES_FB = 1000119004, + XR_TYPE_RENDER_MODEL_CAPABILITIES_REQUEST_FB = 1000119005, + 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_SYSTEM_MARKER_TRACKING_PROPERTIES_VARJO = 1000124000, + XR_TYPE_EVENT_DATA_MARKER_TRACKING_UPDATE_VARJO = 1000124001, + XR_TYPE_MARKER_SPACE_CREATE_INFO_VARJO = 1000124002, + XR_TYPE_FRAME_END_INFO_ML = 1000135000, + XR_TYPE_GLOBAL_DIMMER_FRAME_END_INFO_ML = 1000136000, + XR_TYPE_COORDINATE_SPACE_CREATE_INFO_ML = 1000137000, + XR_TYPE_SYSTEM_MARKER_UNDERSTANDING_PROPERTIES_ML = 1000138000, + XR_TYPE_MARKER_DETECTOR_CREATE_INFO_ML = 1000138001, + XR_TYPE_MARKER_DETECTOR_ARUCO_INFO_ML = 1000138002, + XR_TYPE_MARKER_DETECTOR_SIZE_INFO_ML = 1000138003, + XR_TYPE_MARKER_DETECTOR_APRIL_TAG_INFO_ML = 1000138004, + XR_TYPE_MARKER_DETECTOR_CUSTOM_PROFILE_INFO_ML = 1000138005, + XR_TYPE_MARKER_DETECTOR_SNAPSHOT_INFO_ML = 1000138006, + XR_TYPE_MARKER_DETECTOR_STATE_ML = 1000138007, + XR_TYPE_MARKER_SPACE_CREATE_INFO_ML = 1000138008, + XR_TYPE_LOCALIZATION_MAP_ML = 1000139000, + XR_TYPE_EVENT_DATA_LOCALIZATION_CHANGED_ML = 1000139001, + XR_TYPE_MAP_LOCALIZATION_REQUEST_INFO_ML = 1000139002, + XR_TYPE_LOCALIZATION_MAP_IMPORT_INFO_ML = 1000139003, + XR_TYPE_LOCALIZATION_ENABLE_EVENTS_INFO_ML = 1000139004, + XR_TYPE_EVENT_DATA_HEADSET_FIT_CHANGED_ML = 1000472000, + XR_TYPE_EVENT_DATA_EYE_CALIBRATION_CHANGED_ML = 1000472001, + XR_TYPE_USER_CALIBRATION_ENABLE_EVENTS_INFO_ML = 1000472002, + XR_TYPE_SPATIAL_ANCHOR_PERSISTENCE_INFO_MSFT = 1000142000, + XR_TYPE_SPATIAL_ANCHOR_FROM_PERSISTED_ANCHOR_CREATE_INFO_MSFT = 1000142001, + XR_TYPE_SCENE_MARKERS_MSFT = 1000147000, + XR_TYPE_SCENE_MARKER_TYPE_FILTER_MSFT = 1000147001, + XR_TYPE_SCENE_MARKER_QR_CODES_MSFT = 1000147002, + XR_TYPE_SPACE_QUERY_INFO_FB = 1000156001, + XR_TYPE_SPACE_QUERY_RESULTS_FB = 1000156002, + XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB = 1000156003, + XR_TYPE_SPACE_UUID_FILTER_INFO_FB = 1000156054, + XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB = 1000156052, + XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB = 1000156103, + XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB = 1000156104, + XR_TYPE_SPACE_SAVE_INFO_FB = 1000158000, + XR_TYPE_SPACE_ERASE_INFO_FB = 1000158001, + XR_TYPE_EVENT_DATA_SPACE_SAVE_COMPLETE_FB = 1000158106, + XR_TYPE_EVENT_DATA_SPACE_ERASE_COMPLETE_FB = 1000158107, + 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_SPACE_SHARE_INFO_FB = 1000169001, + XR_TYPE_EVENT_DATA_SPACE_SHARE_COMPLETE_FB = 1000169002, + XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB = 1000171000, + XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB = 1000171001, + XR_TYPE_HAPTIC_AMPLITUDE_ENVELOPE_VIBRATION_FB = 1000173001, + XR_TYPE_SEMANTIC_LABELS_FB = 1000175000, + XR_TYPE_ROOM_LAYOUT_FB = 1000175001, + XR_TYPE_BOUNDARY_2D_FB = 1000175002, + XR_TYPE_SEMANTIC_LABELS_SUPPORT_INFO_FB = 1000175010, + XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE = 1000196000, + XR_TYPE_EVENT_DATA_SCENE_CAPTURE_COMPLETE_FB = 1000198001, + XR_TYPE_SCENE_CAPTURE_REQUEST_INFO_FB = 1000198050, + XR_TYPE_SPACE_CONTAINER_FB = 1000199000, + XR_TYPE_FOVEATION_EYE_TRACKED_PROFILE_CREATE_INFO_META = 1000200000, + XR_TYPE_FOVEATION_EYE_TRACKED_STATE_META = 1000200001, + XR_TYPE_SYSTEM_FOVEATION_EYE_TRACKED_PROPERTIES_META = 1000200002, + XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES_FB = 1000201004, + XR_TYPE_FACE_TRACKER_CREATE_INFO_FB = 1000201005, + XR_TYPE_FACE_EXPRESSION_INFO_FB = 1000201002, + XR_TYPE_FACE_EXPRESSION_WEIGHTS_FB = 1000201006, + XR_TYPE_EYE_TRACKER_CREATE_INFO_FB = 1000202001, + XR_TYPE_EYE_GAZES_INFO_FB = 1000202002, + XR_TYPE_EYE_GAZES_FB = 1000202003, + XR_TYPE_SYSTEM_EYE_TRACKING_PROPERTIES_FB = 1000202004, + XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB = 1000203002, + XR_TYPE_COMPOSITION_LAYER_SETTINGS_FB = 1000204000, + XR_TYPE_HAPTIC_PCM_VIBRATION_FB = 1000209001, + XR_TYPE_DEVICE_PCM_SAMPLE_RATE_STATE_FB = 1000209002, + XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_FB = 1000212000, + XR_TYPE_LOCAL_DIMMING_FRAME_END_INFO_META = 1000216000, + XR_TYPE_PASSTHROUGH_PREFERENCES_META = 1000217000, + XR_TYPE_SYSTEM_VIRTUAL_KEYBOARD_PROPERTIES_META = 1000219001, + XR_TYPE_VIRTUAL_KEYBOARD_CREATE_INFO_META = 1000219002, + XR_TYPE_VIRTUAL_KEYBOARD_SPACE_CREATE_INFO_META = 1000219003, + XR_TYPE_VIRTUAL_KEYBOARD_LOCATION_INFO_META = 1000219004, + XR_TYPE_VIRTUAL_KEYBOARD_MODEL_VISIBILITY_SET_INFO_META = 1000219005, + XR_TYPE_VIRTUAL_KEYBOARD_ANIMATION_STATE_META = 1000219006, + XR_TYPE_VIRTUAL_KEYBOARD_MODEL_ANIMATION_STATES_META = 1000219007, + XR_TYPE_VIRTUAL_KEYBOARD_TEXTURE_DATA_META = 1000219009, + XR_TYPE_VIRTUAL_KEYBOARD_INPUT_INFO_META = 1000219010, + XR_TYPE_VIRTUAL_KEYBOARD_TEXT_CONTEXT_CHANGE_INFO_META = 1000219011, + XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_COMMIT_TEXT_META = 1000219014, + XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_BACKSPACE_META = 1000219015, + XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_ENTER_META = 1000219016, + XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_SHOWN_META = 1000219017, + XR_TYPE_EVENT_DATA_VIRTUAL_KEYBOARD_HIDDEN_META = 1000219018, + XR_TYPE_EXTERNAL_CAMERA_OCULUS = 1000226000, + XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META = 1000227000, + XR_TYPE_PERFORMANCE_METRICS_STATE_META = 1000232001, + XR_TYPE_PERFORMANCE_METRICS_COUNTER_META = 1000232002, + XR_TYPE_SPACE_LIST_SAVE_INFO_FB = 1000238000, + XR_TYPE_EVENT_DATA_SPACE_LIST_SAVE_COMPLETE_FB = 1000238001, + XR_TYPE_SPACE_USER_CREATE_INFO_FB = 1000241001, + XR_TYPE_SYSTEM_HEADSET_ID_PROPERTIES_META = 1000245000, + XR_TYPE_RECOMMENDED_LAYER_RESOLUTION_META = 1000254000, + XR_TYPE_RECOMMENDED_LAYER_RESOLUTION_GET_INFO_META = 1000254001, + XR_TYPE_SYSTEM_PASSTHROUGH_COLOR_LUT_PROPERTIES_META = 1000266000, + XR_TYPE_PASSTHROUGH_COLOR_LUT_CREATE_INFO_META = 1000266001, + XR_TYPE_PASSTHROUGH_COLOR_LUT_UPDATE_INFO_META = 1000266002, + XR_TYPE_PASSTHROUGH_COLOR_MAP_LUT_META = 1000266100, + XR_TYPE_PASSTHROUGH_COLOR_MAP_INTERPOLATED_LUT_META = 1000266101, + XR_TYPE_SPACE_TRIANGLE_MESH_GET_INFO_META = 1000269001, + XR_TYPE_SPACE_TRIANGLE_MESH_META = 1000269002, + XR_TYPE_SYSTEM_FACE_TRACKING_PROPERTIES2_FB = 1000287013, + XR_TYPE_FACE_TRACKER_CREATE_INFO2_FB = 1000287014, + XR_TYPE_FACE_EXPRESSION_INFO2_FB = 1000287015, + XR_TYPE_FACE_EXPRESSION_WEIGHTS2_FB = 1000287016, + XR_TYPE_ENVIRONMENT_DEPTH_PROVIDER_CREATE_INFO_META = 1000291000, + XR_TYPE_ENVIRONMENT_DEPTH_SWAPCHAIN_CREATE_INFO_META = 1000291001, + XR_TYPE_ENVIRONMENT_DEPTH_SWAPCHAIN_STATE_META = 1000291002, + XR_TYPE_ENVIRONMENT_DEPTH_IMAGE_ACQUIRE_INFO_META = 1000291003, + XR_TYPE_ENVIRONMENT_DEPTH_IMAGE_VIEW_META = 1000291004, + XR_TYPE_ENVIRONMENT_DEPTH_IMAGE_META = 1000291005, + XR_TYPE_ENVIRONMENT_DEPTH_HAND_REMOVAL_SET_INFO_META = 1000291006, + XR_TYPE_SYSTEM_ENVIRONMENT_DEPTH_PROPERTIES_META = 1000291007, + XR_TYPE_PASSTHROUGH_CREATE_INFO_HTC = 1000317001, + XR_TYPE_PASSTHROUGH_COLOR_HTC = 1000317002, + XR_TYPE_PASSTHROUGH_MESH_TRANSFORM_INFO_HTC = 1000317003, + XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC = 1000317004, + XR_TYPE_FOVEATION_APPLY_INFO_HTC = 1000318000, + XR_TYPE_FOVEATION_DYNAMIC_MODE_INFO_HTC = 1000318001, + XR_TYPE_FOVEATION_CUSTOM_MODE_INFO_HTC = 1000318002, + XR_TYPE_SYSTEM_ANCHOR_PROPERTIES_HTC = 1000319000, + XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_HTC = 1000319001, + XR_TYPE_ACTIVE_ACTION_SET_PRIORITIES_EXT = 1000373000, + XR_TYPE_SYSTEM_FORCE_FEEDBACK_CURL_PROPERTIES_MNDX = 1000375000, + XR_TYPE_FORCE_FEEDBACK_CURL_APPLY_LOCATIONS_MNDX = 1000375001, + XR_TYPE_HAND_TRACKING_DATA_SOURCE_INFO_EXT = 1000428000, + XR_TYPE_HAND_TRACKING_DATA_SOURCE_STATE_EXT = 1000428001, + XR_TYPE_PLANE_DETECTOR_CREATE_INFO_EXT = 1000429001, + XR_TYPE_PLANE_DETECTOR_BEGIN_INFO_EXT = 1000429002, + XR_TYPE_PLANE_DETECTOR_GET_INFO_EXT = 1000429003, + XR_TYPE_PLANE_DETECTOR_LOCATIONS_EXT = 1000429004, + XR_TYPE_PLANE_DETECTOR_LOCATION_EXT = 1000429005, + XR_TYPE_PLANE_DETECTOR_POLYGON_BUFFER_EXT = 1000429006, + XR_TYPE_SYSTEM_PLANE_DETECTION_PROPERTIES_EXT = 1000429007, + XR_TYPE_FUTURE_CANCEL_INFO_EXT = 1000469000, + XR_TYPE_FUTURE_POLL_INFO_EXT = 1000469001, + XR_TYPE_FUTURE_COMPLETION_EXT = 1000469002, + XR_TYPE_FUTURE_POLL_RESULT_EXT = 1000469003, + XR_TYPE_EVENT_DATA_USER_PRESENCE_CHANGED_EXT = 1000470000, + XR_TYPE_SYSTEM_USER_PRESENCE_PROPERTIES_EXT = 1000470001, + 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_TYPE_DEVICE_PCM_SAMPLE_RATE_GET_INFO_FB = XR_TYPE_DEVICE_PCM_SAMPLE_RATE_STATE_FB, + XR_TYPE_SPACES_LOCATE_INFO_KHR = XR_TYPE_SPACES_LOCATE_INFO, + XR_TYPE_SPACE_LOCATIONS_KHR = XR_TYPE_SPACE_LOCATIONS, + XR_TYPE_SPACE_VELOCITIES_KHR = XR_TYPE_SPACE_VELOCITIES, + + //pico system + XR_TYPE_EVENT_CONTROLLER_STATE_CHANGED_PICO = 1200006064, + XR_TYPE_EVENT_SEETHROUGH_STATE_CHANGED = 1200006065, + XR_TYPE_EVENT_KEY_EVENT = 1200006067, + XR_TYPE_EVENT_MRC_STATUS_CHANGED = 1200006072, + XR_TYPE_EVENT_LOG_LEVEL_CHANGE = 1200006086, + + //motiontracking + XR_TYPE_EVENT_MOTION_TRACKING_MDOE_CHANGED_EVENT_BD = 1200006403, + XR_TYPE_EVENT_MOTION_TRACKER_KEY_EVENT_BD = 1200006404, + XR_TYPE_EVENT_EXT_DEV_CONNECT_STATE_EVENT_BD = 1200006405, + XR_TYPE_EVENT_EXT_DEV_BATTERY_STATE_EVENT_BD = 1200006406, + XR_TYPE_EVENT_EXT_DEV_PASS_DATA_EVENT_BD = 1200006407, + + //MR + XR_TYPE_SPATIAL_ENTITY_LOCATION_GET_INFO = 1200389002, + XR_TYPE_SPATIAL_ENTITY_LOCATION_DATA = 1200389003, + XR_TYPE_SPATIAL_ENTITY_SEMANTIC_GET_INFO = 1200389004, + XR_TYPE_SPATIAL_ENTITY_SEMANTIC_DATA = 1200389005, + XR_TYPE_SPATIAL_ENTITY_BOUNDING_BOX_2D_GET_INFO = 1200389006, + XR_TYPE_SPATIAL_ENTITY_BOUNDING_BOX_2D_DATA = 1200389007, + XR_TYPE_SPATIAL_ENTITY_POLYGON_GET_INFO = 1200389008, + XR_TYPE_SPATIAL_ENTITY_POLYGON_DATA = 1200389009, + XR_TYPE_SPATIAL_ENTITY_BOUNDING_BOX_3D_GET_INFO = 1200389010, + XR_TYPE_SPATIAL_ENTITY_BOUNDING_BOX_3D_DATA = 1200389011, + XR_TYPE_SPATIAL_ENTITY_TRIANGLE_MESH_GET_INFO = 1200389012, + XR_TYPE_SPATIAL_ENTITY_TRIANGLE_MESH_DATA = 1200389013, + XR_TYPE_SENSE_DATA_PROVIDER_START_COMPLETION = 1200389014, + XR_TYPE_EVENT_DATA_SENSE_DATA_PROVIDER_STATE_CHANGED = 1200389015, + XR_TYPE_SENSE_DATA_FILTER_UUID = 1200389016, + XR_TYPE_SENSE_DATA_FILTER_SEMANTIC = 1200389017, + XR_TYPE_SENSE_DATA_QUERY_INFO = 1200389018, + XR_TYPE_SENSE_DATA_QUERY_COMPLETION = 1200389019, + XR_TYPE_QUERIED_SENSE_DATA_GET_INFO = 1200389020, + XR_TYPE_EVENT_DATA_SENSE_DATA_UPDATED = 1200389023, + XR_TYPE_SPATIAL_ENTITY_ANCHOR_RETRIEVE_INFO = 1200389025, + XR_TYPE_SENSE_DATA_PROVIDER_CREATE_INFO_SPATIAL_ANCHOR = 1200390001, + XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO = 1200390002, + XR_TYPE_SPATIAL_ANCHOR_CREATE_COMPLETION = 1200390003, + XR_TYPE_SPATIAL_ANCHOR_PERSIST_INFO = 1200390004, + XR_TYPE_SPATIAL_ANCHOR_PERSIST_COMPLETION = 1200390005, + XR_TYPE_SPATIAL_ANCHOR_UNPERSIST_INFO = 1200390006, + XR_TYPE_SPATIAL_ANCHOR_UNPERSIST_COMPLETION = 1200390007, + XR_TYPE_SCENE_CAPTURE_START_COMPLETION = 1200392002, + XR_TYPE_SENSE_DATA_PROVIDER_CREATE_INFO_SCENE_CAPTURE = 1200392003, + XR_TYPE_SENSE_DATA_PROVIDER_CREATE_INFO_SPATIAL_MESH = 1200393001, + XR_TYPE_SENSE_DATA_PROVIDER_CREATE_INFO_AUTO_SCENE_CAPTURE = 1200394001, + XR_TYPE_SENSE_DATA_PROVIDER_CREATE_INFO_SEMI_AUTO_SCENE_CAPTURE = 1200395001, + + + XR_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF + } + + public enum XrDeviceEventType + { + XR_DEVICE_CONNECTCHANGED = 0, + XR_DEVICE_MAIN_CHANGED = 1, + XR_DEVICE_VERSION = 2, + XR_DEVICE_SN = 3, + XR_DEVICE_BIND_STATUS = 4, + XR_STATION_STATUS = 5, + XR_DEVICE_IOBUSY = 6, + XR_DEVICE_OTASTAUS = 7, + XR_DEVICE_ID = 8, + XR_DEVICE_OTASATAION_PROGRESS = 9, + XR_DEVICE_OTASATAION_CODE = 10, + XR_DEVICE_OTACONTROLLER_PROGRESS = 11, + XR_DEVICE_OTACONTROLLER_CODE = 12, + XR_DEVICE_OTA_SUCCESS = 13, + XR_DEVICE_BLEMAC = 14, + XR_DEVICE_HANDNESS_CHANGED = 15, + XR_DEVICE_CHANNEL = 16, + XR_DEVICE_LOSSRATE = 17, + XR_DEVICE_THREAD_STARTED = 18, + XR_DEVICE_MENUPRESSED_STATE =19, + XR_DEVICE_HANDTRACKING_SETTING = 20, + XR_DEVICE_INPUTDEVICE_CHANGED = 21, + XR_DEVICE_SYSTEMGESTURE_STATE = 22, + XR_DEVICE_FITNESSBAND_STATE = 23, + XR_DEVICE_FITNESSBAND_BATTERY = 24, + XR_DEVICE_BODYTRACKING_STATE_ERROR_CODE = 25, + XR_DEVICE_BODYTRACKING_ACTION = 26 + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Type.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Type.cs.meta new file mode 100644 index 0000000..6f6ee8c --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Features/Utils/PXR_Type.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b4027bcf9e134f978996e95208fbfdf1 +timeCreated: 1721811878 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions.meta new file mode 100644 index 0000000..b08745d --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6d463d97699ebcb448ccf069a88807c8 +timeCreated: 1606858557 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4ControllerProfile.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4ControllerProfile.cs new file mode 100644 index 0000000..3e0f1e7 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4ControllerProfile.cs @@ -0,0 +1,736 @@ +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 +#if USE_INPUT_SYSTEM_POSE_CONTROL +using PoseControl = UnityEngine.InputSystem.XR.PoseControl; +#else +using PoseControl = UnityEngine.XR.OpenXR.Input.PoseControl; +#endif + +namespace UnityEngine.XR.OpenXR.Features.Interactions +{ + /// + /// This enables the use of PICO TouchControllers interaction profiles in OpenXR. + /// +#if UNITY_EDITOR + [UnityEditor.XR.OpenXR.Features.OpenXRFeature(UiName = "PICO4 Touch Controller Profile", + BuildTargetGroups = new[] { BuildTargetGroup.Android }, + Company = "PICO", + Desc = "Allows for mapping input to the PICO4 Touch Controller interaction profile.", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + Category = UnityEditor.XR.OpenXR.Features.FeatureCategory.Interaction, + FeatureId = featureId + )] +#endif + public class PICO4ControllerProfile : OpenXRInteractionFeature + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.unity.openxr.feature.input.PICO4touch"; + + /// + [Preserve, InputControlLayout(displayName = "PICO4 Touch Controller (OpenXR)", commonUsages = new[] { "LeftHand", "RightHand" })] + public class PICO4TouchController : XRControllerWithRumble + { + /// + /// A [Vector2Control](xref:UnityEngine.InputSystem.Controls.Vector2Control) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "Primary2DAxis", "Joystick" }, usage = "Primary2DAxis")] + public Vector2Control thumbstick { get; private set; } + + /// + /// A [AxisControl](xref:UnityEngine.InputSystem.Controls.AxisControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripAxis", "squeeze" }, usage = "Grip")] + public AxisControl grip { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripButton", "squeezeClicked" }, usage = "GripButton")] + public ButtonControl gripPressed { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings. + /// + [Preserve, InputControl(aliases = new[] { "Primary", "menuButton" }, usage = "Menu")] + public ButtonControl menu { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings. + /// + [Preserve, InputControl(aliases = new[] { "systemButton" }, usage = "system")] + public ButtonControl system { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "A", "X", "buttonA", "buttonX" }, usage = "PrimaryButton")] + public ButtonControl primaryButton { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "ATouched", "XTouched", "ATouch", "XTouch", "buttonATouched", "buttonXTouched" }, usage = "PrimaryTouch")] + public ButtonControl primaryTouched { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "B", "Y", "buttonB", "buttonY" }, usage = "SecondaryButton")] + public ButtonControl secondaryButton { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "BTouched", "YTouched", "BTouch", "YTouch", "buttonBTouched", "buttonYTouched" }, usage = "SecondaryTouch")] + public ButtonControl secondaryTouched { get; private set; } + + /// + /// A [AxisControl](xref:UnityEngine.InputSystem.Controls.AxisControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(usage = "Trigger")] + public AxisControl trigger { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "indexButton", "indexTouched", "triggerbutton" }, usage = "TriggerButton")] + public ButtonControl triggerPressed { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "indexTouch", "indexNearTouched" }, usage = "TriggerTouch")] + public ButtonControl triggerTouched { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "JoystickOrPadPressed", "thumbstickClick", "joystickClicked" }, usage = "Primary2DAxisClick")] + public ButtonControl thumbstickClicked { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "JoystickOrPadTouched", "thumbstickTouch", "joystickTouched" }, usage = "Primary2DAxisTouch")] + public ButtonControl thumbstickTouched { get; private set; } + /// + /// A that represents the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, aliases = new[] { "device", "gripPose" }, usage = "Device")] + public PoseControl devicePose { get; private set; } + + /// + /// A that represents the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, alias = "aimPose", usage = "Pointer")] + public PoseControl pointer { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) required for backwards 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, usage = "IsTracked")] + new public ButtonControl isTracked { get; private set; } + + /// + /// A [IntegerControl](xref:UnityEngine.InputSystem.Controls.IntegerControl) required for backwards compatibility with the XRSDK layouts. This represents the bit flag set to indicate what data is valid. This value is equivalent to mapping devicePose/trackingState. + /// + [Preserve, InputControl(offset = 32, usage = "TrackingState")] + new public IntegerControl trackingState { get; private set; } + + /// + /// A [Vector3Control](xref:UnityEngine.InputSystem.Controls.Vector3Control) required for backwards compatibility with the XRSDK layouts. This is the device position. For the PICO Touch device, this is both the grip and the pointer position. This value is equivalent to mapping devicePose/position. + /// + [Preserve, InputControl(offset = 36, noisy = true, alias = "gripPosition")] + new public Vector3Control devicePosition { get; private set; } + + /// + /// A [QuaternionControl](xref:UnityEngine.InputSystem.Controls.QuaternionControl) required for backwards compatibility with the XRSDK layouts. This is the device orientation. For the PICO Touch device, this is both the grip and the pointer rotation. This value is equivalent to mapping devicePose/rotation. + /// + [Preserve, InputControl(offset = 48, noisy = true, alias = "gripOrientation")] + new public QuaternionControl deviceRotation { get; private set; } + + /// + /// A [Vector3Control](xref:UnityEngine.InputSystem.Controls.Vector3Control) 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 [QuaternionControl](xref:UnityEngine.InputSystem.Controls.QuaternionControl) required for backwards compatibility with the XRSDK layouts. This is the pointer rotation. This value is equivalent to mapping pointerPose/rotation. + /// + [Preserve, InputControl(offset = 108, alias = "pointerOrientation")] + public QuaternionControl pointerRotation { get; private set; } + + /// + /// A that represents the binding. + /// + [Preserve, InputControl(usage = "Haptic")] + public HapticControl haptic { get; private set; } + + [Preserve, InputControl(usage = "BatteryLevel")] + public AxisControl batteryLevel { get; private set; } + + /// + /// Internal call used to assign controls to the the correct element. + /// + protected override void FinishSetup() + { + base.FinishSetup(); + thumbstick = GetChildControl("thumbstick"); + trigger = GetChildControl("trigger"); + triggerPressed = GetChildControl("triggerPressed"); + triggerTouched = GetChildControl("triggerTouched"); + grip = GetChildControl("grip"); + gripPressed = GetChildControl("gripPressed"); + menu = GetChildControl("menu"); + primaryButton = GetChildControl("primaryButton"); + primaryTouched = GetChildControl("primaryTouched"); + secondaryButton = GetChildControl("secondaryButton"); + secondaryTouched = GetChildControl("secondaryTouched"); + thumbstickClicked = GetChildControl("thumbstickClicked"); + thumbstickTouched = GetChildControl("thumbstickTouched"); + + 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"); + batteryLevel = GetChildControl("BatteryLevel"); + } + } + + public const string profile = "/interaction_profiles/bytedance/pico4_controller"; + + // Available Bindings + // Left Hand Only + /// + /// Constant for a boolean interaction binding '.../input/x/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonX = "/input/x/click"; + /// + /// Constant for a boolean interaction binding '.../input/x/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonXTouch = "/input/x/touch"; + /// + /// Constant for a boolean interaction binding '.../input/y/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonY = "/input/y/click"; + /// + /// Constant for a boolean interaction binding '.../input/y/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonYTouch = "/input/y/touch"; + + // Right Hand Only + /// + /// Constant for a boolean interaction binding '.../input/a/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonA = "/input/a/click"; + /// + /// Constant for a boolean interaction binding '.../input/a/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonATouch = "/input/a/touch"; + /// + /// Constant for a boolean interaction binding '..."/input/b/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonB = "/input/b/click"; + /// + /// Constant for a boolean interaction binding '.../input/b/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonBTouch = "/input/b/touch"; + + // Both Hands + /// + /// Constant for a boolean interaction binding '.../input/menu/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string menu = "/input/menu/click"; + /// + /// Constant for a boolean interaction binding '.../input/system/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs.(may not be available for application use) + /// + public const string system = "/input/system/click"; + /// + /// Constant for a float interaction binding '.../input/trigger/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string triggerClick = "/input/trigger/click"; + /// + /// Constant for a float interaction binding '.../input/trigger/value' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string trigger = "/input/trigger/value"; + /// + /// Constant for a boolean interaction binding '.../input/trigger/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string triggerTouch = "/input/trigger/touch"; + /// + /// Constant for a Vector2 interaction binding '.../input/thumbstick' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstick = "/input/thumbstick"; + /// + /// Constant for a boolean interaction binding '.../input/thumbstick/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstickClick = "/input/thumbstick/click"; + /// + /// Constant for a boolean interaction binding '.../input/thumbstick/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstickTouch = "/input/thumbstick/touch"; + /// + /// Constant for a float interaction binding '.../input/squeeze/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string squeezeClick = "/input/squeeze/click"; + /// + /// Constant for a float interaction binding '.../input/squeeze/value' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string squeezeValue = "/input/squeeze/value"; + /// + /// Constant for a pose interaction binding '.../input/grip/pose' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string grip = "/input/grip/pose"; + /// + /// Constant for a pose interaction binding '.../input/aim/pose' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string aim = "/input/aim/pose"; + /// + /// Constant for a haptic interaction binding '.../output/haptic' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string haptic = "/output/haptic"; + + public const string batteryLevel = "/input/battery/value"; + + private const string kDeviceLocalizedName = "PICO4 Touch Controller OpenXR"; + + /// + /// The OpenXR Extension string. This extension defines the interaction profile for PICO Neo3 and PICO 4 Controllers. + /// /// + public const string extensionString = "XR_BD_controller_interaction"; + + /// + protected override void RegisterDeviceLayout() + { + InputSystem.InputSystem.RegisterLayout(typeof(PICO4TouchController), + matches: new InputDeviceMatcher() + .WithInterface(XRUtilities.InterfaceMatchAnyVersion) + .WithProduct(kDeviceLocalizedName)); + } + + /// + protected override void UnregisterDeviceLayout() + { + InputSystem.InputSystem.RemoveLayout(nameof(PICO4TouchController)); + } + + /// + protected override void RegisterActionMapsWithRuntime() + { + ActionMapConfig actionMap = new ActionMapConfig() + { + name = "PICO4TouchController", + localizedName = kDeviceLocalizedName, + desiredInteractionProfile = profile, + manufacturer = "PICO", + 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() + { + // Grip + new ActionConfig() + { + name = "grip", + localizedName = "Grip", + type = ActionType.Axis1D, + usages = new List() + { + "Grip" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeezeValue, + interactionProfileName = profile, + } + } + }, + // Grip Pressed + new ActionConfig() + { + name = "gripPressed", + localizedName = "Grip Pressed", + type = ActionType.Binary, + usages = new List() + { + "GripButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeezeClick, + interactionProfileName = profile, + } + } + }, + //A / X Press + new ActionConfig() + { + name = "primaryButton", + localizedName = "Primary Button", + type = ActionType.Binary, + usages = new List() + { + "PrimaryButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonX, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonA, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + //A / X Touch + new ActionConfig() + { + name = "primaryTouched", + localizedName = "Primary Touched", + type = ActionType.Binary, + usages = new List() + { + "PrimaryTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonXTouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonATouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + //B / Y Press + new ActionConfig() + { + name = "secondaryButton", + localizedName = "Secondary Button", + type = ActionType.Binary, + usages = new List() + { + "SecondaryButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonY, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonB, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + //B / Y Touch + new ActionConfig() + { + name = "secondaryTouched", + localizedName = "Secondary Touched", + type = ActionType.Binary, + usages = new List() + { + "SecondaryTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonYTouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonBTouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + // Menu + new ActionConfig() + { + name = "menu", + localizedName = "Menu", + type = ActionType.Binary, + usages = new List() + { + "Menu" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = menu, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + } + } + }, + // System + new ActionConfig() + { + name = "system", + localizedName = "system", + type = ActionType.Binary, + usages = new List() + { + "System" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = system, + interactionProfileName = profile, + } + } + }, + // Trigger + new ActionConfig() + { + name = "trigger", + localizedName = "Trigger", + type = ActionType.Axis1D, + usages = new List() + { + "Trigger" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = trigger, + interactionProfileName = profile, + } + } + }, + // Trigger Pressed + new ActionConfig() + { + name = "triggerPressed", + localizedName = "Trigger Pressed", + type = ActionType.Binary, + usages = new List() + { + "TriggerButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = triggerClick, + interactionProfileName = profile, + } + } + }, + //Trigger Touch + new ActionConfig() + { + name = "triggerTouched", + localizedName = "Trigger Touched", + type = ActionType.Binary, + usages = new List() + { + "TriggerTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = triggerTouch, + interactionProfileName = profile, + } + } + }, + // Joystick + new ActionConfig() + { + name = "thumbstick", + localizedName = "Thumbstick", + type = ActionType.Axis2D, + usages = new List() + { + "Primary2DAxis" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstick, + interactionProfileName = profile, + } + } + }, + //Thumbstick Clicked + new ActionConfig() + { + name = "thumbstickClicked", + localizedName = "Thumbstick Clicked", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisClick" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstickClick, + interactionProfileName = profile, + } + } + }, + //Thumbstick Touched + new ActionConfig() + { + name = "thumbstickTouched", + localizedName = "Thumbstick Touched", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstickTouch, + interactionProfileName = profile, + } + } + }, + // Device Pose + new ActionConfig() + { + name = "devicePose", + localizedName = "Device Pose", + type = ActionType.Pose, + usages = new List() + { + "Device" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = grip, + interactionProfileName = profile, + } + } + }, + // Pointer Pose + 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 = "batteryLevel", + localizedName = "BatteryLevel", + type = ActionType.Axis1D, + usages = new List() + { + "BatteryLevel" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = batteryLevel, + interactionProfileName = profile, + } + } + }, + // Haptics + new ActionConfig() + { + name = "haptic", + localizedName = "Haptic Output", + type = ActionType.Vibrate, + usages = new List() { "Haptic" }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = haptic, + interactionProfileName = profile, + } + } + } + } + }; + + AddActionMap(actionMap); + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4ControllerProfile.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4ControllerProfile.cs.meta new file mode 100644 index 0000000..1874ae9 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4ControllerProfile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e2a7d8f73c864e74eb753124087176f4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4UltraControllerProfile.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4UltraControllerProfile.cs new file mode 100644 index 0000000..596a48e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4UltraControllerProfile.cs @@ -0,0 +1,737 @@ +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 +#if USE_INPUT_SYSTEM_POSE_CONTROL +using PoseControl = UnityEngine.InputSystem.XR.PoseControl; +#else +using PoseControl = UnityEngine.XR.OpenXR.Input.PoseControl; +#endif + +namespace UnityEngine.XR.OpenXR.Features.Interactions +{ + /// + /// This enables the use of PICO TouchControllers interaction profiles in OpenXR. + /// +#if UNITY_EDITOR + [UnityEditor.XR.OpenXR.Features.OpenXRFeature(UiName = "PICO4 Ultra Touch Controller Profile", + BuildTargetGroups = new[] { BuildTargetGroup.Android }, + Company = "PICO", + Desc = "Allows for mapping input to the PICO4 Ultra Touch Controller interaction profile.", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + Category = UnityEditor.XR.OpenXR.Features.FeatureCategory.Interaction, + FeatureId = featureId + )] +#endif + public class PICO4UltraControllerProfile : OpenXRInteractionFeature + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.unity.openxr.feature.input.PICO4Ultratouch"; + + /// + /// An Input System device based on the hand interaction profile in the PICO Touch Controller. + /// + [Preserve, InputControlLayout(displayName = "PICO4 Ultra Touch Controller (OpenXR)", commonUsages = new[] { "LeftHand", "RightHand" })] + public class PICO4UltraController : XRControllerWithRumble + { + /// + /// A [Vector2Control](xref:UnityEngine.InputSystem.Controls.Vector2Control) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "Primary2DAxis", "Joystick" }, usage = "Primary2DAxis")] + public Vector2Control thumbstick { get; private set; } + + /// + /// A [AxisControl](xref:UnityEngine.InputSystem.Controls.AxisControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripAxis", "squeeze" }, usage = "Grip")] + public AxisControl grip { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripButton", "squeezeClicked" }, usage = "GripButton")] + public ButtonControl gripPressed { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings. + /// + [Preserve, InputControl(aliases = new[] { "Primary", "menuButton" }, usage = "Menu")] + public ButtonControl menu { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings. + /// + [Preserve, InputControl(aliases = new[] { "systemButton" }, usage = "system")] + public ButtonControl system { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "A", "X", "buttonA", "buttonX" }, usage = "PrimaryButton")] + public ButtonControl primaryButton { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "ATouched", "XTouched", "ATouch", "XTouch", "buttonATouched", "buttonXTouched" }, usage = "PrimaryTouch")] + public ButtonControl primaryTouched { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "B", "Y", "buttonB", "buttonY" }, usage = "SecondaryButton")] + public ButtonControl secondaryButton { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "BTouched", "YTouched", "BTouch", "YTouch", "buttonBTouched", "buttonYTouched" }, usage = "SecondaryTouch")] + public ButtonControl secondaryTouched { get; private set; } + + /// + /// A [AxisControl](xref:UnityEngine.InputSystem.Controls.AxisControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(usage = "Trigger")] + public AxisControl trigger { get; private set; } + + [Preserve, InputControl(usage = "BatteryLevel")] + public AxisControl batteryLevel { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "indexButton", "indexTouched", "triggerbutton" }, usage = "TriggerButton")] + public ButtonControl triggerPressed { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "indexTouch", "indexNearTouched" }, usage = "TriggerTouch")] + public ButtonControl triggerTouched { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "JoystickOrPadPressed", "thumbstickClick", "joystickClicked" }, usage = "Primary2DAxisClick")] + public ButtonControl thumbstickClicked { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "JoystickOrPadTouched", "thumbstickTouch", "joystickTouched" }, usage = "Primary2DAxisTouch")] + public ButtonControl thumbstickTouched { get; private set; } + /// + /// A that represents the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, aliases = new[] { "device", "gripPose" }, usage = "Device")] + public PoseControl devicePose { get; private set; } + + /// + /// A that represents the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, alias = "aimPose", usage = "Pointer")] + public PoseControl pointer { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) required for backwards 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, usage = "IsTracked")] + new public ButtonControl isTracked { get; private set; } + + /// + /// A [IntegerControl](xref:UnityEngine.InputSystem.Controls.IntegerControl) required for backwards compatibility with the XRSDK layouts. This represents the bit flag set to indicate what data is valid. This value is equivalent to mapping devicePose/trackingState. + /// + [Preserve, InputControl(offset = 32, usage = "TrackingState")] + new public IntegerControl trackingState { get; private set; } + + /// + /// A [Vector3Control](xref:UnityEngine.InputSystem.Controls.Vector3Control) required for backwards compatibility with the XRSDK layouts. This is the device position. For the PICO Touch device, this is both the grip and the pointer position. This value is equivalent to mapping devicePose/position. + /// + [Preserve, InputControl(offset = 36, noisy = true, alias = "gripPosition")] + new public Vector3Control devicePosition { get; private set; } + + /// + /// A [QuaternionControl](xref:UnityEngine.InputSystem.Controls.QuaternionControl) required for backwards compatibility with the XRSDK layouts. This is the device orientation. For the PICO Touch device, this is both the grip and the pointer rotation. This value is equivalent to mapping devicePose/rotation. + /// + [Preserve, InputControl(offset = 48, noisy = true, alias = "gripOrientation")] + new public QuaternionControl deviceRotation { get; private set; } + + /// + /// A [Vector3Control](xref:UnityEngine.InputSystem.Controls.Vector3Control) 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 [QuaternionControl](xref:UnityEngine.InputSystem.Controls.QuaternionControl) required for backwards compatibility with the XRSDK layouts. This is the pointer rotation. This value is equivalent to mapping pointerPose/rotation. + /// + [Preserve, InputControl(offset = 108, alias = "pointerOrientation")] + public QuaternionControl pointerRotation { get; private set; } + + /// + /// A that represents the binding. + /// + [Preserve, InputControl(usage = "Haptic")] + public HapticControl haptic { get; private set; } + + /// + /// Internal call used to assign controls to the the correct element. + /// + protected override void FinishSetup() + { + base.FinishSetup(); + thumbstick = GetChildControl("thumbstick"); + trigger = GetChildControl("trigger"); + triggerPressed = GetChildControl("triggerPressed"); + triggerTouched = GetChildControl("triggerTouched"); + batteryLevel = GetChildControl("BatteryLevel"); + grip = GetChildControl("grip"); + gripPressed = GetChildControl("gripPressed"); + menu = GetChildControl("menu"); + primaryButton = GetChildControl("primaryButton"); + primaryTouched = GetChildControl("primaryTouched"); + secondaryButton = GetChildControl("secondaryButton"); + secondaryTouched = GetChildControl("secondaryTouched"); + thumbstickClicked = GetChildControl("thumbstickClicked"); + thumbstickTouched = GetChildControl("thumbstickTouched"); + + 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"); + } + } + + public const string profile = "/interaction_profiles/bytedance/pico4s_controller"; + + // Available Bindings + // Left Hand Only + /// + /// Constant for a boolean interaction binding '.../input/x/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonX = "/input/x/click"; + /// + /// Constant for a boolean interaction binding '.../input/x/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonXTouch = "/input/x/touch"; + /// + /// Constant for a boolean interaction binding '.../input/y/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonY = "/input/y/click"; + /// + /// Constant for a boolean interaction binding '.../input/y/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonYTouch = "/input/y/touch"; + + // Right Hand Only + /// + /// Constant for a boolean interaction binding '.../input/a/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonA = "/input/a/click"; + /// + /// Constant for a boolean interaction binding '.../input/a/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonATouch = "/input/a/touch"; + /// + /// Constant for a boolean interaction binding '..."/input/b/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonB = "/input/b/click"; + /// + /// Constant for a boolean interaction binding '.../input/b/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonBTouch = "/input/b/touch"; + + // Both Hands + /// + /// Constant for a boolean interaction binding '.../input/menu/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string menu = "/input/menu/click"; + /// + /// Constant for a boolean interaction binding '.../input/system/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs.(may not be available for application use) + /// + public const string system = "/input/system/click"; + /// + /// Constant for a float interaction binding '.../input/trigger/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string triggerClick = "/input/trigger/click"; + /// + /// Constant for a float interaction binding '.../input/trigger/value' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string trigger = "/input/trigger/value"; + /// + /// Constant for a boolean interaction binding '.../input/trigger/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string triggerTouch = "/input/trigger/touch"; + /// + /// Constant for a Vector2 interaction binding '.../input/thumbstick' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstick = "/input/thumbstick"; + /// + /// Constant for a boolean interaction binding '.../input/thumbstick/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstickClick = "/input/thumbstick/click"; + /// + /// Constant for a boolean interaction binding '.../input/thumbstick/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstickTouch = "/input/thumbstick/touch"; + /// + /// Constant for a float interaction binding '.../input/squeeze/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string squeezeClick = "/input/squeeze/click"; + /// + /// Constant for a float interaction binding '.../input/squeeze/value' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string squeezeValue = "/input/squeeze/value"; + /// + /// Constant for a pose interaction binding '.../input/grip/pose' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string grip = "/input/grip/pose"; + /// + /// Constant for a pose interaction binding '.../input/aim/pose' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string aim = "/input/aim/pose"; + /// + /// Constant for a haptic interaction binding '.../output/haptic' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string haptic = "/output/haptic"; + + public const string batteryLevel = "/input/battery/value"; + + private const string kDeviceLocalizedName = "PICO4 Ultra Touch Controller OpenXR"; + + /// + /// The OpenXR Extension string. This extension defines the interaction profile for PICO Neo3 and PICO 4 Controllers. + /// /// + public const string extensionString = "XR_BD_controller_interaction"; + + /// + protected override void RegisterDeviceLayout() + { + InputSystem.InputSystem.RegisterLayout(typeof(PICO4UltraController), + matches: new InputDeviceMatcher() + .WithInterface(XRUtilities.InterfaceMatchAnyVersion) + .WithProduct(kDeviceLocalizedName)); + } + + /// + protected override void UnregisterDeviceLayout() + { + InputSystem.InputSystem.RemoveLayout(nameof(PICO4UltraController)); + } + + /// + protected override void RegisterActionMapsWithRuntime() + { + ActionMapConfig actionMap = new ActionMapConfig() + { + name = "PICO4UltraController", + localizedName = kDeviceLocalizedName, + desiredInteractionProfile = profile, + manufacturer = "PICO", + 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() + { + // Grip + new ActionConfig() + { + name = "grip", + localizedName = "Grip", + type = ActionType.Axis1D, + usages = new List() + { + "Grip" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeezeValue, + interactionProfileName = profile, + } + } + }, + // Grip Pressed + new ActionConfig() + { + name = "gripPressed", + localizedName = "Grip Pressed", + type = ActionType.Binary, + usages = new List() + { + "GripButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeezeClick, + interactionProfileName = profile, + } + } + }, + //A / X Press + new ActionConfig() + { + name = "primaryButton", + localizedName = "Primary Button", + type = ActionType.Binary, + usages = new List() + { + "PrimaryButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonX, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonA, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + //A / X Touch + new ActionConfig() + { + name = "primaryTouched", + localizedName = "Primary Touched", + type = ActionType.Binary, + usages = new List() + { + "PrimaryTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonXTouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonATouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + //B / Y Press + new ActionConfig() + { + name = "secondaryButton", + localizedName = "Secondary Button", + type = ActionType.Binary, + usages = new List() + { + "SecondaryButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonY, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonB, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + //B / Y Touch + new ActionConfig() + { + name = "secondaryTouched", + localizedName = "Secondary Touched", + type = ActionType.Binary, + usages = new List() + { + "SecondaryTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonYTouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonBTouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + // Menu + new ActionConfig() + { + name = "menu", + localizedName = "Menu", + type = ActionType.Binary, + usages = new List() + { + "Menu" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = menu, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + } + } + }, + // System + new ActionConfig() + { + name = "system", + localizedName = "system", + type = ActionType.Binary, + usages = new List() + { + "System" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = system, + interactionProfileName = profile, + } + } + }, + // Trigger + new ActionConfig() + { + name = "trigger", + localizedName = "Trigger", + type = ActionType.Axis1D, + usages = new List() + { + "Trigger" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = trigger, + interactionProfileName = profile, + } + } + }, + // Trigger Pressed + new ActionConfig() + { + name = "triggerPressed", + localizedName = "Trigger Pressed", + type = ActionType.Binary, + usages = new List() + { + "TriggerButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = triggerClick, + interactionProfileName = profile, + } + } + }, + //Trigger Touch + new ActionConfig() + { + name = "triggerTouched", + localizedName = "Trigger Touched", + type = ActionType.Binary, + usages = new List() + { + "TriggerTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = triggerTouch, + interactionProfileName = profile, + } + } + }, + // Joystick + new ActionConfig() + { + name = "thumbstick", + localizedName = "Thumbstick", + type = ActionType.Axis2D, + usages = new List() + { + "Primary2DAxis" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstick, + interactionProfileName = profile, + } + } + }, + //Thumbstick Clicked + new ActionConfig() + { + name = "thumbstickClicked", + localizedName = "Thumbstick Clicked", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisClick" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstickClick, + interactionProfileName = profile, + } + } + }, + //Thumbstick Touched + new ActionConfig() + { + name = "thumbstickTouched", + localizedName = "Thumbstick Touched", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstickTouch, + interactionProfileName = profile, + } + } + }, + // Device Pose + new ActionConfig() + { + name = "devicePose", + localizedName = "Device Pose", + type = ActionType.Pose, + usages = new List() + { + "Device" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = grip, + interactionProfileName = profile, + } + } + }, + // Pointer Pose + new ActionConfig() + { + name = "pointer", + localizedName = "Pointer Pose", + type = ActionType.Pose, + usages = new List() + { + "Pointer" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = aim, + interactionProfileName = profile, + } + } + }, + // Trigger + new ActionConfig() + { + name = "batteryLevel", + localizedName = "BatteryLevel", + type = ActionType.Axis1D, + usages = new List() + { + "BatteryLevel" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = batteryLevel, + interactionProfileName = profile, + } + } + }, + // Haptics + new ActionConfig() + { + name = "haptic", + localizedName = "Haptic Output", + type = ActionType.Vibrate, + usages = new List() { "Haptic" }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = haptic, + interactionProfileName = profile, + } + } + } + } + }; + + AddActionMap(actionMap); + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4UltraControllerProfile.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4UltraControllerProfile.cs.meta new file mode 100644 index 0000000..034fbea --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICO4UltraControllerProfile.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f528fb360066460c862f7a0ce1d8ad4c +timeCreated: 1712037227 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICOG3ControllerProfile.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICOG3ControllerProfile.cs new file mode 100644 index 0000000..8b765ab --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICOG3ControllerProfile.cs @@ -0,0 +1,490 @@ +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 +#if USE_INPUT_SYSTEM_POSE_CONTROL +using PoseControl = UnityEngine.InputSystem.XR.PoseControl; + +#else +using PoseControl = UnityEngine.XR.OpenXR.Input.PoseControl; +#endif + +namespace UnityEngine.XR.OpenXR.Features.Interactions +{ + /// + /// This enables the use of PICO TouchControllers interaction profiles in OpenXR. + /// +#if UNITY_EDITOR + [UnityEditor.XR.OpenXR.Features.OpenXRFeature(UiName = "PICOG3 Touch Controller Profile", + BuildTargetGroups = new[] { BuildTargetGroup.Android }, + Company = "PICO", + Desc = "Allows for mapping input to the PICOG3 Touch Controller interaction profile.", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + Category = UnityEditor.XR.OpenXR.Features.FeatureCategory.Interaction, + FeatureId = featureId + )] +#endif + public class PICOG3ControllerProfile : OpenXRInteractionFeature + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.unity.openxr.feature.input.PICOG3touch"; + + /// + /// An Input System device based on the hand interaction profile in the PICO Touch Controller. + /// + [Preserve, + InputControlLayout(displayName = "PICOG3 Touch Controller (OpenXR)", commonUsages = new[] { "LeftHand", "RightHand" })] + public class PICOG3TouchController : XRControllerWithRumble + { + /// + /// A [Vector2Control](xref:UnityEngine.InputSystem.Controls.Vector2Control) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "Primary2DAxis", "Joystick" }, usage = "Primary2DAxis")] + public Vector2Control thumbstick { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings. + /// + [Preserve, InputControl(aliases = new[] { "Primary", "menuButton" }, usage = "Menu")] + public ButtonControl menu { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings. + /// + [Preserve, InputControl(aliases = new[] { "systemButton" }, usage = "system")] + public ButtonControl system { get; private set; } + + /// + /// A [AxisControl](xref:UnityEngine.InputSystem.Controls.AxisControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(usage = "Trigger")] + public AxisControl trigger { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, + InputControl(aliases = new[] { "indexButton", "indexTouched", "triggerbutton" }, usage = "TriggerButton")] + public ButtonControl triggerPressed { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, + InputControl(aliases = new[] { "JoystickOrPadPressed", "thumbstickClick", "joystickClicked" }, + usage = "Primary2DAxisClick")] + public ButtonControl thumbstickClicked { get; private set; } + + /// + /// A [Vector2Control](xref:UnityEngine.InputSystem.Controls.Vector2Control) that represents information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "Primary2DAxis", "touchpadaxes", "touchpad" }, usage = "Primary2DAxis")] + public Vector2Control trackpad { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents information from the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "joystickorpadpressed", "touchpadpressed" }, usage = "Primary2DAxisClick")] + public ButtonControl trackpadClicked { get; private set; } + + /// + /// A that represents the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, aliases = new[] { "device", "gripPose" }, usage = "Device")] + public PoseControl devicePose { get; private set; } + + /// + /// A that represents the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, alias = "aimPose", usage = "Pointer")] + public PoseControl pointer { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) required for backwards 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, usage = "IsTracked")] + new public ButtonControl isTracked { get; private set; } + + /// + /// A [IntegerControl](xref:UnityEngine.InputSystem.Controls.IntegerControl) required for backwards compatibility with the XRSDK layouts. This represents the bit flag set to indicate what data is valid. This value is equivalent to mapping devicePose/trackingState. + /// + [Preserve, InputControl(offset = 32, usage = "TrackingState")] + new public IntegerControl trackingState { get; private set; } + + /// + /// A [Vector3Control](xref:UnityEngine.InputSystem.Controls.Vector3Control) required for backwards compatibility with the XRSDK layouts. This is the device position. For the PICO Touch device, this is both the grip and the pointer position. This value is equivalent to mapping devicePose/position. + /// + [Preserve, InputControl(offset = 36, noisy = true, alias = "gripPosition")] + new public Vector3Control devicePosition { get; private set; } + + /// + /// A [QuaternionControl](xref:UnityEngine.InputSystem.Controls.QuaternionControl) required for backwards compatibility with the XRSDK layouts. This is the device orientation. For the PICO Touch device, this is both the grip and the pointer rotation. This value is equivalent to mapping devicePose/rotation. + /// + [Preserve, InputControl(offset = 48, noisy = true, alias = "gripOrientation")] + new public QuaternionControl deviceRotation { get; private set; } + + /// + /// A [Vector3Control](xref:UnityEngine.InputSystem.Controls.Vector3Control) 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 [QuaternionControl](xref:UnityEngine.InputSystem.Controls.QuaternionControl) required for backwards compatibility with the XRSDK layouts. This is the pointer rotation. This value is equivalent to mapping pointerPose/rotation. + /// + [Preserve, InputControl(offset = 108, alias = "pointerOrientation")] + public QuaternionControl pointerRotation { get; private set; } + + [Preserve, InputControl(usage = "BatteryLevel")] + public AxisControl batteryLevel { get; private set; } + + /// + /// Internal call used to assign controls to the the correct element. + /// + protected override void FinishSetup() + { + base.FinishSetup(); + thumbstick = GetChildControl("thumbstick"); + // trigger = GetChildControl("trigger"); + trigger = GetChildControl("trigger"); + triggerPressed = GetChildControl("triggerPressed"); + trackpad = GetChildControl("trackpad"); + trackpadClicked = GetChildControl("trackpadClicked"); + menu = GetChildControl("menu"); + thumbstickClicked = GetChildControl("thumbstickClicked"); + + devicePose = GetChildControl("devicePose"); + pointer = GetChildControl("pointer"); + isTracked = GetChildControl("isTracked"); + trackingState = GetChildControl("trackingState"); + devicePosition = GetChildControl("devicePosition"); + deviceRotation = GetChildControl("deviceRotation"); + pointerPosition = GetChildControl("pointerPosition"); + pointerRotation = GetChildControl("pointerRotation"); + batteryLevel = GetChildControl("BatteryLevel"); + } + } + + public const string profile = "/interaction_profiles/bytedance/pico_g3_controller"; + + // Available Bindings + /// + /// Constant for a boolean interaction binding '.../input/thumbstick/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstickClick = "/input/thumbstick/click"; + + /// + /// Constant for a Vector2 interaction binding '.../input/thumbstick' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstick = "/input/thumbstick"; + + /// + /// Constant for a float interaction binding '.../input/trigger/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string triggerClick = "/input/trigger/click"; + + /// + /// Constant for a float interaction binding '.../input/trigger/value' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string trigger = "/input/trigger/value"; + + /// + /// Constant for a pose interaction binding '.../input/aim/pose' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string aim = "/input/aim/pose"; + + /// + /// Constant for a boolean interaction binding '.../input/menu/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string menu = "/input/menu/click"; + + /// + /// Constant for a boolean interaction binding '.../input/system/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs.(may not be available for application use) + /// + public const string system = "/input/system/click"; + + /// + /// Constant for a Vector2 interaction binding '.../input/trackpad' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string trackpad = "/input/trackpad"; + /// + /// Constant for a boolean interaction binding '.../input/trackpad/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string trackpadClick = "/input/trackpad/click"; + + + /// + /// Constant for a pose interaction binding '.../input/grip/pose' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string grip = "/input/grip/pose"; + + public const string batteryLevel = "/input/battery/value"; + + private const string kDeviceLocalizedName = "PICOG3 Touch Controller OpenXR"; + + /// + /// The OpenXR Extension string. This extension defines the interaction profile for PICO Neo3 and PICO 4 Controllers. + /// /// + public const string extensionString = "XR_BD_controller_interaction"; + + /// + protected override void RegisterDeviceLayout() + { + InputSystem.InputSystem.RegisterLayout(typeof(PICOG3TouchController), + matches: new InputDeviceMatcher() + .WithInterface(XRUtilities.InterfaceMatchAnyVersion) + .WithProduct(kDeviceLocalizedName)); + } + + /// + protected override void UnregisterDeviceLayout() + { + InputSystem.InputSystem.RemoveLayout(nameof(PICOG3TouchController)); + } + + /// + protected override void RegisterActionMapsWithRuntime() + { + ActionMapConfig actionMap = new ActionMapConfig() + { + name = "PICOG3TouchController", + localizedName = kDeviceLocalizedName, + desiredInteractionProfile = profile, + manufacturer = "PICO", + 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 = "trigger", + localizedName = "Trigger", + type = ActionType.Axis1D, + usages = new List() + { + "Trigger" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = trigger, + interactionProfileName = profile, + } + } + }, + // Menu + new ActionConfig() + { + name = "menu", + localizedName = "Menu", + type = ActionType.Binary, + usages = new List() + { + "Menu" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = menu, + interactionProfileName = profile, + } + } + }, + // System + new ActionConfig() + { + name = "system", + localizedName = "system", + type = ActionType.Binary, + usages = new List() + { + "System" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = system, + interactionProfileName = profile, + } + } + }, + // Trigger Pressed + new ActionConfig() + { + name = "triggerPressed", + localizedName = "Trigger Pressed", + type = ActionType.Binary, + usages = new List() + { + "TriggerButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = triggerClick, + interactionProfileName = profile, + } + } + }, + // Joystick + new ActionConfig() + { + name = "thumbstick", + localizedName = "Thumbstick", + type = ActionType.Axis2D, + usages = new List() + { + "Primary2DAxis" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstick, + interactionProfileName = profile, + } + } + }, + //Thumbstick Clicked + 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 = "trackpad", + localizedName = "Trackpad", + type = ActionType.Axis2D, + usages = new List() + { + "Primary2DAxis" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = trackpad, + interactionProfileName = profile, + } + } + }, + new ActionConfig() + { + name = "trackpadClicked", + localizedName = "Trackpad Clicked", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisClick" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = trackpadClick, + interactionProfileName = profile, + } + } + }, + // Device Pose + 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 = "batteryLevel", + localizedName = "BatteryLevel", + type = ActionType.Axis1D, + usages = new List() + { + "BatteryLevel" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = batteryLevel, + interactionProfileName = profile, + } + } + }, + // Pointer Pose + 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/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICOG3ControllerProfile.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICOG3ControllerProfile.cs.meta new file mode 100644 index 0000000..807db9f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICOG3ControllerProfile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 21ea647c7f744df897be6365cbf559b7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICONeo3ControllerProfile.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICONeo3ControllerProfile.cs new file mode 100644 index 0000000..a8aee30 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICONeo3ControllerProfile.cs @@ -0,0 +1,732 @@ +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 +#if USE_INPUT_SYSTEM_POSE_CONTROL +using PoseControl = UnityEngine.InputSystem.XR.PoseControl; +#else +using PoseControl = UnityEngine.XR.OpenXR.Input.PoseControl; +#endif + +namespace UnityEngine.XR.OpenXR.Features.Interactions +{ + /// + /// This enables the use of PICO TouchControllers interaction profiles in OpenXR. + /// +#if UNITY_EDITOR + [UnityEditor.XR.OpenXR.Features.OpenXRFeature(UiName = "PICO Neo3 Touch Controller Profile", + BuildTargetGroups = new[] { BuildTargetGroup.Android }, + Company = "PICO", + Desc = "Allows for mapping input to the PICO Neo3 Touch Controller interaction profile.", + OpenxrExtensionStrings = extensionString, + Version = "1.0.0", + Category = UnityEditor.XR.OpenXR.Features.FeatureCategory.Interaction, + FeatureId = featureId + )] +#endif + public class PICONeo3ControllerProfile : OpenXRInteractionFeature + { + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.unity.openxr.feature.input.PICONeo3touch"; + + /// + /// An Input System device based on the hand interaction profile in the PICO Touch Controller. + /// + [Preserve, InputControlLayout(displayName = "PICO Neo3 Touch Controller (OpenXR)", commonUsages = new[] { "LeftHand", "RightHand" })] + public class PICONeo3Controller : XRControllerWithRumble + { + /// + /// A [Vector2Control](xref:UnityEngine.InputSystem.Controls.Vector2Control) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "Primary2DAxis", "Joystick" }, usage = "Primary2DAxis")] + public Vector2Control thumbstick { get; private set; } + + /// + /// A [AxisControl](xref:UnityEngine.InputSystem.Controls.AxisControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripAxis", "squeeze" }, usage = "Grip")] + public AxisControl grip { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "GripButton", "squeezeClicked" }, usage = "GripButton")] + public ButtonControl gripPressed { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings. + /// + [Preserve, InputControl(aliases = new[] { "Primary", "menuButton" }, usage = "Menu")] + public ButtonControl menu { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings. + /// + [Preserve, InputControl(aliases = new[] { "systemButton" }, usage = "system")] + public ButtonControl system { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "A", "X", "buttonA", "buttonX" }, usage = "PrimaryButton")] + public ButtonControl primaryButton { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "ATouched", "XTouched", "ATouch", "XTouch", "buttonATouched", "buttonXTouched" }, usage = "PrimaryTouch")] + public ButtonControl primaryTouched { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "B", "Y", "buttonB", "buttonY" }, usage = "SecondaryButton")] + public ButtonControl secondaryButton { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR bindings, depending on handedness. + /// + [Preserve, InputControl(aliases = new[] { "BTouched", "YTouched", "BTouch", "YTouch", "buttonBTouched", "buttonYTouched" }, usage = "SecondaryTouch")] + public ButtonControl secondaryTouched { get; private set; } + + /// + /// A [AxisControl](xref:UnityEngine.InputSystem.Controls.AxisControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(usage = "Trigger")] + public AxisControl trigger { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "indexButton", "indexTouched", "triggerbutton" }, usage = "TriggerButton")] + public ButtonControl triggerPressed { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "indexTouch", "indexNearTouched" }, usage = "TriggerTouch")] + public ButtonControl triggerTouched { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "JoystickOrPadPressed", "thumbstickClick", "joystickClicked" }, usage = "Primary2DAxisClick")] + public ButtonControl thumbstickClicked { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) that represents the OpenXR binding. + /// + [Preserve, InputControl(aliases = new[] { "JoystickOrPadTouched", "thumbstickTouch", "joystickTouched" }, usage = "Primary2DAxisTouch")] + public ButtonControl thumbstickTouched { get; private set; } + /// + /// A that represents the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, aliases = new[] { "device", "gripPose" }, usage = "Device")] + public PoseControl devicePose { get; private set; } + + /// + /// A that represents the OpenXR binding. + /// + [Preserve, InputControl(offset = 0, alias = "aimPose", usage = "Pointer")] + public PoseControl pointer { get; private set; } + + /// + /// A [ButtonControl](xref:UnityEngine.InputSystem.Controls.ButtonControl) required for backwards 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, usage = "IsTracked")] + new public ButtonControl isTracked { get; private set; } + + /// + /// A [IntegerControl](xref:UnityEngine.InputSystem.Controls.IntegerControl) required for backwards compatibility with the XRSDK layouts. This represents the bit flag set to indicate what data is valid. This value is equivalent to mapping devicePose/trackingState. + /// + [Preserve, InputControl(offset = 32, usage = "TrackingState")] + new public IntegerControl trackingState { get; private set; } + + /// + /// A [Vector3Control](xref:UnityEngine.InputSystem.Controls.Vector3Control) required for backwards compatibility with the XRSDK layouts. This is the device position. For the PICO Touch device, this is both the grip and the pointer position. This value is equivalent to mapping devicePose/position. + /// + [Preserve, InputControl(offset = 36, noisy = true, alias = "gripPosition")] + new public Vector3Control devicePosition { get; private set; } + + /// + /// A [QuaternionControl](xref:UnityEngine.InputSystem.Controls.QuaternionControl) required for backwards compatibility with the XRSDK layouts. This is the device orientation. For the PICO Touch device, this is both the grip and the pointer rotation. This value is equivalent to mapping devicePose/rotation. + /// + [Preserve, InputControl(offset = 48, noisy = true, alias = "gripOrientation")] + new public QuaternionControl deviceRotation { get; private set; } + + /// + /// A [Vector3Control](xref:UnityEngine.InputSystem.Controls.Vector3Control) 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 [QuaternionControl](xref:UnityEngine.InputSystem.Controls.QuaternionControl) required for backwards compatibility with the XRSDK layouts. This is the pointer rotation. This value is equivalent to mapping pointerPose/rotation. + /// + [Preserve, InputControl(offset = 108, alias = "pointerOrientation")] + public QuaternionControl pointerRotation { get; private set; } + + /// + /// A that represents the binding. + /// + [Preserve, InputControl(usage = "Haptic")] + public HapticControl haptic { get; private set; } + [Preserve, InputControl(usage = "BatteryLevel")] + public AxisControl batteryLevel { get; private set; } + + /// + /// Internal call used to assign controls to the the correct element. + /// + protected override void FinishSetup() + { + base.FinishSetup(); + thumbstick = GetChildControl("thumbstick"); + trigger = GetChildControl("trigger"); + triggerPressed = GetChildControl("triggerPressed"); + triggerTouched = GetChildControl("triggerTouched"); + grip = GetChildControl("grip"); + gripPressed = GetChildControl("gripPressed"); + menu = GetChildControl("menu"); + primaryButton = GetChildControl("primaryButton"); + primaryTouched = GetChildControl("primaryTouched"); + secondaryButton = GetChildControl("secondaryButton"); + secondaryTouched = GetChildControl("secondaryTouched"); + thumbstickClicked = GetChildControl("thumbstickClicked"); + thumbstickTouched = GetChildControl("thumbstickTouched"); + + devicePose = GetChildControl("devicePose"); + pointer = GetChildControl("pointer"); + + isTracked = GetChildControl("isTracked"); + trackingState = GetChildControl("trackingState"); + devicePosition = GetChildControl("devicePosition"); + deviceRotation = GetChildControl("deviceRotation"); + pointerPosition = GetChildControl("pointerPosition"); + pointerRotation = GetChildControl("pointerRotation"); + batteryLevel = GetChildControl("BatteryLevel"); + haptic = GetChildControl("haptic"); + } + } + + public const string profile = "/interaction_profiles/bytedance/pico_neo3_controller"; + + // Available Bindings + // Left Hand Only + /// + /// Constant for a boolean interaction binding '.../input/x/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonX = "/input/x/click"; + /// + /// Constant for a boolean interaction binding '.../input/x/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonXTouch = "/input/x/touch"; + /// + /// Constant for a boolean interaction binding '.../input/y/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonY = "/input/y/click"; + /// + /// Constant for a boolean interaction binding '.../input/y/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonYTouch = "/input/y/touch"; + + // Right Hand Only + /// + /// Constant for a boolean interaction binding '.../input/a/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonA = "/input/a/click"; + /// + /// Constant for a boolean interaction binding '.../input/a/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonATouch = "/input/a/touch"; + /// + /// Constant for a boolean interaction binding '..."/input/b/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonB = "/input/b/click"; + /// + /// Constant for a boolean interaction binding '.../input/b/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. This binding is only available for the user path. + /// + public const string buttonBTouch = "/input/b/touch"; + + // Both Hands + /// + /// Constant for a boolean interaction binding '.../input/menu/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string menu = "/input/menu/click"; + /// + /// Constant for a boolean interaction binding '.../input/system/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs.(may not be available for application use) + /// + public const string system = "/input/system/click"; + /// + /// Constant for a float interaction binding '.../input/trigger/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string triggerClick = "/input/trigger/click"; + /// + /// Constant for a float interaction binding '.../input/trigger/value' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string trigger = "/input/trigger/value"; + /// + /// Constant for a boolean interaction binding '.../input/trigger/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string triggerTouch = "/input/trigger/touch"; + /// + /// Constant for a Vector2 interaction binding '.../input/thumbstick' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstick = "/input/thumbstick"; + /// + /// Constant for a boolean interaction binding '.../input/thumbstick/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstickClick = "/input/thumbstick/click"; + /// + /// Constant for a boolean interaction binding '.../input/thumbstick/touch' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string thumbstickTouch = "/input/thumbstick/touch"; + /// + /// Constant for a float interaction binding '.../input/squeeze/click' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string squeezeClick = "/input/squeeze/click"; + /// + /// Constant for a float interaction binding '.../input/squeeze/value' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string squeezeValue = "/input/squeeze/value"; + /// + /// Constant for a pose interaction binding '.../input/grip/pose' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string grip = "/input/grip/pose"; + /// + /// Constant for a pose interaction binding '.../input/aim/pose' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string aim = "/input/aim/pose"; + /// + /// Constant for a haptic interaction binding '.../output/haptic' OpenXR Input Binding. Used by input subsystem to bind actions to physical inputs. + /// + public const string haptic = "/output/haptic"; + public const string batteryLevel = "/input/battery/value"; + + private const string kDeviceLocalizedName = "PICO Neo3 Touch Controller OpenXR"; + + /// + /// The OpenXR Extension string. This extension defines the interaction profile for PICO Neo3 and PICO 4 Controllers. + /// /// + public const string extensionString = "XR_BD_controller_interaction"; + + /// + protected override void RegisterDeviceLayout() + { + InputSystem.InputSystem.RegisterLayout(typeof(PICONeo3Controller), + matches: new InputDeviceMatcher() + .WithInterface(XRUtilities.InterfaceMatchAnyVersion) + .WithProduct(kDeviceLocalizedName)); + } + + /// + protected override void UnregisterDeviceLayout() + { + InputSystem.InputSystem.RemoveLayout(nameof(PICONeo3Controller)); + } + + /// + protected override void RegisterActionMapsWithRuntime() + { + ActionMapConfig actionMap = new ActionMapConfig() + { + name = "PICONeo3controller", + localizedName = kDeviceLocalizedName, + desiredInteractionProfile = profile, + manufacturer = "PICO", + 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() + { + // Grip + new ActionConfig() + { + name = "grip", + localizedName = "Grip", + type = ActionType.Axis1D, + usages = new List() + { + "Grip" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeezeValue, + interactionProfileName = profile, + } + } + }, + // Grip Pressed + new ActionConfig() + { + name = "gripPressed", + localizedName = "Grip Pressed", + type = ActionType.Binary, + usages = new List() + { + "GripButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = squeezeClick, + interactionProfileName = profile, + } + } + }, + //A / X Press + new ActionConfig() + { + name = "primaryButton", + localizedName = "Primary Button", + type = ActionType.Binary, + usages = new List() + { + "PrimaryButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonX, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonA, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + //A / X Touch + new ActionConfig() + { + name = "primaryTouched", + localizedName = "Primary Touched", + type = ActionType.Binary, + usages = new List() + { + "PrimaryTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonXTouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonATouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + //B / Y Press + new ActionConfig() + { + name = "secondaryButton", + localizedName = "Secondary Button", + type = ActionType.Binary, + usages = new List() + { + "SecondaryButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonY, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonB, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + //B / Y Touch + new ActionConfig() + { + name = "secondaryTouched", + localizedName = "Secondary Touched", + type = ActionType.Binary, + usages = new List() + { + "SecondaryTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = buttonYTouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.leftHand } + }, + new ActionBinding() + { + interactionPath = buttonBTouch, + interactionProfileName = profile, + userPaths = new List() { UserPaths.rightHand } + }, + } + }, + // Menu + new ActionConfig() + { + name = "menu", + localizedName = "Menu", + type = ActionType.Binary, + usages = new List() + { + "Menu" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = menu, + interactionProfileName = profile, + } + } + }, + // System + new ActionConfig() + { + name = "system", + localizedName = "system", + type = ActionType.Binary, + usages = new List() + { + "System" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = system, + interactionProfileName = profile, + } + } + }, + // Trigger + new ActionConfig() + { + name = "trigger", + localizedName = "Trigger", + type = ActionType.Axis1D, + usages = new List() + { + "Trigger" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = trigger, + interactionProfileName = profile, + } + } + }, + // Trigger Pressed + new ActionConfig() + { + name = "triggerPressed", + localizedName = "Trigger Pressed", + type = ActionType.Binary, + usages = new List() + { + "TriggerButton" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = triggerClick, + interactionProfileName = profile, + } + } + }, + //Trigger Touch + new ActionConfig() + { + name = "triggerTouched", + localizedName = "Trigger Touched", + type = ActionType.Binary, + usages = new List() + { + "TriggerTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = triggerTouch, + interactionProfileName = profile, + } + } + }, + // Joystick + new ActionConfig() + { + name = "thumbstick", + localizedName = "Thumbstick", + type = ActionType.Axis2D, + usages = new List() + { + "Primary2DAxis" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstick, + interactionProfileName = profile, + } + } + }, + //Thumbstick Clicked + new ActionConfig() + { + name = "thumbstickClicked", + localizedName = "Thumbstick Clicked", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisClick" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstickClick, + interactionProfileName = profile, + } + } + }, + //Thumbstick Touched + new ActionConfig() + { + name = "thumbstickTouched", + localizedName = "Thumbstick Touched", + type = ActionType.Binary, + usages = new List() + { + "Primary2DAxisTouch" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = thumbstickTouch, + interactionProfileName = profile, + } + } + }, + // Device Pose + new ActionConfig() + { + name = "devicePose", + localizedName = "Device Pose", + type = ActionType.Pose, + usages = new List() + { + "Device" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = grip, + interactionProfileName = profile, + } + } + }, + // Pointer Pose + 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 = "batteryLevel", + localizedName = "BatteryLevel", + type = ActionType.Axis1D, + usages = new List() + { + "BatteryLevel" + }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = batteryLevel, + interactionProfileName = profile, + } + } + }, + // Haptics + new ActionConfig() + { + name = "haptic", + localizedName = "Haptic Output", + type = ActionType.Vibrate, + usages = new List() { "Haptic" }, + bindings = new List() + { + new ActionBinding() + { + interactionPath = haptic, + interactionProfileName = profile, + } + } + } + } + }; + + AddActionMap(actionMap); + } + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICONeo3ControllerProfile.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICONeo3ControllerProfile.cs.meta new file mode 100644 index 0000000..f2a7094 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/PICONeo3ControllerProfile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2b8a6d03de5f8f34383932f29d464a21 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/Unity.XR.OpenXRPICO.asmdef b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/Unity.XR.OpenXRPICO.asmdef new file mode 100644 index 0000000..f67aa23 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/Unity.XR.OpenXRPICO.asmdef @@ -0,0 +1,28 @@ +{ + "name": "Unity.XR.OpenXRPico", + "rootNamespace": "", + "references": [ + "GUID:75469ad4d38634e559750d17036d5f7c", + "GUID:4847341ff46394e83bb78fbd0652937e" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.inputsystem", + "expression": "", + "define": "" + }, + { + "name": "com.unity.modules.unityanalytics", + "expression": "1.0.0", + "define": "UNITY_ANALYTICS" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/Unity.XR.OpenXRPICO.asmdef.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/Unity.XR.OpenXRPICO.asmdef.meta new file mode 100644 index 0000000..c6dd7db --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Interactions/Unity.XR.OpenXRPICO.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2d535f87539094c419e506375c5b07c2 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOFeature.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOFeature.cs new file mode 100644 index 0000000..f61247e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOFeature.cs @@ -0,0 +1,153 @@ +using System.Collections.Generic; +using UnityEngine.XR.OpenXR; +using UnityEngine.XR.OpenXR.Features; +using Object = System.Object; +using UnityEngine.XR.OpenXR.Features.Interactions; +using System; +using System.Runtime.InteropServices; +using UnityEngine; +using AOT; +using Unity.XR.PXR; + + +#if UNITY_EDITOR +using UnityEditor.PackageManager; +using UnityEditor.PackageManager.Requests; +using UnityEditor; +using UnityEditor.XR.OpenXR.Features; +#endif + +#if AR_FOUNDATION +using UnityEngine.XR.ARSubsystems; +#endif + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + /// + /// Enables the PICO mobile OpenXR Loader for Android, and modifies the AndroidManifest to be compatible with Neo3. + /// +#if UNITY_EDITOR + [OpenXRFeature(UiName = "PICO Support", + Desc = "Necessary to deploy an PICO compatible app.", + Company = "PICO", + Version = SDKVersion, + BuildTargetGroups = new[] { BuildTargetGroup.Android }, + CustomRuntimeLoaderBuildTargets = new[] { BuildTarget.Android }, + OpenxrExtensionStrings = PicoExtensionList, + FeatureId = featureId + )] +#endif + + [System.Serializable] + public class PICOFeature : OpenXRFeature + { + public const string PicoExtensionList = ""; + public const string SDKVersion = "1.3.3"; + public static Action onAppFocusedAction; + public bool isPicoSupport = false; + + + + /// + /// The feature id string. This is used to give the feature a well known id for reference. + /// + public const string featureId = "com.unity.openxr.feature.pico"; + +#if UNITY_EDITOR + static AddRequest request; + protected override void GetValidationChecks(List rules, BuildTargetGroup targetGroup) + { + OpenXRSettings settings = OpenXRSettings.GetSettingsForBuildTargetGroup(BuildTargetGroup.Android); + + + var AdditionalRules = new ValidationRule[] + { + new ValidationRule(this) + { + message = "Only the PICO Touch Interaction Profile is supported right now.", + checkPredicate = () => + { + if (null == settings) + return false; + + bool touchFeatureEnabled = false; + bool otherInteractionFeatureEnabled = false; + + foreach (var feature in settings.GetFeatures()) + { + if (feature.enabled) + { + if ((feature is PICONeo3ControllerProfile) || + (feature is PICO4UltraControllerProfile) || (feature is PICO4ControllerProfile) || + (feature is KHRSimpleControllerProfile) || (feature is EyeGazeInteraction) || + (feature is HandInteractionProfile) || (feature is PalmPoseInteraction) || + (feature is PICOG3ControllerProfile)) + touchFeatureEnabled = true; + else + otherInteractionFeatureEnabled = true; + } + } + + return touchFeatureEnabled && !otherInteractionFeatureEnabled; + }, + fixIt = () => + { + if (null == settings) + return; + + foreach (var feature in settings.GetFeatures()) + { + feature.enabled = ((feature is PICONeo3ControllerProfile) || (feature is PICO4ControllerProfile)); + } + }, + error = true, + } + }; + + rules.AddRange(AdditionalRules); + } + + static void Progress() + { + if (request != null && request.IsCompleted) + { + if (request.Status == StatusCode.Success) + Debug.Log("Installed: " + request.Result.packageId); + else if (request.Status >= StatusCode.Failure) + Debug.Log(request.Error.message); + EditorApplication.update -= Progress; + request = null; + } + } + + internal class PICOFeatureEditorWindow : EditorWindow + { + private Object feature; + private Editor featureEditor; + + public static EditorWindow Create(Object feature) + { + var window = EditorWindow.GetWindow(true, "PICO Feature Configuration", true); + window.feature = feature; + window.featureEditor = Editor.CreateEditor((UnityEngine.Object)feature); + return window; + } + + private void OnGUI() + { + featureEditor.OnInspectorGUI(); + } + } + +#endif + + + + + + + + + + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOFeature.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOFeature.cs.meta new file mode 100644 index 0000000..0302a25 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOFeature.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: baa5b568c4324bd4faad2da2e7ee7e84 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOManager.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOManager.cs new file mode 100644 index 0000000..3da6f9b --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOManager.cs @@ -0,0 +1,229 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Serialization; +using Unity.XR.CoreUtils; +using UnityEngine.XR; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public class PICOManager : MonoBehaviour + { + private const string TAG = "[PICOManager]"; + private static PICOManager instance = null; + private Camera[] eyeCamera; + private XROrigin _xrOrigin; + private XROrigin _xrOriginT; + static List s_InputSubsystems = new List(); + private float cameraYOffset; + private float cameraY; + private bool isTrackingOriginMode = false; + private TrackingOriginModeFlags currentTrackingOriginMode = TrackingOriginModeFlags.Unknown; + private Vector3 _xrOriginPos = Vector3.zero; + private Vector3 _xrOriginTPos = Vector3.zero; + private Quaternion _xrOriginRot = Quaternion.identity; + private Quaternion _xrOriginTRot = Quaternion.identity; + private static GameObject local = null; + + + private Vector3 lastOriginPos = Vector3.zero; + private Quaternion lastOriginRot = Quaternion.identity; + + private Vector3 lastOriginTPos = Vector3.zero; + private Quaternion lastOriginTRot = Quaternion.identity; + + + public static PICOManager Instance + { + get + { + if (instance == null) + { + instance = FindObjectOfType(); + if (instance == null) + { + XROrigin origin = Camera.main.transform.GetComponentInParent(); + if (origin != null) + { + instance = origin.gameObject.AddComponent(); + } + else + { + GameObject go = new GameObject("[PICOManager]"); + DontDestroyOnLoad(go); + instance = go.AddComponent(); + } + + } + } + + return instance; + } + } + + void Awake() + { + eyeCamera = new Camera[3]; + Camera[] cam = gameObject.GetComponentsInChildren(); + + for (int i = 0; i < cam.Length; i++) + { + if (cam[i].stereoTargetEye == StereoTargetEyeMask.Both && cam[i] == Camera.main) + { + eyeCamera[0] = cam[i]; + } + else if (cam[i].stereoTargetEye == StereoTargetEyeMask.Left) + { + eyeCamera[1] = cam[i]; + } + else if (cam[i].stereoTargetEye == StereoTargetEyeMask.Right) + { + eyeCamera[2] = cam[i]; + } + } + + _xrOrigin = gameObject.GetComponent(); + + if (_xrOrigin != null) + { + _xrOriginPos = new Vector3(Camera.main.transform.position.x, _xrOrigin.transform.position.y, Camera.main.transform.position.z); + cameraYOffset = _xrOrigin.CameraYOffset; + } + _xrOriginRot = Camera.main.transform.parent.rotation; + cameraY = this.transform.position.y; + + if (local == null) + { + local = new GameObject(); + } + } + + public float getCameraYOffset() + { + if (currentTrackingOriginMode == TrackingOriginModeFlags.Floor) + { + return cameraY; + } + + return cameraY + cameraYOffset; + } + + private void Update() + { + if (!isTrackingOriginMode) + { + XRInputSubsystem subsystem = null; + SubsystemManager.GetInstances(s_InputSubsystems); + if (s_InputSubsystems.Count > 0) + { + subsystem = s_InputSubsystems[0]; + } + + var mCurrentTrackingOriginMode = subsystem?.GetTrackingOriginMode(); + if (mCurrentTrackingOriginMode != null) + { + isTrackingOriginMode = true; + currentTrackingOriginMode = (TrackingOriginModeFlags)mCurrentTrackingOriginMode; + } + } + } + + private void OnEnable() + { + if (Camera.main.gameObject.GetComponent() == null) + { + Camera.main.gameObject.AddComponent(); + } + + foreach (var layer in CompositeLayerFeature.Instances) + { + if (eyeCamera[0] != null && eyeCamera[0].enabled) + { + layer.RefreshCamera(eyeCamera[0], eyeCamera[0]); + } + else if (eyeCamera[1] != null && eyeCamera[1].enabled) + { + layer.RefreshCamera(eyeCamera[1], eyeCamera[2]); + } + } + } + + public Camera[] GetEyeCamera() + { + return eyeCamera; + } + + public float GetOriginY() + { + return _xrOrigin.transform.position.y; + } + + public bool GetOrigin(ref Vector3 pos, ref Quaternion rotation, ref Transform origin) + { + Transform transform = local.GetComponent(); + transform.rotation = Quaternion.identity; + origin = transform; + XROrigin xrOrigin = FindObjectOfType(); + + if (!xrOrigin) + { + PLog.e(TAG + $" xrOrigin is false!"); + pos = Vector3.zero; + rotation = Quaternion.identity; + return false; + } + + if (xrOrigin == _xrOrigin) + { + if (xrOrigin.transform.position != lastOriginPos || xrOrigin.transform.rotation != lastOriginRot) + { + _xrOriginPos.x = Camera.main.transform.position.x; + _xrOriginPos.y = xrOrigin.transform.position.y; + _xrOriginPos.z = Camera.main.transform.position.z; + _xrOriginRot = Camera.main.transform.parent.rotation; + lastOriginPos = xrOrigin.transform.position; + lastOriginRot = xrOrigin.transform.rotation; + } + + pos = _xrOriginPos; + rotation = _xrOriginRot; + return true; + } + else if (xrOrigin == _xrOriginT) + { + if (xrOrigin.transform.position != lastOriginTPos || xrOrigin.transform.rotation != lastOriginTRot) + { + _xrOriginTPos.x = Camera.main.transform.position.x; + _xrOriginTPos.y = xrOrigin.transform.position.y; + _xrOriginTPos.z = Camera.main.transform.position.z; + _xrOriginTRot = Camera.main.transform.parent.rotation; + lastOriginTPos = xrOrigin.transform.position; + lastOriginTRot = xrOrigin.transform.rotation; + } + pos = _xrOriginTPos; + rotation = _xrOriginTRot; + return true; + } + + _xrOriginT = xrOrigin; + _xrOriginTPos = new Vector3(Camera.main.transform.parent.position.x, xrOrigin.transform.position.y, Camera.main.transform.parent.position.z); + _xrOriginTRot = Camera.main.transform.parent.rotation; + pos = _xrOriginTPos; + rotation = _xrOriginTRot; + return true; + } + public float GetRefreshRate() + { + float i = -1; + DisplayRefreshRateFeature.GetDisplayRefreshRate(ref i); + return i; + } + + public XrExtent2Df GetReferenceSpaceBoundsRect() + { + XrExtent2Df extent2D = new XrExtent2Df(); + OpenXRExtensions.GetReferenceSpaceBoundsRect(XrReferenceSpaceType.Stage, ref extent2D); + return extent2D; + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOManager.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOManager.cs.meta new file mode 100644 index 0000000..81eb7d8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9ec797a80375463e9a82f82a3336c730 +timeCreated: 1687327226 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOProjectSetting.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOProjectSetting.cs new file mode 100644 index 0000000..69c20d8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOProjectSetting.cs @@ -0,0 +1,100 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained herein are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System.IO; +using Unity.XR.PXR; +using UnityEditor; +using UnityEngine; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + [System.Serializable] + public class PICOProjectSetting: ScriptableObject + { + public bool useContentProtect; + public bool isEyeTracking; + public bool MRSafeguard; + public bool isHandTracking; + public bool isEyeTrackingCalibration; + public SystemDisplayFrequency displayFrequency; + public SecureContentFlag contentProtectFlags ; + public bool foveationEnable; + public FoveationFeature.FoveatedRenderingMode foveatedRenderingMode; + public FoveationFeature.FoveatedRenderingLevel foveatedRenderingLevel; + public bool isSubsampledEnabled; + + [SerializeField, Tooltip("Set the system splash screen picture in PNG format.")] + public Texture2D systemSplashScreen; + private string splashPath = string.Empty; + + public static PICOProjectSetting GetProjectConfig() + { + PICOProjectSetting projectConfig = Resources.Load("PICOProjectSetting"); +#if UNITY_EDITOR + if (projectConfig == null) + { + projectConfig = CreateInstance(); + projectConfig.useContentProtect = false; + projectConfig.contentProtectFlags = SecureContentFlag.SECURE_CONTENT_OFF; + projectConfig.isEyeTracking = false; + projectConfig.isEyeTrackingCalibration = false; + projectConfig.isHandTracking = false; + projectConfig.MRSafeguard = false; + projectConfig.displayFrequency = SystemDisplayFrequency.Default; + projectConfig.foveationEnable = false; + projectConfig.foveatedRenderingMode = FoveationFeature.FoveatedRenderingMode.FixedFoveatedRendering; + projectConfig.foveatedRenderingLevel = FoveationFeature.FoveatedRenderingLevel.Off; + projectConfig.isSubsampledEnabled = false; + string path = Application.dataPath + "/Resources"; + if (!Directory.Exists(path)) + { + UnityEditor.AssetDatabase.CreateFolder("Assets", "Resources"); + UnityEditor.AssetDatabase.CreateAsset(projectConfig, "Assets/Resources/PICOProjectSetting.asset"); + } + else + { + UnityEditor.AssetDatabase.CreateAsset(projectConfig, "Assets/Resources/PICOProjectSetting.asset"); + } + } +#endif + return projectConfig; + } + +#if UNITY_EDITOR + private void OnValidate() + { + if (systemSplashScreen != null) + { + splashPath = AssetDatabase.GetAssetPath(systemSplashScreen); + if (Path.GetExtension(splashPath).ToLower() != ".png") + { + systemSplashScreen = null; + Debug.LogError("Invalid file format of System Splash Screen, only PNG format is supported. The asset path: " + splashPath); + splashPath = string.Empty; + } + } + } + + public string GetSystemSplashScreen(string path) + { + if (systemSplashScreen == null || splashPath == string.Empty) + { + return "0"; + } + + string targetPath = Path.Combine(path, "src/main/assets/pico_splash.png"); + FileUtil.ReplaceFile(splashPath, targetPath); + return "1"; + } +#endif + } +} diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOProjectSetting.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOProjectSetting.cs.meta new file mode 100644 index 0000000..cc58b3a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOProjectSetting.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 89a60a618e414e42a47a5948037b63ab +timeCreated: 1687332959 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOScreenFade.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOScreenFade.cs new file mode 100644 index 0000000..1687add --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOScreenFade.cs @@ -0,0 +1,214 @@ +/******************************************************************************* +Copyright © 2015-2022 PICO Technology Co., Ltd.All rights reserved. + +NOTICE:All information contained herein is, and remains the property of +PICO Technology Co., Ltd. The intellectual and technical concepts +contained hererin are proprietary to PICO Technology Co., Ltd. and may be +covered by patents, patents in process, and are protected by trade secret or +copyright law. Dissemination of this information or reproduction of this +material is strictly forbidden unless prior written permission is obtained from +PICO Technology Co., Ltd. +*******************************************************************************/ + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public class PICOScreenFade : MonoBehaviour + { + [Tooltip("The gradient of time.")] + public float gradientTime = 5.0f; + [Tooltip("Basic color.")] + public Color fadeColor = new Color(0.0f, 0.0f, 0.0f, 1.0f); + [Tooltip("The default value is 4000.")] + private int renderQueue = 4000; + private MeshRenderer gradientMeshRenderer; + private MeshFilter gradientMeshFilter; + private Material gradientMaterial = null; + private bool isGradient = false; + private float currentAlpha; + private float nowFadeAlpha; + private List verts; + private List indices; + private int N = 5; + + void Awake() + { + CreateFadeMesh(); + SetCurrentAlpha(0); + } + void OnEnable() + { + StartCoroutine(ScreenFade()); + } + void OnDestroy() + { + DestoryGradientMesh(); + } + + private void CreateFadeMesh() + { + verts = new List(); + indices = new List(); + gradientMaterial = new Material(Shader.Find("PXR_SDK/PXR_Fade")); + gradientMeshFilter = gameObject.AddComponent(); + gradientMeshRenderer = gameObject.AddComponent(); + + CreateModel(); + } + + + + public void SetCurrentAlpha(float alpha) + { + currentAlpha = alpha; + SetAlpha(); + } + + IEnumerator ScreenFade() + { + float nowTime = 0.0f; + while (nowTime < gradientTime) + { + nowTime += Time.deltaTime; + nowFadeAlpha = Mathf.Lerp(1.0f, 0, Mathf.Clamp01(nowTime / gradientTime)); + SetAlpha(); + yield return new WaitForEndOfFrame(); + } + } + + private void SetAlpha() + { + Color color = fadeColor; + color.a = Mathf.Max(currentAlpha, nowFadeAlpha); + isGradient = color.a > 0; + if (gradientMaterial != null) + { + gradientMaterial.color = color; + gradientMaterial.renderQueue = renderQueue; + gradientMeshRenderer.material = gradientMaterial; + gradientMeshRenderer.enabled = isGradient; + } + } + + void CreateModel() + { + for (float i = -N / 2f; i <= N / 2f; i++) + { + for (float j = -N / 2f; j <= N / 2f; j++) + { + verts.Add(new Vector3(i, j, -N / 2f)); + } + } + for (float i = -N / 2f; i <= N / 2f; i++) + { + for (float j = -N / 2f; j <= N / 2f; j++) + { + verts.Add(new Vector3(N / 2f, j, i)); + } + } + for (float i = -N / 2f; i <= N / 2f; i++) + { + for (float j = -N / 2f; j <= N / 2f; j++) + { + verts.Add(new Vector3(i, N / 2f, j)); + } + } + for (float i = -N / 2f; i <= N / 2f; i++) + { + for (float j = -N / 2f; j <= N / 2f; j++) + { + verts.Add(new Vector3(-N / 2f, j, i)); + } + } + for (float i = -N / 2f; i <= N / 2f; i++) + { + for (float j = -N / 2f; j <= N / 2f; j++) + { + verts.Add(new Vector3(i, j, N / 2f)); + } + } + for (float i = -N / 2f; i <= N / 2f; i++) + { + for (float j = -N / 2f; j <= N / 2f; j++) + { + verts.Add(new Vector3(i, -N / 2f, j)); + } + } + + for (int i = 0; i < verts.Count; i++) + { + verts[i] = verts[i].normalized * 0.7f; + } + + CreateMakePos(0); + CreateMakePos(1); + CreateMakePos(2); + OtherMakePos(3); + OtherMakePos(4); + OtherMakePos(5); + Mesh mesh = new Mesh(); + mesh.vertices = verts.ToArray(); + mesh.triangles = indices.ToArray(); + mesh.RecalculateNormals(); + mesh.RecalculateBounds(); + Vector3[] normals = mesh.normals; + for (int i = 0; i < normals.Length; i++) + { + normals[i] = -normals[i]; + } + mesh.normals = normals; + int[] triangles = mesh.triangles; + for (int i = 0; i < triangles.Length; i += 3) + { + int t = triangles[i]; + triangles[i] = triangles[i + 2]; + triangles[i + 2] = t; + } + mesh.triangles = triangles; + gradientMeshFilter.mesh = mesh; + } + public void CreateMakePos(int num) + { + for (int i = 0; i < N; i++) + { + for (int j = 0; j < N; j++) + { + int index = j * (N + 1) + (N + 1) * (N + 1) * num + i; + int up = (j + 1) * (N + 1) + (N + 1) * (N + 1) * num + i; + indices.AddRange(new int[] { index, index + 1, up + 1 }); + indices.AddRange(new int[] { index, up + 1, up }); + } + } + } + public void OtherMakePos(int num) + { + for (int i = 0; i < N + 1; i++) + { + for (int j = 0; j < N + 1; j++) + { + if (i != N && j != N) + { + int index = j * (N + 1) + (N + 1) * (N + 1) * num + i; + int up = (j + 1) * (N + 1) + (N + 1) * (N + 1) * num + i; + indices.AddRange(new int[] { index, up + 1, index + 1 }); + indices.AddRange(new int[] { index, up, up + 1 }); + } + } + } + } + private void DestoryGradientMesh() + { + if (gradientMeshRenderer != null) + Destroy(gradientMeshRenderer); + + if (gradientMaterial != null) + Destroy(gradientMaterial); + + if (gradientMeshFilter != null) + Destroy(gradientMeshFilter); + } + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOScreenFade.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOScreenFade.cs.meta new file mode 100644 index 0000000..b826aa8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/PICOScreenFade.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ae53b0fa39b974c4baa34ac3a2c235c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem.meta new file mode 100644 index 0000000..070db1e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 191be929ace1ecf4cab70c030e1a0409 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOAnchorSubsystem.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOAnchorSubsystem.cs new file mode 100644 index 0000000..76c422a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOAnchorSubsystem.cs @@ -0,0 +1,165 @@ +#if AR_FOUNDATION +using System; +using System.Collections; +using System.Collections.Generic; +using System.Threading.Tasks; +using Unity.Collections; +using UnityEngine; +using UnityEngine.XR.ARSubsystems; + +namespace Unity.XR.PXR +{ + public class PICOAnchorSubsystem : XRAnchorSubsystem + { + internal const string k_SubsystemId = "PICOAnchorSubsystem"; + + class AnchorProvider : Provider + { + private Dictionary trackableIdToHandleMap; + private Dictionary handleToXRAnchorMap; + private HashSet managedAnchorHandles; + private Dictionary lastAnchorToTime; + private bool isInit = false; + + public override void Start() + { + StartSpatialAnchorProvider(); + } + + private async void StartSpatialAnchorProvider() + { + var result = await PXR_MixedReality.StartSenseDataProvider(PxrSenseDataProviderType.SpatialAnchor); + if (result == PxrResult.SUCCESS) + { + if (!isInit) + { + trackableIdToHandleMap = new Dictionary(); + handleToXRAnchorMap = new Dictionary(); + managedAnchorHandles = new HashSet(); + isInit = true; + } + } + else + { + Debug.LogError("Spatial Anchor Provider Start Failed:" + result); + } + } + + public override void Stop() + { + var result = PXR_MixedReality.StopSenseDataProvider(PxrSenseDataProviderType.SpatialAnchor); + if (result == PxrResult.SUCCESS) + { + + } + else + { + Debug.LogError("Spatial Anchor Provider Stop Failed:" + result); + } + } + + public override void Destroy() + { + + } + + public override TrackableChanges GetChanges(XRAnchor defaultAnchor, Allocator allocator) + { + return new TrackableChanges(); + } + + public override bool TryAddAnchor(Pose pose, out XRAnchor anchor) + { + var tcs = new TaskCompletionSource<(PxrResult result, ulong anchorHandle, Guid uuid)>(); + var tcs2 = new TaskCompletionSource(); + Task.Run(() => + { + var (pxrResult, handle, guid) = PXR_MixedReality.CreateSpatialAnchorAsync(pose.position, pose.rotation).Result; + + tcs.SetResult((pxrResult, handle, guid)); + }); + var (result, anchorHandle, uuid) = tcs.Task.Result; + if (result == PxrResult.SUCCESS) + { + Task.Run(() => + { + var pxrResult = PXR_MixedReality.PersistSpatialAnchorAsync(anchorHandle).Result; + + tcs2.SetResult(pxrResult); + }); + + var result2 = tcs2.Task.Result; + if (result2 == PxrResult.SUCCESS) + { + var bytes = uuid.ToByteArray(); + var trackabledId = new TrackableId(BitConverter.ToUInt64(bytes, 0), BitConverter.ToUInt64(bytes, 8)); + var nativePtr = new IntPtr((long)anchorHandle); + anchor = new XRAnchor(trackabledId, pose, TrackingState.Tracking, nativePtr); + trackableIdToHandleMap[trackabledId] = anchorHandle; + handleToXRAnchorMap[anchorHandle] = anchor; + return true; + } + else + { + anchor = XRAnchor.defaultValue; + return false; + } + } + else + { + anchor = XRAnchor.defaultValue; + return false; + } + } + + public async Task QuerySpatialAnchors() + { + return false; + } + + public override bool TryRemoveAnchor(TrackableId anchorId) + { + var anchorHandle = trackableIdToHandleMap[anchorId]; + var result = PXR_MixedReality.DestroyAnchor(anchorHandle); + if (result == PxrResult.SUCCESS) + { + var tcs = new TaskCompletionSource(); + Task.Run(() => + { + var pxrResult = PXR_MixedReality.UnPersistSpatialAnchorAsync(anchorHandle).Result; + + tcs.SetResult(pxrResult); + }); + var result1 = tcs.Task.Result; + if (result1 == PxrResult.SUCCESS) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + + } + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] + static void RegisterDescriptor() + { + var cInfo = new XRAnchorSubsystemDescriptor.Cinfo() + { + id = k_SubsystemId, + providerType = typeof(AnchorProvider), + subsystemTypeOverride = typeof(PICOAnchorSubsystem), + supportsTrackableAttachments = false + }; + XRAnchorSubsystemDescriptor.Create(cInfo); + } + } +} +#endif diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOAnchorSubsystem.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOAnchorSubsystem.cs.meta new file mode 100644 index 0000000..54e0ca3 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOAnchorSubsystem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3fc1ceb510674152beda5a7148d8a52d +timeCreated: 1723083100 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOCameraSubsystem.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOCameraSubsystem.cs new file mode 100644 index 0000000..95f4654 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOCameraSubsystem.cs @@ -0,0 +1,70 @@ +#if AR_FOUNDATION +using UnityEngine; +using UnityEngine.XR.ARSubsystems; + +namespace Unity.XR.OpenXR.Features.PICOSupport +{ + public class PICOCameraSubsystem: XRCameraSubsystem + { + internal const string k_SubsystemId = "PICOCameraSubsystem"; + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] + static void RegisterDescriptor() + { + var cameraSubsystemCinfo = new XRCameraSubsystemCinfo + { + id = k_SubsystemId, + providerType = typeof(PICOOpenXRProvider), + subsystemTypeOverride = typeof(PICOCameraSubsystem), + supportsAverageBrightness = false, + supportsAverageColorTemperature = false, + supportsColorCorrection = false, + supportsDisplayMatrix = false, + supportsProjectionMatrix = false, + supportsTimestamp = false, + supportsCameraConfigurations = false, + supportsCameraImage = false, + supportsAverageIntensityInLumens = false, + supportsFocusModes = false, + supportsFaceTrackingAmbientIntensityLightEstimation = false, + supportsFaceTrackingHDRLightEstimation = false, + supportsWorldTrackingAmbientIntensityLightEstimation = false, + supportsWorldTrackingHDRLightEstimation = false, + supportsCameraGrain = false, + }; + + if (!XRCameraSubsystem.Register(cameraSubsystemCinfo)) + { + PLog.e($"Failed to register the {k_SubsystemId} subsystem."); + } + } + + class PICOOpenXRProvider : Provider + { + /// + /// Construct the camera functionality provider for Meta. + /// + public PICOOpenXRProvider() + { + } + + /// + /// Start the camera functionality. + /// + public override void Start() => PassthroughFeature.EnableSeeThroughManual(true); + + /// + /// Stop the camera functionality. + /// + public override void Stop() => PassthroughFeature.EnableSeeThroughManual(false); + + /// + /// Destroy any resources required for the camera functionality. + /// + public override void Destroy() => PassthroughFeature.Destroy(); + + + } + + } +} +#endif \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOCameraSubsystem.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOCameraSubsystem.cs.meta new file mode 100644 index 0000000..6f9baa8 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOCameraSubsystem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 871b6ba16680eb74d9d891e95cf83bdc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOSessionSubsystem.cs b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOSessionSubsystem.cs new file mode 100644 index 0000000..918a950 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOSessionSubsystem.cs @@ -0,0 +1,114 @@ +#if AR_FOUNDATION +using Unity.XR.OpenXR.Features.PICOSupport; +using Unity.XR.PXR; +using UnityEngine; +using UnityEngine.XR.ARSubsystems; + +public class PICOSessionSubsystem : XRSessionSubsystem +{ + internal const string k_SubsystemId = "PICOSessionSubsystem"; + + internal static PICOSessionSubsystem instance { get; private set; } + + /// + /// Do not call this directly. Call create on a valid instead. + /// + public PICOSessionSubsystem() + { + instance = this; + } + + internal void OnSessionStateChange(int newState) + => ((SessionProvider)provider).OnSessionStateChange(newState); + + class SessionProvider : Provider + { + XrSessionState m_SessionState; + + /// + public override TrackingState trackingState + { + get + { + switch (m_SessionState) + { + case XrSessionState.Idle: + case XrSessionState.Ready: + case XrSessionState.Synchronized: + return TrackingState.Limited; + + case XrSessionState.Visible: + case XrSessionState.Focused: + return TrackingState.Tracking; + + case XrSessionState.Unknown: + case XrSessionState.Stopping: + case XrSessionState.LossPending: + case XrSessionState.Exiting: + default: + return TrackingState.None; + } + } + } + + /// + public override NotTrackingReason notTrackingReason + { + get + { + switch (m_SessionState) + { + case XrSessionState.Idle: + case XrSessionState.Ready: + case XrSessionState.Synchronized: + return NotTrackingReason.Initializing; + + case XrSessionState.Visible: + case XrSessionState.Focused: + return NotTrackingReason.None; + + case XrSessionState.Unknown: + case XrSessionState.Stopping: + case XrSessionState.LossPending: + case XrSessionState.Exiting: + default: + return NotTrackingReason.Unsupported; + } + } + } + + public void OnSessionStateChange(int newState) + { + m_SessionState = (XrSessionState)newState; + PLog.i(k_SubsystemId, $" OnSessionStateChange m_SessionState:{m_SessionState}"); + } + } + + enum XrSessionState + { + Unknown = 0, + Idle = 1, + Ready = 2, + Synchronized = 3, + Visible = 4, + Focused = 5, + Stopping = 6, + LossPending = 7, + Exiting = 8, + } + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] + static void RegisterDescriptor() + { + XRSessionSubsystemDescriptor.RegisterDescriptor(new XRSessionSubsystemDescriptor.Cinfo + { + id = k_SubsystemId, + providerType = typeof(SessionProvider), + subsystemTypeOverride = typeof(PICOSessionSubsystem), + supportsInstall = false, + supportsMatchFrameRate = false + }); + } + +} +#endif \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOSessionSubsystem.cs.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOSessionSubsystem.cs.meta new file mode 100644 index 0000000..b5f64be --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Subsystem/PICOSessionSubsystem.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 98b3f31743cc4f1bb07a6c05b82dcd10 +timeCreated: 1723083167 \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Unity.XR.OpenXR.Features.PICOSupport.asmdef b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Unity.XR.OpenXR.Features.PICOSupport.asmdef new file mode 100644 index 0000000..13f2211 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Unity.XR.OpenXR.Features.PICOSupport.asmdef @@ -0,0 +1,26 @@ +{ + "name": "Unity.XR.OpenXR.Features.PICOSupport", + "rootNamespace": "", + "references": [ + "GUID:92703082f92b41ba80f0d6912de66115", + "GUID:4847341ff46394e83bb78fbd0652937e", + "GUID:2d535f87539094c419e506375c5b07c2", + "GUID:dc960734dc080426fa6612f1c5fe95f3", + "GUID:75469ad4d38634e559750d17036d5f7c" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.xr.arfoundation", + "expression": "5.1.2", + "define": "AR_FOUNDATION" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Unity.XR.OpenXR.Features.PICOSupport.asmdef.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Unity.XR.OpenXR.Features.PICOSupport.asmdef.meta new file mode 100644 index 0000000..df9e0a0 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/Unity.XR.OpenXR.Features.PICOSupport.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d1451cc2aec4ed743adcac8be3b46381 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/UnitySubsystemsManifest.json b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/UnitySubsystemsManifest.json new file mode 100644 index 0000000..c29157e --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/UnitySubsystemsManifest.json @@ -0,0 +1,10 @@ +{ + "name": "pico_openxr", + "version": "1.3.3", + "libraryName": "openxr_pico", + "meshings": [ + { + "id": "PICO Mesh" + } + ] +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/UnitySubsystemsManifest.json.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/UnitySubsystemsManifest.json.meta new file mode 100644 index 0000000..040011f --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/Runtime/UnitySubsystemsManifest.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fc0a9a1cf44b30244b4843fd2db9905b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/package.json b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/package.json new file mode 100644 index 0000000..3f2b59a --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/package.json @@ -0,0 +1,18 @@ +{ + "name": "com.unity.xr.openxr.picoxr", + "displayName": "PICO OpenXR Plugin", + "version": "1.3.3", + "unity": "2021.3", + "description": "Provides display and input support for PICO devices.", + "keywords": [ + "picoxr", + "openxr", + "xr", + "reality", + "xreditorsubsystem" + ], + "dependencies": { + "com.unity.xr.core-utils": "2.2.0", + "com.unity.xr.openxr": "1.8.2" + } +} \ No newline at end of file diff --git a/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/package.json.meta b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/package.json.meta new file mode 100644 index 0000000..ddd88f4 --- /dev/null +++ b/Packages/PICO Unity OpenXR Integration SDK-1.3.0-20241011/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8bcb0c00dcb11f9498998922f49d8a15 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 362dde7..d2954c5 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -267,6 +267,15 @@ }, "url": "https://packages.unity.com" }, + "com.unity.xr.openxr.picoxr": { + "version": "file:PICO Unity OpenXR Integration SDK-1.3.0-20241011", + "depth": 0, + "source": "embedded", + "dependencies": { + "com.unity.xr.core-utils": "2.2.0", + "com.unity.xr.openxr": "1.8.2" + } + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, + /// An Input System device based on the hand interaction profile in the PICO Touch Controller. + ///

QZ^%$nT)azG6 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

j6ti_gP$)A8wZAt2KMfO{s?|{^XJ0PY+z{8 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