_xiaofang/xiaofang/Assets/Obi/Editor/Common/Utils/PreviewHelpers.cs
杨号敬 bcc74f0465 add
2024-12-18 02:18:45 +08:00

151 lines
4.7 KiB
C#

using System;
using UnityEditor;
using UnityEngine;
namespace Obi{
class PreviewHelpers
{
// Preview interaction related stuff:
static int sliderHash = "Slider".GetHashCode();
public static Vector2 Drag2D(Vector2 scrollPosition, Rect position)
{
int controlID = GUIUtility.GetControlID(PreviewHelpers.sliderHash, FocusType.Passive);
Event current = Event.current;
switch (current.GetTypeForControl(controlID))
{
case EventType.MouseDown:
if (position.Contains(current.mousePosition) && position.width > 50f)
{
GUIUtility.hotControl = controlID;
current.Use();
EditorGUIUtility.SetWantsMouseJumping(1);
}
break;
case EventType.MouseUp:
if (GUIUtility.hotControl == controlID)
{
GUIUtility.hotControl = 0;
}
EditorGUIUtility.SetWantsMouseJumping(0);
break;
case EventType.MouseDrag:
if (GUIUtility.hotControl == controlID)
{
scrollPosition -= current.delta * (float)((!current.shift) ? 1 : 3) / Mathf.Min(position.width, position.height) * 140f;
scrollPosition.y = Mathf.Clamp(scrollPosition.y, -90f, 90f);
current.Use();
GUI.changed = true;
}
break;
}
return scrollPosition;
}
public Camera m_Camera;
public float m_CameraFieldOfView = 30f;
public Light[] m_Light = new Light[2];
internal RenderTexture m_RenderTexture;
public PreviewHelpers() : this(false)
{
}
public PreviewHelpers(bool renderFullScene)
{
GameObject gameObject = EditorUtility.CreateGameObjectWithHideFlags("PreRenderCamera", HideFlags.HideAndDontSave, new Type[]
{
typeof(Camera)
});
this.m_Camera = gameObject.GetComponent<Camera>();
this.m_Camera.fieldOfView = this.m_CameraFieldOfView;
this.m_Camera.cullingMask = 1 << 1;
this.m_Camera.enabled = false;
this.m_Camera.clearFlags = CameraClearFlags.SolidColor;
this.m_Camera.farClipPlane = 10f;
this.m_Camera.nearClipPlane = 1f;
this.m_Camera.backgroundColor = new Color(0.192156866f, 0.192156866f, 0.192156866f, 0);
this.m_Camera.renderingPath = RenderingPath.Forward;
this.m_Camera.useOcclusionCulling = false;
for (int i = 0; i < 2; i++)
{
GameObject gameObject2 = EditorUtility.CreateGameObjectWithHideFlags("PreRenderLight", HideFlags.HideAndDontSave, new Type[]
{
typeof(Light)
});
this.m_Light[i] = gameObject2.GetComponent<Light>();
this.m_Light[i].type = LightType.Directional;
this.m_Light[i].intensity = 1f;
this.m_Light[i].enabled = false;
}
this.m_Light[0].color = new Color(0.4f, 0.4f, 0.45f, 0f);
this.m_Light[1].transform.rotation = Quaternion.Euler(340f, 218f, 177f);
this.m_Light[1].color = new Color(0.4f, 0.4f, 0.45f, 0f) * 0.7f;
}
public void Cleanup()
{
if (this.m_Camera)
{
UnityEngine.Object.DestroyImmediate(this.m_Camera.gameObject, true);
}
if (this.m_RenderTexture)
{
UnityEngine.Object.DestroyImmediate(this.m_RenderTexture);
this.m_RenderTexture = null;
}
Light[] light = this.m_Light;
for (int i = 0; i < light.Length; i++)
{
Light light2 = light[i];
if (light2)
{
UnityEngine.Object.DestroyImmediate(light2.gameObject, true);
}
}
}
private void InitPreview(Rect r)
{
int num = (int)r.width;
int num2 = (int)r.height;
if (!this.m_RenderTexture || this.m_RenderTexture.width != num || this.m_RenderTexture.height != num2)
{
if (this.m_RenderTexture)
{
UnityEngine.Object.DestroyImmediate(this.m_RenderTexture);
this.m_RenderTexture = null;
}
float scaleFactor = this.GetScaleFactor((float)num, (float)num2);
this.m_RenderTexture = new RenderTexture((int)((float)num * scaleFactor), (int)((float)num2 * scaleFactor), 16);
this.m_RenderTexture.hideFlags = HideFlags.HideAndDontSave;
this.m_Camera.targetTexture = this.m_RenderTexture;
}
float num3 = (this.m_RenderTexture.width > 0) ? Mathf.Max(1f, (float)this.m_RenderTexture.height / (float)this.m_RenderTexture.width) : 1f;
this.m_Camera.fieldOfView = Mathf.Atan(num3 * Mathf.Tan(this.m_CameraFieldOfView * 0.5f * 0.0174532924f)) * 57.29578f * 2f;
}
public float GetScaleFactor(float width, float height)
{
float a = Mathf.Max(Mathf.Min(width * 2f, 1024f), width) / width;
float b = Mathf.Max(Mathf.Min(height * 2f, 1024f), height) / height;
return Mathf.Min(a, b);
}
public void BeginPreview(Rect r, GUIStyle previewBackground)
{
this.InitPreview(r);
if (previewBackground == null || previewBackground == GUIStyle.none)
{
return;
}
}
public Texture EndPreview()
{
m_Camera.Render();
return this.m_RenderTexture;
}
}
}