#if UNITY_EDITOR using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using UnityEditor.ShortcutManagement; using System.Reflection; using System.Linq; using UnityEngine.SceneManagement; using UnityEditor.SceneManagement; using static VHierarchy.Libs.VUtils; using static VHierarchy.Libs.VGUI; namespace VHierarchy { public class VHierarchyLightingWindow : EditorWindow { void OnGUI() { void updateSize() { var r = ExpandWidthLabelRect(); if (!curEvent.isRepaint) return; var curHeight = r.y; this.position = position.SetWidth(initWidth).SetHeight(curHeight); this.minSize = Vector2.zero; this.maxSize = Vector2.one * 123212; } void header() { var height = 22f; var headerRect = Rect.zero.SetHeight(height).SetWidth(position.width); var pinButtonRect = headerRect.SetWidthFromRight(17).SetHeightFromMid(17).Move(-21, .5f); var closeButtonRect = headerRect.SetWidthFromRight(16).SetHeightFromMid(16).Move(-3, .5f); void startDragging() { if (isDragged) return; if (!curEvent.isMouseDrag) return; if (!headerRect.IsHovered()) return; isDragged = true; dragStartMousePos = EditorGUIUtility.GUIToScreenPoint(curEvent.mousePosition); dragStartWindowPos = position.position; isPinned = true; EditorApplication.RepaintHierarchyWindow(); } void updateDragging() { if (!isDragged) return; if (!curEvent.isRepaint) // ?? position = position.SetPos(dragStartWindowPos + EditorGUIUtility.GUIToScreenPoint(curEvent.mousePosition) - dragStartMousePos); EditorGUIUtility.hotControl = EditorGUIUtility.GetControlID(FocusType.Passive); } void stopDragging() { if (!isDragged) return; if (!curEvent.isMouseUp) return; isDragged = false; EditorGUIUtility.hotControl = 0; } void background() { headerRect.Draw(EditorGUIUtility.isProSkin ? Greyscale(.185f) : Greyscale(.7f)); } void title_() { SetGUIColor(Greyscale(.8f)); SetLabelAlignmentCenter(); GUI.Label(headerRect, "Lighting"); ResetLabelStyle(); ResetGUIColor(); } void pinButton() { if (!isPinned && closeButtonRect.IsHovered()) return; var normalColor = isDarkTheme ? Greyscale(.65f) : Greyscale(.8f); var hoveredColor = isDarkTheme ? Greyscale(.9f) : normalColor; var activeColor = Color.white; SetGUIColor(isPinned ? activeColor : pinButtonRect.IsHovered() ? hoveredColor : normalColor); GUI.Label(pinButtonRect, EditorGUIUtility.IconContent("pinned")); ResetGUIColor(); SetGUIColor(Color.clear); var clicked = GUI.Button(pinButtonRect, ""); ResetGUIColor(); if (!clicked) return; isPinned = !isPinned; } void closeButton() { SetGUIColor(Color.clear); if (GUI.Button(closeButtonRect, "") || (curEvent.isKeyDown && curEvent.keyCode == KeyCode.Escape)) Close(); ResetGUIColor(); var normalColor = isDarkTheme ? Greyscale(.65f) : Greyscale(.35f); var hoveredColor = isDarkTheme ? Greyscale(.9f) : normalColor; SetGUIColor(closeButtonRect.IsHovered() ? hoveredColor : normalColor); GUI.Label(closeButtonRect, EditorGUIUtility.IconContent("CrossIcon")); ResetGUIColor(); if (isPinned) return; var escRect = closeButtonRect.Move(-22, -1).SetWidth(70); SetGUIEnabled(false); if (closeButtonRect.IsHovered()) GUI.Label(escRect, "Esc"); ResetGUIEnabled(); } startDragging(); updateDragging(); stopDragging(); background(); title_(); pinButton(); closeButton(); Space(height); } void directionalLight() { var light = FindObjects().Where(r => r.type == LightType.Directional && r.gameObject.scene == EditorSceneManager.GetActiveScene()).FirstOrDefault(); if (!light) return; light.RecordUndo(); light.transform.RecordUndo(); ObjectFieldWidhoutPicker("Directional Light", light); Space(2); BeginIndent(8); EditorGUIUtility.labelWidth += 2; var rotX = light.transform.eulerAngles.x.Loop(-180, 180).Round(); var rotY = light.transform.eulerAngles.y.Loop(-180, 180).Round(); rotX = EditorGUILayout.Slider("Rotation X", rotX, 0, 90); rotY = EditorGUILayout.Slider("Rotation Y", rotY, -179, 180); if (light.transform.rotation != Quaternion.Euler(rotX, rotY, light.transform.eulerAngles.z)) light.transform.rotation = Quaternion.Euler(rotX, rotY, light.transform.eulerAngles.z); Space(3); light.intensity = EditorGUILayout.Slider("Intensity", light.intensity, 0, 2); light.color = SmallColorField(ExpandWidthLabelRect().AddWidthFromMid(-1).MoveX(-.5f), "Color", light.color, true); EndIndent(); } void ambientLight() { RenderSettings.ambientMode = (UnityEngine.Rendering.AmbientMode)EditorGUILayout.IntPopup("Ambient Light", (int)RenderSettings.ambientMode, new[] { "\u2009Skybox", "\u2009Gradient", "\u2009Color" }, new[] { 0, 1, 3 }); foreach (var r in FindObjects()) r.RecordUndo(); Space(2); BeginIndent(8); EditorGUIUtility.labelWidth += 4; if (RenderSettings.ambientMode == UnityEngine.Rendering.AmbientMode.Flat) { Color.RGBToHSV(RenderSettings.ambientSkyColor, out float h, out float s, out float v); v = EditorGUILayout.Slider("Intensity", v, .01f, 2); RenderSettings.ambientSkyColor = Color.HSVToRGB(h, s, v, true); RenderSettings.ambientSkyColor = SmallColorField("Color", RenderSettings.ambientSkyColor, false, true); } if (RenderSettings.ambientMode == UnityEngine.Rendering.AmbientMode.Skybox) RenderSettings.ambientIntensity = EditorGUILayout.Slider("Intensity", RenderSettings.ambientIntensity, 0, 2); if (RenderSettings.ambientMode == UnityEngine.Rendering.AmbientMode.Trilight) { RenderSettings.ambientSkyColor = SmallColorField("Color Sky", RenderSettings.ambientSkyColor, false, true); RenderSettings.ambientEquatorColor = SmallColorField("Color Horizon", RenderSettings.ambientEquatorColor, false, true); RenderSettings.ambientGroundColor = SmallColorField("Color Ground", RenderSettings.ambientGroundColor, false, true); } EndIndent(); } void fog() { var mode = EditorGUILayout.IntPopup("Fog", RenderSettings.fog ? (int)RenderSettings.fogMode : 0, new[] { "\u2009Off", "\u2009Linear", "\u2009Exponential", "\u2009Exponential Squared" }, new[] { 0, 1, 2, 3 }); if (RenderSettings.fog = mode != 0) RenderSettings.fogMode = (FogMode)mode; if (!RenderSettings.fog) return; Space(2); BeginIndent(8); EditorGUIUtility.labelWidth += 4; if (RenderSettings.fogMode == FogMode.Linear) { RenderSettings.fogStartDistance = EditorGUILayout.FloatField("Start", RenderSettings.fogStartDistance); RenderSettings.fogEndDistance = EditorGUILayout.FloatField("End", RenderSettings.fogEndDistance); } else RenderSettings.fogDensity = ExpSlider(ExpandWidthLabelRect().AddWidthFromRight(1.5f), "Density", RenderSettings.fogDensity, 0, .05f); RenderSettings.fogColor = SmallColorField("Color", RenderSettings.fogColor, true, false); EndIndent(); } header(); BeginIndent(6); EditorGUIUtility.labelWidth = 115; Space(11); directionalLight(); Space(18); ambientLight(); Space(18); fog(); EndIndent(6); Space(21); updateSize(); if (Application.platform != RuntimePlatform.OSXEditor) position.SetPos(0, 0).DrawOutline(Greyscale(.1f)); EditorGUIUtility.labelWidth = 0; Repaint(); } bool isDragged; Vector2 dragStartMousePos; Vector2 dragStartWindowPos; void OnLostFocus() { if (isPinned) return; Close(); } public bool isPinned; public static void CreateInstance(Vector2 position) { instance = ScriptableObject.CreateInstance(); instance.ShowPopup(); instance.position = Rect.zero.SetPos(position).SetSize(initWidth, initHeight); instance.minSize = Vector2.zero; instance.maxSize = Vector2.one * 123212; } public static VHierarchyLightingWindow instance; static float initWidth => 250; static float initHeight => 320; } } #endif