// // /*=============================================================================== // // Copyright (C) 2025 PhantomsXR Ltd. All Rights Reserved. // // // // This file is part of the Phantom.XRMOD.QuestModule.Runtime. // // // // The XR-MOD cannot be copied, distributed, or made available to // // third-parties for commercial purposes without written permission of PhantomsXR Ltd. // // // // Contact nswell@phantomsxr.com for licensing requests. // // ===============================================================================*/ using Phantom.XRMOD.Core.Runtime; using Phantom.XRMOD.OpenXRMOD.Runtime; using Phantom.XRMOD.XRMODInput.Runtime; using UnityEngine; using UnityEngine.Assertions; using UnityEngine.XR.ARFoundation; using UnityEngine.XR.Interaction.Toolkit.Inputs; using UnityEngine.XR.Interaction.Toolkit.Locomotion; using UnityEngine.XR.Interaction.Toolkit.Locomotion.Climbing; using UnityEngine.XR.Interaction.Toolkit.Locomotion.Movement; using UnityEngine.XR.Interaction.Toolkit.Locomotion.Teleportation; using UnityEngine.XR.Interaction.Toolkit.Locomotion.Turning; namespace Phantom.XRMOD.QuestModule.Runtime { /// /// Holds references to the essential architectural components of the Quest XR rig. /// /// This model is responsible for locating and caching references to cameras, managers (AR, Input, Occlusion), /// providers (Locomotion, Turn, Climb), and controller transforms. It acts as a central registry for accessing these components. /// /// public class ArchitectureComponentsModel : IModel, IReleaseCommand { internal Camera ARCamera; internal GameObject XRRig; internal ARSession ARSession; internal CharacterController CharacterController; internal ARCameraManager CameraManager; internal ARMeshManager MeshManager; internal AROcclusionManager OcclusionManager; internal ARBoundingBoxManager BoundingBoxManager; internal XRInputModalityManager XRInputModalityManager; internal OpenXRPermissionManager OpenXRPermissionManager { get; private set; } // Locomotion internal LocomotionProvider LocomotionProvider; internal ContinuousTurnProvider ContinuousTurnProvider; internal DynamicMoveProvider DynamicMoveProvider; internal GrabMoveProvider GrabMoveProvider; internal ClimbProvider ClimbProvider; internal TeleportationProvider TeleportationProvider; // Controllers internal Transform LeftController; internal Transform LeftControllerPoke; internal Transform LeftControllerNearFar; internal Transform LeftControllerTeleport; internal Transform LeftControllerVisualizer; internal Transform RightController; internal Transform RightControllerPoke; internal Transform RightControllerNearFar; internal Transform RightControllerTeleport; internal Transform RightControllerVisualizer; // Hands internal Transform LeftHandController; internal Transform LeftHandControllerPoke; internal Transform LeftHandControllerNearFar; internal Transform LeftHandControllerVisualizer; internal Transform RightHandController; internal Transform RightHandControllerPoke; internal Transform RightHandControllerNearFar; internal Transform RightHandControllerVisualizer; private GameObject defaultQuestLauncherGo; /// /// Initializes a new instance of the class. /// /// automatically calls to find and cache component references. /// /// public ArchitectureComponentsModel() { Initialize(); } /// /// Initializes the model by finding the "DefaultQuestLauncher(Clone)" GameObject and caching its child components. /// public void Initialize() { defaultQuestLauncherGo = GameObject.Find("DefaultQuestLauncher(Clone)"); Assert.IsNotNull(defaultQuestLauncherGo); XRRig = defaultQuestLauncherGo.transform.GetChild(0).gameObject; Assert.IsNotNull(XRRig); OpenXRPermissionManager = defaultQuestLauncherGo.GetComponent(); MeshManager = defaultQuestLauncherGo.GetComponentInChildren(true); Assert.IsNotNull(MeshManager); CameraManager = defaultQuestLauncherGo.GetComponentInChildren(true); LocomotionProvider = defaultQuestLauncherGo.GetComponentInChildren(true); ContinuousTurnProvider = defaultQuestLauncherGo.GetComponentInChildren(true); DynamicMoveProvider = defaultQuestLauncherGo.GetComponentInChildren(true); GrabMoveProvider = defaultQuestLauncherGo.GetComponentInChildren(true); ClimbProvider = defaultQuestLauncherGo.GetComponentInChildren(true); TeleportationProvider = defaultQuestLauncherGo.GetComponentInChildren(true); CharacterController = defaultQuestLauncherGo.GetComponentInChildren(true); OcclusionManager = defaultQuestLauncherGo.GetComponentInChildren(true); XRInputModalityManager = defaultQuestLauncherGo.GetComponentInChildren(true); ARCamera = Camera.main; Assert.IsNotNull(ARCamera); ARSession = Object.FindFirstObjectByType(FindObjectsInactive.Include); var tmp_Transform = defaultQuestLauncherGo.transform; LeftController = tmp_Transform.Find("XRMODRig/Camera Offset/Left Controller"); LeftControllerPoke = LeftController.Find("Poke Interactor"); LeftControllerNearFar = LeftController.Find("Near-Far Interactor"); LeftControllerTeleport = LeftController.Find("Teleport Interactor"); LeftControllerVisualizer = LeftController.Find("Left Controller Visualizer"); RightController = tmp_Transform.Find("XRMODRig/Camera Offset/Right Controller"); RightControllerPoke = RightController.Find("Poke Interactor"); RightControllerNearFar = RightController.Find("Near-Far Interactor"); RightControllerTeleport = RightController.Find("Teleport Interactor"); RightControllerVisualizer = RightController.Find("Right Controller Visualizer"); LeftHandController = tmp_Transform.Find("XRMODRig/Camera Offset/Left Hand"); LeftHandControllerPoke = LeftHandController.Find("Poke Interactor"); LeftHandControllerNearFar = LeftHandController.Find("Near-Far Interactor"); LeftHandControllerVisualizer = LeftHandController.Find("Left Hand Visualizer"); RightHandController = tmp_Transform.Find("XRMODRig/Camera Offset/Right Hand"); RightHandControllerPoke = RightHandController.Find("Poke Interactor"); RightHandControllerNearFar = RightHandController.Find("Near-Far Interactor"); RightHandControllerVisualizer = RightHandController.Find("Right Hand Visualizer"); } /// /// Releases resources. (Currently empty). /// /// Optional project name context. public void Release(string _projectName = default) { } } }