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);
}
}
}