/// <summary>
        /// Check that the camera has proper hierarchy setup, and record it into the worldLockingContext.
        /// </summary>
        /// <param name="worldLockingContext">The context to setup with linkage information.</param>
        private static void CheckCamera(WorldLockingContext worldLockingContext)
        {
            // Find main camera. If not found, issue warning but we are done.
            if (Camera.main == null)
            {
                Debug.Log($"Scene has no main camera, camera linkage will not be configured.");
                return;
            }
            Transform mainCamera = Camera.main.transform;

            // If the camera doesn't have a parent
            //      Add MRTKPlayspace object, and attach camera to it.
            // If MRTKPlayspace object doesn't have a parent
            //      Add WLTAdjustment object, and attach MRTKPlayspace to it.
            // Set WorldLockingContext CameraParent to MRTKPlayspace object.
            // Set WorldLockingContext Adjustment to WLTAdjustment object.
            if (mainCamera.parent == null)
            {
                mainCamera.parent = new GameObject("MixedRealityPlayspace").transform;
            }
            Transform mrtkPlayspace = mainCamera.parent;

            if (mrtkPlayspace.parent == null)
            {
                mrtkPlayspace.parent = new GameObject("WLT_Adjustment").transform;
            }
            Transform wltAdjustment = mrtkPlayspace.parent;

            var sharedSettings = worldLockingContext.SharedSettings;

            sharedSettings.linkageSettings.CameraParent    = mrtkPlayspace;
            sharedSettings.linkageSettings.AdjustmentFrame = wltAdjustment;
        }
        private static bool ConfiguredForARF(WorldLockingContext context)
        {
#if WLT_ARFOUNDATION_PRESENT
            ARSession       session       = GameObject.FindObjectOfType <ARSession>();
            ARSessionOrigin sessionOrigin = GameObject.FindObjectOfType <ARSessionOrigin>();

            if (session != null && sessionOrigin == null)
            {
                Debug.LogError($"Found ARSession on {session.name}, but no ARSessionOrigin. Check ARFoundation configuration.");
            }
            if (session == null && sessionOrigin != null)
            {
                Debug.LogError($"Found ARSessionOrigin on {sessionOrigin.name}, but no ARSession. Check ARFoundation configuration.");
            }
            if (session != null && sessionOrigin != null)
            {
                var sharedSettings = context.SharedSettings;
                sharedSettings.anchorSettings.anchorSubsystem       = AnchorSettings.AnchorSubsystem.ARFoundation;
                sharedSettings.anchorSettings.ARSessionSource       = session.gameObject;
                sharedSettings.anchorSettings.ARSessionOriginSource = sessionOrigin.gameObject;
                return(true);
            }
#endif // WLT_ARFOUNDATION_PRESENT
            return(false);
        }
        private static void AddWorldLockingToScene()
        {
            // Look for WorldLocking root object in scene.
            // If not found, add one.
            Transform worldLockingRoot = CheckWorldLockingRoot();

            WorldLockingContext worldLockingContext = CheckWorldLockingManager(worldLockingRoot);

            CheckCamera(worldLockingContext);

            CheckAnchorManagement(worldLockingContext);

            Selection.activeObject = worldLockingContext.gameObject;

            EditorUtility.SetDirty(worldLockingContext);
            EditorSceneManager.MarkAllScenesDirty();
        }
        public IEnumerator AlignmentManagerTestBasic()
        {
            var rig = loadHelper.LoadBasicSceneRig();

            /// This context ensures FW is enabled, but also gives a MonoBehavior to run coroutines off of.
            WorldLockingContext context = loadHelper.LoadComponentOnGameObject <WorldLockingContext>("Prefabs/CoreTestContext_AllEnabled.prefab");
            var alignMgr = WorldLockingManager.GetInstance().AlignmentManager;

            yield return(context.StartCoroutine(CheckSinglePin(alignMgr, 0)));

            yield return(context.StartCoroutine(CheckSinglePin(alignMgr, 1)));

            yield return(context.StartCoroutine(CheckDualPins(alignMgr, 0, 1)));

            yield return(context.StartCoroutine(CheckDualPins(alignMgr, 1, 2)));

            yield return(context.StartCoroutine(CheckDualPins(alignMgr, 0, 2)));

            alignMgr.ClearAlignmentAnchors();
            for (int i = 0; i < 2; ++i)
            {
                alignMgr.AddAlignmentAnchor(pinData[i].name, pinData[i].virtualPose, pinData[i].lockedPose);
            }
            alignMgr.SendAlignmentAnchors();

            yield return(null);

            CheckAlignment(alignMgr, pinData[0].virtualPose.position, pinData[0].lockedPose.position);

            CheckAlignment(alignMgr, pinData[1].virtualPose.position, pinData[1].lockedPose.position);

            CheckAlignment(alignMgr,
                           (pinData[0].virtualPose.position + pinData[1].virtualPose.position) * 0.5f,
                           (pinData[0].lockedPose.position + pinData[1].lockedPose.position) * 0.5f);

            GameObject.Destroy(context.gameObject);
            GameObject.Destroy(rig);

            yield return(null);
        }
        private static void CheckAnchorManagement(WorldLockingContext context)
        {
            var sharedSettings = context.SharedSettings;

            sharedSettings.anchorSettings.UseDefaults     = false;
            sharedSettings.anchorSettings.anchorSubsystem = AnchorSettings.AnchorSubsystem.Null;

            if (!ConfiguredForARF(context))
            {
#if WLT_ARSUBSYSTEMS_PRESENT
                sharedSettings.anchorSettings.anchorSubsystem = AnchorSettings.AnchorSubsystem.XRSDK;
#elif UNITY_WSA && !UNITY_2020_1_OR_NEWER
                sharedSettings.anchorSettings.anchorSubsystem = AnchorSettings.AnchorSubsystem.WSA;
#elif WLT_ARCORE_SDK_INCLUDED
                sharedSettings.anchorSettings.anchorSubsystem = AnchorSettings.AnchorSubsystem.ARCore;
#endif // WLT_ARCORE_SDK_INCLUDED
            }
            if (sharedSettings.anchorSettings.anchorSubsystem == AnchorSettings.AnchorSubsystem.Null)
            {
                Debug.LogError($"Unable to deduce proper anchor management system.\nTry again after installing and setting up XR provider.");
            }
        }