#if ENABLE_INPUT_SYSTEM && ENABLE_INPUT_SYSTEM_PACKAGE
#define USE_INPUT_SYSTEM
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
#endif
using UnityEditor;
namespace UnityEngine.Rendering
{
///
/// Provides mouse position for debugging purpose.
///
public class MousePositionDebug
{
// Singleton
private static MousePositionDebug s_Instance = null;
///
/// Singleton instance.
///
static public MousePositionDebug instance
{
get
{
if (s_Instance == null)
{
s_Instance = new MousePositionDebug();
}
return s_Instance;
}
}
#if UNITY_EDITOR
[ExecuteAlways]
class GameViewEventCatcher : MonoBehaviour
{
public static GameViewEventCatcher s_Instance = null;
public static void Cleanup()
{
if (s_Instance != null)
{
// Either we call DestroyImmediate or Destroy we get an error :(
// GameViewEventCatcher is only use for SSR debugging currently so comment this code and uncomment it if you want to debug SSR
//DestroyImmediate(s_Instance.gameObject);
//Destroy(s_Instance.gameObject);
}
}
public static void Build()
{
Cleanup();
var go = new GameObject("__GameViewEventCatcher");
go.hideFlags = HideFlags.HideAndDontSave;
s_Instance = go.AddComponent();
}
void Update()
{
Vector2 mousePosition;
bool rightClickPressed = false;
bool endKeyPressed = false;
#if USE_INPUT_SYSTEM
mousePosition = Pointer.current != null ? Pointer.current.position.ReadValue() : new Vector2(-1, -1);
if (Mouse.current != null)
rightClickPressed = Mouse.current.rightButton.isPressed;
if (Keyboard.current != null)
endKeyPressed = Keyboard.current.endKey.isPressed;
#else
mousePosition = Input.mousePosition;
rightClickPressed = Input.GetMouseButton(1);
endKeyPressed = Input.GetKey(KeyCode.End);
#endif
if (mousePosition.x < 0
|| mousePosition.y < 0
|| mousePosition.x > Screen.width
|| mousePosition.y > Screen.height)
return;
instance.m_mousePosition = mousePosition;
instance.m_mousePosition.y = Screen.height - instance.m_mousePosition.y;
if (rightClickPressed)
instance.m_MouseClickPosition = instance.m_mousePosition;
if (endKeyPressed)
instance.m_MouseClickPosition = instance.m_mousePosition;
}
}
private Vector2 m_mousePosition = Vector2.zero;
Vector2 m_MouseClickPosition = Vector2.zero;
private void OnSceneGUI(UnityEditor.SceneView sceneview)
{
m_mousePosition = Event.current.mousePosition;
switch (Event.current.type)
{
case EventType.MouseDown:
m_MouseClickPosition = m_mousePosition;
break;
case EventType.KeyDown:
switch (Event.current.keyCode)
{
case KeyCode.End:
// Usefull we you don't want to change the scene viewport but still update the mouse click position
m_MouseClickPosition = m_mousePosition;
sceneview.Repaint();
break;
}
break;
}
}
#endif
///
/// Initialize the MousePositionDebug class.
///
public void Build()
{
#if UNITY_EDITOR
UnityEditor.SceneView.duringSceneGui -= OnSceneGUI;
UnityEditor.SceneView.duringSceneGui += OnSceneGUI;
// Disabled as it cause error: GameViewEventCatcher is only use for SSR debugging currently so comment this code and uncomment it if you want to debug SSR
//GameViewEventCatcher.Build();
#endif
}
///
/// Cleanup the MousePositionDebug class.
///
public void Cleanup()
{
#if UNITY_EDITOR
UnityEditor.SceneView.duringSceneGui -= OnSceneGUI;
// Disabled as it cause error: GameViewEventCatcher is only use for SSR debugging currently so comment this code and uncomment it if you want to debug SSR
//GameViewEventCatcher.Cleanup();
#endif
}
///
/// Get the mouse position in the scene or game view.
///
/// Window height.
/// Get position in the scene view?
/// Coordinates of the mouse in the specified window.
public Vector2 GetMousePosition(float ScreenHeight, bool sceneView)
{
#if UNITY_EDITOR
if (sceneView)
{
// In play mode, m_mousePosition the one in the scene view
Vector2 mousePixelCoord = EditorGUIUtility.PointsToPixels(m_mousePosition);
mousePixelCoord.y = (ScreenHeight - 1.0f) - mousePixelCoord.y;
return mousePixelCoord;
}
else
{
// In play mode, Input.mousecoords matches the position in the game view
if (EditorApplication.isPlayingOrWillChangePlaymode)
{
return GetInputMousePosition();
}
else
{
// In non-play mode, only m_mousePosition is valid.
// We force -1, -1 as a game view pixel pos to avoid
// rendering un-wanted effects
return new Vector2(-1.0f, -1.0f);
}
}
#else
// In app mode, we only use the Input.mousecoords
return GetInputMousePosition();
#endif
}
Vector2 GetInputMousePosition()
{
#if USE_INPUT_SYSTEM
return Pointer.current != null ? Pointer.current.position.ReadValue() : new Vector2(-1, -1);
#else
return Input.mousePosition;
#endif
}
///
/// Returns the position of the mouse click.
///
/// Window height.
/// The coordinates of the mouse click.
public Vector2 GetMouseClickPosition(float ScreenHeight)
{
#if UNITY_EDITOR
Vector2 mousePixelCoord = EditorGUIUtility.PointsToPixels(m_MouseClickPosition);
mousePixelCoord.y = (ScreenHeight - 1.0f) - mousePixelCoord.y;
return mousePixelCoord;
#else
return Vector2.zero;
#endif
}
}
}