using System; using UnityEngine; using UnityEngine.Rendering.Universal; namespace UnityEditor.Rendering.Universal { class UniversalRenderPipelineSerializedCamera : ISerializedCamera { public SerializedObject serializedObject { get; } public SerializedObject serializedAdditionalDataObject { get; } public CameraEditor.Settings baseCameraSettings { get; } // This one is internal in UnityEditor for whatever reason... public SerializedProperty projectionMatrixMode { get; } // Common properties public SerializedProperty dithering { get; } public SerializedProperty stopNaNs { get; } public SerializedProperty allowDynamicResolution { get; } public SerializedProperty volumeLayerMask { get; } public SerializedProperty clearDepth { get; } public SerializedProperty antialiasing { get; } // URP specific properties public SerializedProperty renderShadows { get; } public SerializedProperty renderDepth { get; } public SerializedProperty renderOpaque { get; } public SerializedProperty renderer { get; } public SerializedProperty cameraType { get; } public SerializedProperty cameras { get; set; } public SerializedProperty volumeTrigger { get; } public SerializedProperty volumeFrameworkUpdateMode { get; } public SerializedProperty renderPostProcessing { get; } public SerializedProperty antialiasingQuality { get; } #if ENABLE_VR && ENABLE_XR_MODULE public SerializedProperty allowXRRendering { get; } #endif public (Camera camera, UniversalRenderPipelineSerializedCamera serializedCamera) this[int index] { get { if (index < 0 || index >= numCameras) throw new ArgumentOutOfRangeException($"{index} is out of bounds [0 - {numCameras}]"); // Return the camera on that index return (cameras.GetArrayElementAtIndex(index).objectReferenceValue as Camera, cameraSerializedObjects[index]); } } public int numCameras => cameras?.arraySize ?? 0; UniversalRenderPipelineSerializedCamera[] cameraSerializedObjects { get; set; } public UniversalAdditionalCameraData[] camerasAdditionalData { get; } public UniversalRenderPipelineSerializedCamera(SerializedObject serializedObject, CameraEditor.Settings settings = null) { this.serializedObject = serializedObject; projectionMatrixMode = serializedObject.FindProperty("m_projectionMatrixMode"); allowDynamicResolution = serializedObject.FindProperty("m_AllowDynamicResolution"); if (settings == null) { baseCameraSettings = new CameraEditor.Settings(serializedObject); baseCameraSettings.OnEnable(); } else { baseCameraSettings = settings; } camerasAdditionalData = CoreEditorUtils .GetAdditionalData(serializedObject.targetObjects); serializedAdditionalDataObject = new SerializedObject(camerasAdditionalData); // Common properties stopNaNs = serializedAdditionalDataObject.FindProperty("m_StopNaN"); dithering = serializedAdditionalDataObject.FindProperty("m_Dithering"); antialiasing = serializedAdditionalDataObject.FindProperty("m_Antialiasing"); volumeLayerMask = serializedAdditionalDataObject.FindProperty("m_VolumeLayerMask"); clearDepth = serializedAdditionalDataObject.FindProperty("m_ClearDepth"); // URP specific properties renderShadows = serializedAdditionalDataObject.FindProperty("m_RenderShadows"); renderDepth = serializedAdditionalDataObject.FindProperty("m_RequiresDepthTextureOption"); renderOpaque = serializedAdditionalDataObject.FindProperty("m_RequiresOpaqueTextureOption"); renderer = serializedAdditionalDataObject.FindProperty("m_RendererIndex"); volumeLayerMask = serializedAdditionalDataObject.FindProperty("m_VolumeLayerMask"); volumeTrigger = serializedAdditionalDataObject.FindProperty("m_VolumeTrigger"); volumeFrameworkUpdateMode = serializedAdditionalDataObject.FindProperty("m_VolumeFrameworkUpdateModeOption"); renderPostProcessing = serializedAdditionalDataObject.FindProperty("m_RenderPostProcessing"); antialiasingQuality = serializedAdditionalDataObject.FindProperty("m_AntialiasingQuality"); cameraType = serializedAdditionalDataObject.FindProperty("m_CameraType"); #if ENABLE_VR && ENABLE_XR_MODULE allowXRRendering = serializedAdditionalDataObject.FindProperty("m_AllowXRRendering"); #endif } /// /// Updates the internal serialized objects /// public void Update() { baseCameraSettings.Update(); serializedObject.Update(); serializedAdditionalDataObject.Update(); for (int i = 0; i < numCameras; ++i) { cameraSerializedObjects[i].Update(); } } /// /// Applies the modified properties to the serialized objects /// public void Apply() { baseCameraSettings.ApplyModifiedProperties(); serializedObject.ApplyModifiedProperties(); serializedAdditionalDataObject.ApplyModifiedProperties(); for (int i = 0; i < numCameras; ++i) { cameraSerializedObjects[i].Apply(); } } /// /// Refreshes the serialized properties from the serialized objects /// public void Refresh() { var o = new PropertyFetcher(serializedAdditionalDataObject); cameras = o.Find("m_Cameras"); cameraSerializedObjects = new UniversalRenderPipelineSerializedCamera[numCameras]; for (int i = 0; i < numCameras; ++i) { Camera cam = cameras.GetArrayElementAtIndex(i).objectReferenceValue as Camera; cameraSerializedObjects[i] = new UniversalRenderPipelineSerializedCamera(new SerializedObject(cam)); } } } }