Added window (de-)activate events

This commit is contained in:
Simon Lübeß
2021-03-13 17:50:58 +01:00
parent 163dadbe37
commit cfff2cb738
7 changed files with 205 additions and 126 deletions
+99 -96
View File
@@ -1,96 +1,99 @@
using System; using System;
using GlitchyEngine.Events; using GlitchyEngine.Events;
using GlitchyEngine.ImGui; using GlitchyEngine.ImGui;
using GlitchyEngine.Renderer; using GlitchyEngine.Renderer;
namespace GlitchyEngine namespace GlitchyEngine
{ {
public class Application public class Application
{ {
static Application s_Instance = null; static Application s_Instance = null;
private Window _window ~ delete _; private Window _window ~ delete _;
private RendererAPI _rendererApi ~ delete _; private RendererAPI _rendererApi ~ delete _;
private bool _running = true; private bool _running = true;
private LayerStack _layerStack = new LayerStack() ~ delete _; private LayerStack _layerStack = new LayerStack() ~ delete _;
private ImGuiLayer _imGuiLayer; private ImGuiLayer _imGuiLayer;
private GameTime _gameTime = new GameTime(true) ~ delete _; private GameTime _gameTime = new GameTime(true) ~ delete _;
public bool IsRunning => _running; public bool IsRunning => _running;
public Window Window => _window; public Window Window => _window;
[Inline] [Inline]
public static Application Get() => s_Instance; public static Application Get() => s_Instance;
public this() public this()
{ {
Log.EngineLogger.Assert(s_Instance == null, "Tried to create a second application."); Log.EngineLogger.Assert(s_Instance == null, "Tried to create a second application.");
s_Instance = this; s_Instance = this;
_window = new Window(.Default); _window = new Window(.Default);
_window.EventCallback = new => OnEvent; _window.EventCallback = new => OnEvent;
_rendererApi = new RendererAPI(); _rendererApi = new RendererAPI();
_rendererApi.Context = _window.Context; _rendererApi.Context = _window.Context;
SamplerStateManager.Init(_window.Context); SamplerStateManager.Init(_window.Context);
RenderCommand.RendererAPI = _rendererApi; RenderCommand.RendererAPI = _rendererApi;
Renderer.Init(_window.Context); Renderer.Init(_window.Context);
_imGuiLayer = new ImGuiLayer(); _imGuiLayer = new ImGuiLayer();
PushOverlay(_imGuiLayer); PushOverlay(_imGuiLayer);
} }
public ~this() public ~this()
{ {
SamplerStateManager.Uninit(); SamplerStateManager.Uninit();
} }
public void OnEvent(Event e) public void OnEvent(Event e)
{ {
EventDispatcher dispatcher = scope .(e); if(!_running)
dispatcher.Dispatch<WindowCloseEvent>(scope => OnWindowClose); return;
for(Layer layer in _layerStack) EventDispatcher dispatcher = scope .(e);
{ dispatcher.Dispatch<WindowCloseEvent>(scope => OnWindowClose);
layer.OnEvent(e);
if(e.Handled) for(Layer layer in _layerStack)
break; {
} layer.OnEvent(e);
} if(e.Handled)
break;
public void Run() }
{ }
while(_running)
{ public void Run()
_gameTime.NewFrame(); {
while(_running)
Input.NewFrame(); {
_gameTime.NewFrame();
for(Layer layer in _layerStack)
layer.Update(_gameTime); Input.NewFrame();
_window.Update(); for(Layer layer in _layerStack)
layer.Update(_gameTime);
_imGuiLayer.ImGuiRender();
_window.Update();
_window.Context.SwapChain.Present();
} _imGuiLayer.ImGuiRender();
}
_window.Context.SwapChain.Present();
public void PushLayer(Layer ownLayer) => _layerStack.PushLayer(ownLayer); }
}
public void PushOverlay(Layer ownOverlay) => _layerStack.PushOverlay(ownOverlay);
public void PushLayer(Layer ownLayer) => _layerStack.PushLayer(ownLayer);
public bool OnWindowClose(WindowCloseEvent e)
{ public void PushOverlay(Layer ownOverlay) => _layerStack.PushOverlay(ownOverlay);
_running = false;
return true; public bool OnWindowClose(WindowCloseEvent e)
} {
} _running = false;
} return true;
}
}
}
@@ -89,4 +89,44 @@ namespace GlitchyEngine.Events
strBuffer.AppendF("WindowMovedEvent: {}, {} (is moving: {})", _x, _y, _isMoving); strBuffer.AppendF("WindowMovedEvent: {}, {} (is moving: {})", _x, _y, _isMoving);
} }
} }
public class WindowActivateEvent : Event, IEvent
{
public override EventType EventType => .WindowMoved;
public override StringView Name => "WindowActivated";
public override EventCategory Category => .Application;
public static EventType StaticType => .WindowActivated;
public this()
{
}
public override void ToString(String strBuffer)
{
strBuffer.AppendF("WindowActivatedEvent");
}
}
public class WindowDeactivateEvent : Event, IEvent
{
public override EventType EventType => .WindowMoved;
public override StringView Name => "WindowDeactivated";
public override EventCategory Category => .Application;
public static EventType StaticType => .WindowDeactivated;
public this()
{
}
public override void ToString(String strBuffer)
{
strBuffer.AppendF("WindowDeactivatedEvent");
}
}
} }
+1 -1
View File
@@ -4,7 +4,7 @@ namespace GlitchyEngine.Events
public enum EventType public enum EventType
{ {
None = 0, None = 0,
WindowClose, WindowResize, WindowFocus, WindowLostFocus, WindowMoved, WindowClose, WindowResize, WindowFocus, WindowLostFocus, WindowMoved, WindowActivated, WindowDeactivated,
AppTick, AppUpdate, AppRender, AppTick, AppUpdate, AppRender,
KeyPressed, KeyReleased, KeyTyped, KeyPressed, KeyReleased, KeyTyped,
MouseButtonPressed, MouseButtonReleased, MouseMoved, MouseScrolled MouseButtonPressed, MouseButtonReleased, MouseMoved, MouseScrolled
@@ -20,8 +20,10 @@ namespace GlitchyEngine
public Point CursorPositionDifference; public Point CursorPositionDifference;
} }
static WindowsInputState* CurrentState = new WindowsInputState() ~ delete _; static WindowsInputState[2] IputStates;
static WindowsInputState* LastState = new WindowsInputState() ~ delete _;
static WindowsInputState* CurrentState = &IputStates[0];
static WindowsInputState* LastState = &IputStates[1];
// //
// Current Keyboard state // Current Keyboard state
@@ -162,11 +164,8 @@ namespace GlitchyEngine
public override static void NewFrame() public override static void NewFrame()
{ {
// Switch last and current states Swap!(CurrentState, LastState);
var buffer = LastState;
LastState = CurrentState;
CurrentState = buffer;
// Get current keyboard state // Get current keyboard state
if(DirectX.Windows.Winuser.GetKeyboardState((uint8*)&CurrentState.KeyStates) == 0) if(DirectX.Windows.Winuser.GetKeyboardState((uint8*)&CurrentState.KeyStates) == 0)
{ {
@@ -31,6 +31,8 @@ namespace GlitchyEngine
private bool _isVSync = true; private bool _isVSync = true;
private bool _isActive;
private GraphicsContext _graphicsContext ~ _?.ReleaseRef(); private GraphicsContext _graphicsContext ~ _?.ReleaseRef();
public override GraphicsContext Context => _graphicsContext; public override GraphicsContext Context => _graphicsContext;
@@ -149,6 +151,8 @@ namespace GlitchyEngine
set => _isVSync = value; set => _isVSync = value;
} }
public override bool IsActive => _isActive;
public override void* NativeWindow => (void*)(int)_windowHandle; public override void* NativeWindow => (void*)(int)_windowHandle;
public override this(WindowDescription desc) public override this(WindowDescription desc)
@@ -176,6 +180,9 @@ namespace GlitchyEngine
UnregisterClass(WindowClassName.ToScopedNativeWChar!(), _instanceHandle); UnregisterClass(WindowClassName.ToScopedNativeWChar!(), _instanceHandle);
} }
[LinkName(.C)]
static extern HWnd GetActiveWindow();
private void Init(WindowDescription desc) private void Init(WindowDescription desc)
{ {
Log.EngineLogger.Trace($"Creating window \"{desc.Title}\" ({desc.Width}, {desc.Height})..."); Log.EngineLogger.Trace($"Creating window \"{desc.Title}\" ({desc.Width}, {desc.Height})...");
@@ -215,6 +222,9 @@ namespace GlitchyEngine
LoadWindowRectangle(); LoadWindowRectangle();
Log.EngineLogger.Trace($"Created window \"{Title}\" ({Width}, {Height})"); Log.EngineLogger.Trace($"Created window \"{Title}\" ({Width}, {Height})");
// Determine whether or not the window is currently active
_isActive = GetActiveWindow() == _windowHandle;
} }
private bool _isResizingOrMoving; private bool _isResizingOrMoving;
@@ -304,7 +314,26 @@ namespace GlitchyEngine
var moveEvent = scope WindowMoveEvent(window._clientRect.X, window._clientRect.Y, false); var moveEvent = scope WindowMoveEvent(window._clientRect.X, window._clientRect.Y, false);
window._eventCallback(moveEvent); window._eventCallback(moveEvent);
} }
case 0x0006: //WM_ACTIVATE
{
SplitHighAndLowOrder!((int64)wParam, let lowWParam, let highWParam);
bool isActivate = lowWParam > 0;
//HWnd windowHandle = (.)lParam;
if(window._isActive != isActivate)
{
window._isActive = isActivate;
if(window._isActive)
window._eventCallback(scope WindowActivateEvent());
else
window._eventCallback(scope WindowDeactivateEvent());
}
}
//// ////
//// Keyboard input //// Keyboard input
//// ////
+5
View File
@@ -98,6 +98,11 @@ namespace GlitchyEngine
*/ */
public extern void* NativeWindow {get;} public extern void* NativeWindow {get;}
/**
* Gets whether or not the window is active.
*/
public extern bool IsActive {get;}
public EventCallback EventCallback public EventCallback EventCallback
{ {
get => _eventCallback; get => _eventCallback;
+25 -22
View File
@@ -193,32 +193,35 @@ namespace Sandbox
public override void Update(GameTime gameTime) public override void Update(GameTime gameTime)
{ {
Vector2 movement = .(); if(Application.Get().Window.IsActive)
if(Input.IsKeyPressed(Key.W))
{ {
movement.Y += 1; Vector2 movement = .();
}
if(Input.IsKeyPressed(Key.S))
{
movement.Y -= 1;
}
if(Input.IsKeyPressed(Key.A))
{
movement.X -= 1;
}
if(Input.IsKeyPressed(Key.D))
{
movement.X += 1;
}
if(movement != .Zero) if(Input.IsKeyPressed(Key.W))
movement.Normalize(); {
movement.Y += 1;
}
if(Input.IsKeyPressed(Key.S))
{
movement.Y -= 1;
}
movement *= (float)(gameTime.FrameTime.TotalSeconds); if(Input.IsKeyPressed(Key.A))
{
movement.X -= 1;
}
if(Input.IsKeyPressed(Key.D))
{
movement.X += 1;
}
_camera.Position += .(movement, 0); if(movement != .Zero)
movement.Normalize();
movement *= (float)(gameTime.FrameTime.TotalSeconds);
_camera.Position += .(movement, 0);
}
_camera.Width = _context.SwapChain.BackbufferViewport.Width / 256; _camera.Width = _context.SwapChain.BackbufferViewport.Width / 256;
_camera.Height = _context.SwapChain.BackbufferViewport.Height / 256; _camera.Height = _context.SwapChain.BackbufferViewport.Height / 256;