353 lines
10 KiB
C#
353 lines
10 KiB
C#
#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<Light>().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<RenderSettings>())
|
|
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<VHierarchyLightingWindow>();
|
|
|
|
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 |