private void OnGUI()
{
if (position.size * EditorGUIUtility.pixelsPerPoint != m_LastWindowPixelSize) // pixelsPerPoint only reliable in OnGUI()
{
UpdateZoomAreaAndParent();
}
if (showToolbar)
{
DoToolbarGUI();
}
// This isn't ideal. Custom Cursors set by editor extensions for other windows can leak into the game view.
// To fix this we should probably stop using the global custom cursor (intended for runtime) for custom editor cursors.
// This has been noted for Cursors tech debt.
EditorGUIUtility.AddCursorRect(viewInWindow, MouseCursor.CustomCursor);
EventType type = Event.current.type;
// Gain mouse lock when clicking on game view content
if (type == EventType.MouseDown && viewInWindow.Contains(Event.current.mousePosition))
{
AllowCursorLockAndHide(true);
}
// Lose mouse lock when pressing escape
else if (type == EventType.KeyDown && Event.current.keyCode == KeyCode.Escape)
{
AllowCursorLockAndHide(false);
}
// We hide sliders when playing, and also when we are zoomed out beyond canvas edges
var playing = EditorApplication.isPlaying && !EditorApplication.isPaused;
var targetInContentCached = targetInContent;
m_ZoomArea.hSlider = !playing && m_ZoomArea.shownArea.width < targetInContentCached.width;
m_ZoomArea.vSlider = !playing && m_ZoomArea.shownArea.height < targetInContentCached.height;
m_ZoomArea.enableMouseInput = !playing;
ConfigureZoomArea();
// We don't want controls inside the GameView (e.g. the toolbar) to have keyboard focus while playing.
// The game should get the keyboard events.
if (playing)
{
EditorGUIUtility.keyboardControl = 0;
}
GUI.color = Color.white; // Get rid of play mode tint
var originalEventType = Event.current.type;
m_ZoomArea.BeginViewGUI();
// Window size might change on Layout event
if (type == EventType.Layout)
{
targetSize = targetRenderSize;
}
// Setup game view dimensions, so that player loop can use it for input
var gameViewTarget = GUIClip.UnclipToWindow(m_ZoomArea.drawRect);
if (m_Parent)
{
var zoomedTarget = new Rect(targetInView.position + gameViewTarget.position, targetInView.size);
SetParentGameViewDimensions(zoomedTarget, gameViewTarget, targetRenderSize);
}
var editorMousePosition = Event.current.mousePosition;
var gameMousePosition = (editorMousePosition + gameMouseOffset) * gameMouseScale;
if (type == EventType.Repaint)
{
GUI.Box(m_ZoomArea.drawRect, GUIContent.none, Styles.gameViewBackgroundStyle);
Vector2 oldOffset = GUIUtility.s_EditorScreenPointOffset;
GUIUtility.s_EditorScreenPointOffset = Vector2.zero;
SavedGUIState oldState = SavedGUIState.Create();
var clearTexture = m_ClearInEditMode && !EditorApplication.isPlaying;
var currentTargetDisplay = 0;
if (ModuleManager.ShouldShowMultiDisplayOption())
{
// Display Targets can have valid targets from 0 to 7.
System.Diagnostics.Debug.Assert(targetDisplay < 8, "Display Target is Out of Range");
currentTargetDisplay = targetDisplay;
}
targetDisplay = currentTargetDisplay;
targetSize = targetRenderSize;
showGizmos = m_Gizmos;
clearColor = kClearBlack;
renderIMGUI = true;
if (!EditorApplication.isPlaying || (EditorApplication.isPlaying && Time.frameCount % OnDemandRendering.renderFrameInterval == 0))
{
m_RenderTexture = RenderView(gameMousePosition, clearTexture);
}
if (m_TargetClamped)
{
Debug.LogWarningFormat("GameView reduced to a reasonable size for this system ({0}x{1})", targetSize.x, targetSize.y);
}
EditorGUIUtility.SetupWindowSpaceAndVSyncInternal(GUIClip.Unclip(viewInWindow));
if (m_RenderTexture != null && m_RenderTexture.IsCreated())
{
oldState.ApplyAndForget();
GUIUtility.s_EditorScreenPointOffset = oldOffset;
GUI.BeginGroup(m_ZoomArea.drawRect);
// Actually draw the game view to the screen, without alpha blending
Rect drawRect = deviceFlippedTargetInView;
drawRect.x = Mathf.Round(drawRect.x);
drawRect.y = Mathf.Round(drawRect.y);
Graphics.DrawTexture(drawRect, m_RenderTexture, new Rect(0, 0, 1, 1), 0, 0, 0, 0, GUI.color, GUI.blitMaterial);
GUI.EndGroup();
}
}
else if (type != EventType.Layout && type != EventType.Used)
{
if (Event.current.isKey && (!EditorApplication.isPlaying || EditorApplication.isPaused))
{
return;
}
bool mousePosInGameViewRect = viewInWindow.Contains(Event.current.mousePosition);
// MouseDown events outside game view rect are not send to scripts but MouseUp events are (see below)
if (Event.current.rawType == EventType.MouseDown && !mousePosInGameViewRect)
{
return;
}
var originalDisplayIndex = Event.current.displayIndex;
// Transform events into local space, so the mouse position is correct
// Then queue it up for playback during playerloop
Event.current.mousePosition = gameMousePosition;
Event.current.displayIndex = targetDisplay;
EditorGUIUtility.QueueGameViewInputEvent(Event.current);
// Do not use mouse UP event if mousepos is outside game view rect (fix for case 380995: Gameview tab's context menu is not appearing on right click)
// Placed after event queueing above to ensure scripts can react on mouse up events.
bool useEvent = !(Event.current.rawType == EventType.MouseUp && !mousePosInGameViewRect);
// Don't use command events, or they won't be sent to other views.
if (type == EventType.ExecuteCommand || type == EventType.ValidateCommand)
{
useEvent = false;
}
if (useEvent)
{
Event.current.Use();
}
else
{
Event.current.mousePosition = editorMousePosition;
}
// Reset display index
Event.current.displayIndex = originalDisplayIndex;
}
m_ZoomArea.EndViewGUI();
if (originalEventType == EventType.ScrollWheel && Event.current.type == EventType.Used)
{
EditorApplication.update -= SnapZoomDelayed;
EditorApplication.update += SnapZoomDelayed;
s_LastScrollTime = EditorApplication.timeSinceStartup;
}
EnforceZoomAreaConstraints();
if (m_RenderTexture)
{
if (m_ZoomArea.scale.y < 1f)
{
m_RenderTexture.filterMode = FilterMode.Bilinear;
}
else
{
m_RenderTexture.filterMode = FilterMode.Point;
}
}
if (m_NoCameraWarning && !EditorGUIUtility.IsDisplayReferencedByCameras(targetDisplay))
{
GUI.Label(warningPosition, GUIContent.none, EditorStyles.notificationBackground);
var displayName = ModuleManager.ShouldShowMultiDisplayOption() ? DisplayUtility.GetDisplayNames()[targetDisplay].text : string.Empty;
var cameraWarning = string.Format("{0}\nNo cameras rendering", displayName);
EditorGUI.DoDropShadowLabel(warningPosition, EditorGUIUtility.TempContent(cameraWarning), EditorStyles.notificationText, .3f);
}
if (m_Stats)
{
GameViewGUI.GameViewStatsGUI();
}
}