/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * Licensed under the Oculus SDK License Agreement (the "License"); * you may not use the Oculus SDK except in compliance with the License, * which is provided at the time of installation or download, or which * otherwise accompanies this software in either electronic or hard copy form. * * You may obtain a copy of the License at * * https://developer.oculus.com/licenses/oculussdk/ * * Unless required by applicable law or agreed to in writing, the Oculus SDK * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ using System.Linq; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement; internal static class OVRPassthroughHelper { internal static bool EnablePassthrough() { var ovrManager = OVRProjectSetupUtils.FindComponentInScene(); if (ovrManager is null) { return false; } ovrManager.isInsightPassthroughEnabled = true; return true; } internal static bool IsAnyPassthroughLayerUnderlay() { return OVRProjectSetupUtils.FindComponentsInScene() .Any(p => p.overlayType == OVROverlay.OverlayType.Underlay); } internal static bool InitPassthroughLayerUnderlay(GameObject ovrCameraRig) { var passthroughLayers = OVRProjectSetupUtils.FindComponentsInScene().ToList(); // no PT layers if (passthroughLayers.Count == 0) { var underLay = ovrCameraRig.AddComponent(); underLay.overlayType = OVROverlay.OverlayType.Underlay; } // there are layers but non of them are Underlay else if (passthroughLayers.All(l => l.overlayType != OVROverlay.OverlayType.Underlay)) { // if there is only one PT layer, change it to Underlay if (passthroughLayers.Count == 1) { passthroughLayers.First().overlayType = OVROverlay.OverlayType.Underlay; } else { Debug.LogError( "There are multiple OVRPassthroughLayer instances in the scene, but none of them is an Underlay. Set one of the layer's Placement to Underlay."); return false; } } SaveScene(); return true; } internal static bool HasCentralCamera(OVRCameraRig ovrCameraRig) => (ovrCameraRig.centerEyeAnchor != null ? ovrCameraRig.centerEyeAnchor.GetComponent() : null) != null; internal static Camera GetCentralCamera(OVRCameraRig ovrCameraRig) => ovrCameraRig.centerEyeAnchor != null ? ovrCameraRig.centerEyeAnchor.GetComponent() : null; internal static bool IsBackgroundClear(OVRCameraRig ovrCameraRig) { var centerCamera = GetCentralCamera(ovrCameraRig); if (centerCamera is null) { throw new System.Exception("Central camera was not found"); } return centerCamera.clearFlags == CameraClearFlags.SolidColor && centerCamera.backgroundColor.a < 1; } internal static void ClearBackground(OVRCameraRig ovrCameraRig) { var centerCamera = GetCentralCamera(ovrCameraRig); if (centerCamera is null) { throw new System.Exception("Central camera was not found"); } centerCamera.clearFlags = CameraClearFlags.SolidColor; centerCamera.backgroundColor = Color.clear; SaveScene(); } private static void SaveScene() { var activeScene = SceneManager.GetActiveScene(); EditorSceneManager.MarkSceneDirty(activeScene); EditorSceneManager.SaveScene(activeScene); } }