You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
4.1 KiB
125 lines
4.1 KiB
using UnityEngine;
|
|
using UnityEditor.EditorTools;
|
|
using UnityEditor;
|
|
|
|
[EditorTool("Light Placement Tool", typeof(Light))]
|
|
class LightPlacementTool : EditorTool
|
|
{
|
|
private const float k_DefaultZoom = 0.05f;
|
|
private bool initialPositionSet;
|
|
|
|
private static Vector3 initialPivot;
|
|
private static Quaternion initialRotation;
|
|
|
|
private static Vector3 originalPivot;
|
|
private static Quaternion originalRotation;
|
|
|
|
private static GameObject currentGameObject;
|
|
private float previousZoom;
|
|
private static SceneView.SceneViewState previousSceneViewState;
|
|
private static SceneView lastSceneView;
|
|
|
|
public override GUIContent toolbarIcon => EditorGUIUtility.TrIconContent(UnityEditor.Rendering.CoreEditorUtils.LoadIcon(@"Packages/com.unity.render-pipelines.core/Editor/Lighting/Icons/", "LightPlacement_Icon", ".png", false), "The Light Placement Tool temporarily changes the Scene Camera to look-through the currently selected Light. Use the Scene View Navigation controls to move it around the Scene.");
|
|
|
|
public override void OnActivated()
|
|
{
|
|
base.OnActivated();
|
|
if (lastSceneView == null)
|
|
{
|
|
lastSceneView = SceneView.lastActiveSceneView;
|
|
lastSceneView.orthographic = false;
|
|
previousSceneViewState = lastSceneView.sceneViewState;
|
|
lastSceneView.sceneViewState.alwaysRefresh = true;
|
|
}
|
|
TransitionCameraToLight();
|
|
Undo.undoRedoPerformed += OnUndoRedo;
|
|
}
|
|
|
|
public override void OnWillBeDeactivated()
|
|
{
|
|
base.OnWillBeDeactivated();
|
|
if (lastSceneView != null)
|
|
{
|
|
lastSceneView.sceneViewState = previousSceneViewState;
|
|
}
|
|
Undo.undoRedoPerformed -= OnUndoRedo;
|
|
ResetCamera();
|
|
}
|
|
|
|
public override void OnToolGUI(EditorWindow window)
|
|
{
|
|
base.OnToolGUI(window);
|
|
SceneView view = SceneView.lastActiveSceneView;
|
|
|
|
//View size getting smaller than 0.0001f causes the camera to get stuck
|
|
if (view.size <= 0)
|
|
view.FixNegativeSize();
|
|
|
|
if (lastSceneView != view)
|
|
return;
|
|
|
|
if (currentGameObject == null)
|
|
return;
|
|
|
|
if (!initialPositionSet)
|
|
{
|
|
SetInitialPosition(view);
|
|
return;
|
|
}
|
|
|
|
Event e = Event.current;
|
|
|
|
if (e.type == EventType.KeyDown && e.keyCode == KeyCode.Escape)
|
|
{
|
|
ToolManager.RestorePreviousTool();
|
|
e.Use();
|
|
view.Repaint();
|
|
return;
|
|
}
|
|
|
|
Undo.RecordObject(currentGameObject.transform, "Move Light");
|
|
Vector3 lookDir = (view.pivot - view.camera.transform.position).normalized;
|
|
currentGameObject.transform.SetPositionAndRotation(view.camera.transform.position + lookDir * k_DefaultZoom * 2f, view.camera.transform.rotation);
|
|
}
|
|
|
|
private void OnUndoRedo()
|
|
{
|
|
if (currentGameObject != null && lastSceneView != null)
|
|
{
|
|
lastSceneView.pivot = currentGameObject.transform.position;
|
|
lastSceneView.rotation = currentGameObject.transform.rotation;
|
|
}
|
|
}
|
|
|
|
private void TransitionCameraToLight()
|
|
{
|
|
initialPivot = SceneView.lastActiveSceneView.pivot;
|
|
initialRotation = SceneView.lastActiveSceneView.camera.transform.rotation;
|
|
|
|
var targetComponent = target as Light;
|
|
if (targetComponent != null)
|
|
{
|
|
currentGameObject = targetComponent.gameObject;
|
|
originalPivot = currentGameObject.transform.position;
|
|
originalRotation = currentGameObject.transform.rotation;
|
|
initialPositionSet = false;
|
|
}
|
|
}
|
|
|
|
private void SetInitialPosition(SceneView view)
|
|
{
|
|
previousZoom = view.size;
|
|
view.pivot = originalPivot;
|
|
view.rotation = originalRotation;
|
|
view.size = k_DefaultZoom;
|
|
view.Repaint();
|
|
initialPositionSet = true;
|
|
}
|
|
|
|
private void ResetCamera()
|
|
{
|
|
SceneView.lastActiveSceneView.pivot = initialPivot;
|
|
SceneView.lastActiveSceneView.rotation = initialRotation;
|
|
SceneView.lastActiveSceneView.size = previousZoom;
|
|
}
|
|
}
|