playtest-unity/playtest/Library/PackageCache/com.unity.performance.profi.../Editor/Draw2D.cs

211 lines
5.6 KiB
C#

using UnityEngine;
namespace UnityEditor.Performance.ProfileAnalyzer
{
internal class Draw2D
{
public enum Origin
{
TopLeft,
BottomLeft
};
Origin m_Origin = Origin.TopLeft;
GUIStyle m_GLStyle;
string m_ShaderName;
Material m_Material;
Rect m_Rect;
Vector4 m_ClipRect;
bool m_ClipRectEnabled = false;
public Draw2D(string shaderName)
{
m_ShaderName = shaderName;
CheckAndSetupMaterial();
}
public bool CheckAndSetupMaterial()
{
if (m_Material == null)
{
var shader = Shader.Find(m_ShaderName);
if (shader == null)
{
Debug.LogFormat("Unable to locate shader {0}", m_ShaderName);
return false;
}
m_Material = new Material(shader);
if (m_Material == null)
{
Debug.LogFormat("Unable to create material for {0}", m_ShaderName);
return false;
}
}
return true;
}
public bool IsMaterialValid()
{
if (m_Material == null)
return false;
return true;
}
public void OnGUI()
{
if (m_GLStyle == null)
{
m_GLStyle = new GUIStyle(GUI.skin.box);
m_GLStyle.padding = new RectOffset(0, 0, 0, 0);
m_GLStyle.margin = new RectOffset(0, 0, 0, 0);
}
}
public void SetClipRect(Rect clipRect)
{
m_ClipRect = new Vector4(clipRect.x, clipRect.y, clipRect.x + clipRect.width, clipRect.y + clipRect.height);
m_ClipRectEnabled = true;
if (CheckAndSetupMaterial())
{
m_Material.SetFloat("_UseClipRect", m_ClipRectEnabled ? 1f : 0f);
m_Material.SetVector("_ClipRect", m_ClipRect);
}
}
public void ClearClipRect()
{
m_ClipRectEnabled = false;
if (CheckAndSetupMaterial())
{
m_Material.SetFloat("_UseClipRect", m_ClipRectEnabled ? 1f : 0f);
m_Material.SetVector("_ClipRect", m_ClipRect);
}
}
public Rect GetClipRect()
{
return new Rect(m_ClipRect.x, m_ClipRect.y, m_ClipRect.z - m_ClipRect.x, m_ClipRect.w - m_ClipRect.y);
}
public bool DrawStart(Rect r, Origin origin = Origin.TopLeft)
{
if (Event.current.type != EventType.Repaint)
return false;
if (!CheckAndSetupMaterial())
return false;
m_Material.SetPass(0);
m_Rect = r;
m_Origin = origin;
return true;
}
public bool DrawStart(float w, float h, Origin origin = Origin.TopLeft, GUIStyle style = null)
{
Rect r = GUILayoutUtility.GetRect(w, h, style == null ? m_GLStyle : style, GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(false));
return DrawStart(r, origin);
}
public void DrawEnd()
{
}
public void Translate(ref float x, ref float y)
{
// Translation done CPU side so we have world space coords in the shader for clipping.
if (m_Origin == Origin.BottomLeft)
{
x = m_Rect.xMin + x;
y = m_Rect.yMax - y;
}
else
{
x = m_Rect.xMin + x;
y = m_Rect.yMin + y;
}
}
public void DrawFilledBox(float x, float y, float w, float h, Color col)
{
float x2 = x + w;
float y2 = y + h;
Translate(ref x, ref y);
Translate(ref x2, ref y2);
if (m_Origin == Origin.BottomLeft)
{
GL.Begin(GL.TRIANGLE_STRIP);
GL.Color(col);
GL.Vertex3(x, y, 0);
GL.Vertex3(x, y2, 0);
GL.Vertex3(x2, y, 0);
GL.Vertex3(x2, y2, 0);
GL.End();
}
else
{
GL.Begin(GL.TRIANGLE_STRIP);
GL.Color(col);
GL.Vertex3(x, y, 0);
GL.Vertex3(x2, y, 0);
GL.Vertex3(x, y2, 0);
GL.Vertex3(x2, y2, 0);
GL.End();
}
}
public void DrawFilledBox(float x, float y, float w, float h, float r, float g, float b)
{
DrawFilledBox(x, y, w, h, new Color(r, g, b));
}
public void DrawLine(float x, float y, float x2, float y2, Color col)
{
Translate(ref x, ref y);
Translate(ref x2, ref y2);
GL.Begin(GL.LINES);
GL.Color(col);
GL.Vertex3(x, y, 0);
GL.Vertex3(x2, y2, 0);
GL.End();
}
public void DrawLine(float x, float y, float x2, float y2, float r, float g, float b)
{
DrawLine(x, y, x2, y2, new Color(r, g, b));
}
public void DrawBox(float x, float y, float w, float h, Color col)
{
float x2 = x + w;
float y2 = y + h;
Translate(ref x, ref y);
Translate(ref x2, ref y2);
GL.Begin(GL.LINE_STRIP);
GL.Color(col);
GL.Vertex3(x, y, 0);
GL.Vertex3(x2, y, 0);
GL.Vertex3(x2, y2, 0);
GL.Vertex3(x, y2, 0);
GL.Vertex3(x, y, 0);
GL.End();
}
public void DrawBox(float x, float y, float w, float h, float r, float g, float b)
{
DrawBox(x, y, w, h, new Color(r, g, b));
}
}
}