using System.Reflection; using UnityEngine; using UnityEditor; using UnityEditorInternal; namespace io.github.hatayama.uLoopMCP { /// /// Bridge class for accessing Unity internal APIs. /// Uses Unity.InternalAPIEditorBridge assembly name to access internal members via InternalsVisibleTo. /// public static class InternalEditorUtilityBridge { private static Material _blitSceneViewCaptureMat; /// /// Capture an EditorWindow to a RenderTexture using Unity internal GrabPixels method. /// Considers pixelsPerPoint for Retina/HiDPI displays. /// /// The EditorWindow to capture /// The RenderTexture to capture into public static void CaptureEditorWindow(EditorWindow window, RenderTexture rt) { if (window == null || rt == null) { return; } if (_blitSceneViewCaptureMat == null) { FieldInfo blitMatField = typeof(InternalEditorUtility).GetField( "blitSceneViewCaptureMat", BindingFlags.Static | BindingFlags.NonPublic); if (blitMatField != null) { _blitSceneViewCaptureMat = blitMatField.GetValue(null) as Material; } if (_blitSceneViewCaptureMat == null) { _blitSceneViewCaptureMat = EditorGUIUtility.LoadRequired("SceneView/BlitSceneViewCapture.mat") as Material; if (blitMatField != null) { blitMatField.SetValue(null, _blitSceneViewCaptureMat); } } } // When in Linear color space, use a RenderTexture with sRGB write disabled // to prevent double gamma correction from BlitSceneViewCapture.mat RenderTextureDescriptor descriptor = rt.descriptor; if (QualitySettings.activeColorSpace == ColorSpace.Linear) { descriptor.sRGB = false; } RenderTexture temporary = RenderTexture.GetTemporary(descriptor); float scale = EditorGUIUtility.pixelsPerPoint; Rect rect = new Rect(0.0f, 0.0f, window.position.width * scale, window.position.height * scale); // m_Parent is the HostView/DockArea that contains the EditorWindow // GrabPixels is an internal method that captures the view contents window.m_Parent.GrabPixels(temporary, rect); Graphics.Blit(temporary, rt, _blitSceneViewCaptureMat); RenderTexture.ReleaseTemporary(temporary); } } }