2025-10-21 14:18:31 +09:00

162 lines
6.8 KiB
C#

// Stylized Water 3 by Staggart Creations (http://staggart.xyz)
// COPYRIGHT PROTECTED UNDER THE UNITY ASSET STORE EULA (https://unity.com/legal/as-terms)
// • Copying or referencing source code for the production of new asset store, or public, content is strictly prohibited!
// • Uploading this file to a public repository will subject it to an automated DMCA takedown request.
using System;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
namespace StylizedWater3
{
public class RenderTargetDebuggerWindow : EditorWindow
{
private const int m_width = 550;
private const int m_height = 300;
[MenuItem("Window/Analysis/Stylized Water 3/Render targets", false, 0)]
private static void OpenDebugger()
{
RenderTargetDebuggerWindow.Open();
}
#if SWS_DEV
[MenuItem("SWS/Debug/Render Targets")]
#endif
public static void Open()
{
RenderTargetDebuggerWindow window = GetWindow<RenderTargetDebuggerWindow>(false);
window.titleContent = new GUIContent("Water Render Buffer Inspector");
window.autoRepaintOnSceneChange = true;
window.minSize = new Vector2(m_width, m_height);
//window.maxSize = new Vector2(m_width, m_height);
window.Show();
}
private float width = 300f;
private Vector2 scrollPos;
private ColorWriteMask colorMask = ColorWriteMask.All;
private int colorChannel = 1;
private int renderTargetIndex;
private float exposure = 1f;
private int mipmap = 0;
private void OnEnable()
{
RenderTargetDebugger.Initialize();
}
private void OnDisable()
{
RenderTargetDebugger.Cleanup();
}
private void OnGUI()
{
Repaint();
if (RenderTargetDebugger.renderTargetNames.Length < 5)
{
renderTargetIndex = GUILayout.Toolbar(renderTargetIndex, RenderTargetDebugger.renderTargetNames);
}
else
{
renderTargetIndex = EditorGUILayout.Popup($"Render target ({RenderTargetDebugger.renderTargets.Count})", renderTargetIndex, RenderTargetDebugger.renderTargetNames);
}
EditorGUILayout.LabelField($"Active camera: {RenderTargetDebugger.CurrentCameraName}", EditorStyles.miniLabel);
width = (Mathf.Min(this.position.height, this.position.width) * 1f) - 15f;
scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
//EditorGUILayout.LabelField($"RenderTargetInspector.InspectedProperty: {RenderTargetInspector.InspectedProperty}");
//EditorGUILayout.LabelField($"RenderTargetInspector.CurrentRT: {RenderTargetInspector.CurrentRT}");
int currentTarget = 0;
foreach (var renderTarget in RenderTargetDebugger.renderTargets)
{
if(renderTargetIndex == currentTarget)
{
//mark as current!
RenderTargetDebugger.InspectedProperty = renderTarget.propertyID;
using (new EditorGUILayout.HorizontalScope())
{
using (new EditorGUILayout.VerticalScope())
{
DrawTexture(renderTarget);
}
}
}
currentTarget++;
}
EditorGUILayout.EndScrollView();
}
private void DrawTexture(RenderTargetDebugger.RenderTarget renderTarget)
{
if (RenderTargetDebugger.CurrentRT == null || renderTarget == null)
{
EditorGUILayout.HelpBox($"Render target \"{renderTarget.textureName}\" couldn't be found, or it is not bound." +
$"\n\nThe related render pass may be disabled, or not render for the current view (scene/game view not open)", MessageType.Info);
return;
}
//Null at the very first frame
if (RenderTargetDebugger.CurrentRT.rt == null) return;
EditorGUILayout.LabelField($"\"{renderTarget.textureName}\" {RenderTargetDebugger.CurrentRT.rt.descriptor.graphicsFormat} {RenderTargetDebugger.CurrentRT.rt.width}x{RenderTargetDebugger.CurrentRT.rt.height}px @ {(UnityEngine.Profiling.Profiler.GetRuntimeMemorySizeLong(RenderTargetDebugger.CurrentRT) / 1024f / 1024f).ToString("F2")}mb", EditorStyles.boldLabel);
if (renderTarget.description != string.Empty) EditorGUILayout.HelpBox(renderTarget.description, MessageType.Info);
Rect rect = EditorGUILayout.GetControlRect();
Rect position = EditorGUI.PrefixLabel(rect, GUIUtility.GetControlID(FocusType.Passive), GUIContent.none);
position.width = width;
//colorChannel = EditorGUI.Popup(position, "Channel mask", colorChannel, new string[] { "RGB", "R", "G", "B", "A" });
colorChannel = (int)GUI.Toolbar(position, colorChannel, new GUIContent[] { new GUIContent("RGBA"), new GUIContent("RGB"), new GUIContent("R"), new GUIContent("G"), new GUIContent("B"), new GUIContent("A") });
switch (colorChannel)
{
case 1: colorMask = ColorWriteMask.All;
break;
case 2: colorMask = ColorWriteMask.Red;
break;
case 3: colorMask = ColorWriteMask.Green;
break;
case 4: colorMask = ColorWriteMask.Blue;
break;
case 5: colorMask = ColorWriteMask.Alpha;
break;
}
rect.y += 21f;
rect.width = width;
float aspect = (RenderTargetDebugger.CurrentRT.rt.height / RenderTargetDebugger.CurrentRT.rt.width);
rect.height = rect.width;
if (colorChannel == 0) //RGBA
{
EditorGUI.DrawTextureTransparent(rect, RenderTargetDebugger.CurrentRT, ScaleMode.ScaleToFit, aspect);
}
else if (colorMask == ColorWriteMask.Alpha)
{
EditorGUI.DrawTextureAlpha(rect, RenderTargetDebugger.CurrentRT, ScaleMode.ScaleToFit, aspect, mipmap);
}
else
{
EditorGUI.DrawPreviewTexture(rect, RenderTargetDebugger.CurrentRT, null, ScaleMode.ScaleToFit, aspect, mipmap, colorMask, exposure);
}
GUILayout.Space(rect.height + 10f);
mipmap = EditorGUILayout.IntSlider("Mipmap", mipmap, 0, 8);
exposure = EditorGUILayout.Slider("Exposure", exposure, 1f, 16f);
}
}
}