// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; using UnityEngine; using UnityEditor; namespace Microsoft.MixedReality.WebRTC.Unity.Editor { /// /// Property drawer for , to report an error to the user if /// the associated property instance cannot be used for framebuffer /// capture by . /// [CustomPropertyDrawer(typeof(CaptureCameraAttribute))] public class CaptureCameraDrawer : PropertyDrawer { private const int c_errorMessageHeight = 42; public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { try { Validate(property.objectReferenceValue as Camera); } catch (Exception ex) { // Display error message below the property var totalHeight = position.height; position.yMin = position.yMax - c_errorMessageHeight; EditorGUI.HelpBox(position, ex.Message, MessageType.Warning); // Adjust rect for the property itself position.yMin = position.yMax - totalHeight; position.yMax -= c_errorMessageHeight; } EditorGUI.PropertyField(position, property, label); } public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { float height = base.GetPropertyHeight(property, label); try { Validate(property.objectReferenceValue as Camera); } catch (Exception) { // Add extra space for the error message height += c_errorMessageHeight; } return height; } /// /// Validate that a given instance can be used for framebuffer /// capture by based on the current settings of the Unity Player /// for the current build platform. /// /// The camera instance to test the settings of. /// /// The camera has settings not compatible with its use with . /// /// public static void Validate(Camera camera) { if (PlayerSettings.virtualRealitySupported && (camera != null)) { if (PlayerSettings.stereoRenderingPath == StereoRenderingPath.MultiPass) { // Ensure camera is not rendering to both eyes in multi-pass stereo, otherwise the command buffer // is executed twice (once per eye) and will produce twice as many frames, which leads to stuttering // when playing back the video stream resulting from combining those frames. if (camera.stereoTargetEye == StereoTargetEyeMask.Both) { throw new NotSupportedException("Capture camera renders both eyes in multi-pass stereoscopic rendering. This is not" + " supported by the capture mechanism which cannot discriminate them. Set Camera.stereoTargetEye to either Left or" + " Right, or use a different rendering mode (Player Settings > XR Settings > Stereo Rendering Mode)."); } } #if !UNITY_2019_1_OR_NEWER else if (PlayerSettings.stereoRenderingPath == StereoRenderingPath.Instancing) { throw new NotSupportedException("Capture camera does not support single-pass instanced stereoscopic rendering before Unity 2019.1." + " Use a different stereoscopic rendering mode (Player Settings > XR Settings > Stereo Rendering Mode) or upgrade to Unity 2019.1+."); } #endif } } } }