mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
Added window (de-)activate events
This commit is contained in:
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
////
|
////
|
||||||
|
|||||||
@@ -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
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user