using DCFApixels.DebugXCore; #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; using UnityEngine.Rendering; namespace DCFApixels { using IN = System.Runtime.CompilerServices.MethodImplAttribute; public static partial class DebugX { public readonly partial struct DrawHandler { #region Text [IN(LINE)] public DrawHandler TextWorldScale(Vector3 position, object text) => Gizmo(new TextGizmo(position, text, DebugXTextSettings.Default, true)); [IN(LINE)] public DrawHandler TextWorldScale(Vector3 position, object text, DebugXTextSettings settings) => Gizmo(new TextGizmo(position, text, settings, true)); [IN(LINE)] public DrawHandler Text(Vector3 position, object text) => Gizmo(new TextGizmo(position, text, DebugXTextSettings.Default, false)); [IN(LINE)] public DrawHandler Text(Vector3 position, object text, DebugXTextSettings settings) => Gizmo(new TextGizmo(position, text, settings, false)); private readonly struct TextGizmo : IGizmo { public readonly Vector3 Position; public readonly string Text; public readonly DebugXTextSettings Settings; public readonly bool IsWorldSpaceScale; [IN(LINE)] public TextGizmo(Vector3 position, object text, DebugXTextSettings settings, bool isWorldSpaceScale) { Position = position; Text = text.ToString(); Settings = settings; IsWorldSpaceScale = isWorldSpaceScale; } public IGizmoRenderer RegisterNewRenderer() { return new Renderer(); } #region Renderer private class Renderer : IGizmoRenderer_UnityGizmos { private static GUIStyle _labelStyle; private static GUIContent _labelDummy; public int ExecuteOrder => default(UnlitMat).GetExecuteOrder(); public bool IsStaticRender => false; public void Prepare(Camera camera, GizmosList list) { } public void Render(Camera camera, GizmosList list, CommandBuffer cb) { } public void Render_UnityGizmos(Camera camera, GizmosList list) { #if UNITY_EDITOR if (Event.current.type != EventType.Repaint) { return; } //bool c = camera.name == "SceneCamera"; bool ccc = camera == Camera.main; //bool x = camera == Camera.main; bool x = true; if (camera == null) { return; } InitStatic(); var zoom = GetCameraZoom(camera); Handles.BeginGUI(); foreach (ref readonly var item in list) { _labelDummy.text = item.Value.Text; GUIStyle style = _labelStyle; style.fontSize = item.Value.IsWorldSpaceScale ? Mathf.FloorToInt(item.Value.Settings.FontSize / zoom) : item.Value.Settings.FontSize; style.alignment = item.Value.Settings.TextAnchor; if (!(WorldToGUIPointWithDepth(camera, item.Value.Position).z < 0f)) { Rect rect = WorldPointToSizedRect(camera, item.Value.Position, _labelDummy, _labelStyle); //if (x) Debug.Log(rect); ////GUI.DrawTexture(rect, EditorGUIUtility.whiteTexture); //Rect screenRect = default; //Rect originRect = default; //CalculateScaledTextureRects(rect, ScaleMode.StretchToFill, ref screenRect, ref originRect); GL.PushMatrix(); GL.LoadPixelMatrix(0, Screen.width, Screen.height, 0); //Graphics.DrawTexture(screenRect, EditorGUIUtility.whiteTexture, screenRect, 0, 0, 0, 0); Color c = item.Value.Settings.BackgroundColor * GlobalColor; GUI.color = c; GUI.DrawTexture(rect, EditorGUIUtility.whiteTexture); //Graphics.DrawTexture(screenRect, EditorGUIUtility.whiteTexture, screenRect, 0, 0, 0, 0); //Graphics.DrawTexture(screenRect, EditorGUIUtility.whiteTexture, screenRect, 0, 0, 0, 0); GUI.color = item.Color * GlobalColor; style.Draw(rect, _labelDummy, false, false, false, false); GL.PopMatrix(); } } Handles.EndGUI(); #endif } #region Utils public static Vector3 WorldToGUIPointWithDepth(Camera camera, Vector3 world) { #if UNITY_EDITOR world = Handles.matrix.MultiplyPoint(world); Vector3 vector = camera.WorldToScreenPoint(world); vector.y = camera.pixelHeight - vector.y; Vector2 vector2 = EditorGUIUtility.PixelsToPoints(vector); return new Vector3(vector2.x, vector2.y, vector.z); #endif } public static Rect WorldPointToSizedRect(Camera camera, Vector3 position, GUIContent content, GUIStyle style) { #if UNITY_EDITOR Vector2 vector = (Vector2)WorldToGUIPointWithDepth(camera, position); Vector2 vector2 = style.CalcSize(content); Rect rect = new Rect(vector.x, vector.y, vector2.x, vector2.y); switch (style.alignment) { case TextAnchor.UpperCenter: rect.x -= rect.width * 0.5f; break; case TextAnchor.UpperRight: rect.x -= rect.width; break; case TextAnchor.MiddleLeft: rect.y -= rect.height * 0.5f; break; case TextAnchor.MiddleCenter: rect.x -= rect.width * 0.5f; rect.y -= rect.height * 0.5f; break; case TextAnchor.MiddleRight: rect.x -= rect.width; rect.y -= rect.height * 0.5f; break; case TextAnchor.LowerLeft: rect.y -= rect.height; break; case TextAnchor.LowerCenter: rect.x -= rect.width * 0.5f; rect.y -= rect.height; break; case TextAnchor.LowerRight: rect.x -= rect.width; rect.y -= rect.height; break; } return style.padding.Add(rect); #endif } //internal static bool CalculateScaledTextureRects(Rect position, ScaleMode scaleMode, float imageAspect, ref Rect outScreenRect, ref Rect outSourceRect) internal static bool CalculateScaledTextureRects(Rect position, ScaleMode scaleMode, ref Rect outScreenRect, ref Rect outSourceRect) { const float imageAspect = 1; float num = position.width / position.height; bool result = false; switch (scaleMode) { case ScaleMode.StretchToFill: outScreenRect = position; outSourceRect = new Rect(0f, 0f, 1f, 1f); result = true; break; case ScaleMode.ScaleAndCrop: if (num > imageAspect) { float num4 = imageAspect / num; outScreenRect = position; outSourceRect = new Rect(0f, (1f - num4) * 0.5f, 1f, num4); result = true; } else { float num5 = num / imageAspect; outScreenRect = position; outSourceRect = new Rect(0.5f - num5 * 0.5f, 0f, num5, 1f); result = true; } break; case ScaleMode.ScaleToFit: if (num > imageAspect) { float num2 = imageAspect / num; outScreenRect = new Rect(position.xMin + position.width * (1f - num2) * 0.5f, position.yMin, num2 * position.width, position.height); outSourceRect = new Rect(0f, 0f, 1f, 1f); result = true; } else { float num3 = num / imageAspect; outScreenRect = new Rect(position.xMin, position.yMin + position.height * (1f - num3) * 0.5f, position.width, num3 * position.height); outSourceRect = new Rect(0f, 0f, 1f, 1f); result = true; } break; } return result; } #endregion private void InitStatic() { if (_labelStyle == null || _labelDummy == null) { _labelStyle = new GUIStyle(GUI.skin.label) { richText = false, padding = new RectOffset(0, 0, 0, 0), margin = new RectOffset(0, 0, 0, 0) }; _labelDummy = new GUIContent(); } } private static float GetCameraZoom(Camera camera) { const float DEFAULT_ZOOM = 1f; if (camera != null) { return camera.orthographicSize; } return DEFAULT_ZOOM; //var currentDrawingSceneView = SceneView.currentDrawingSceneView; // //if (currentDrawingSceneView == null) //{ // return DEFAULT_ZOOM; //} // //var localCamera = currentDrawingSceneView.camera; // //if (localCamera != null) //{ // return localCamera.orthographicSize; //} // //return DEFAULT_ZOOM; } } #endregion } #endregion } } }