/// <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."); } }