diff --git a/GlitchyEditor/assets/app.html b/GlitchyEditor/assets/app.html
index 375b678..c7a9ef9 100644
--- a/GlitchyEditor/assets/app.html
+++ b/GlitchyEditor/assets/app.html
@@ -43,6 +43,12 @@
margin-top: 6px;
background: linear-gradient(0deg, #7270ed, #6a11ea);
}
+ button:hover {
+ box-shadow: none;
+ margin-left: 6px;
+ margin-top: 6px;
+ background: linear-gradient(0deg, #7d2eea, #908ee8);
+ }
#msg {
visibility: hidden;
opacity: 0;
diff --git a/GlitchyEditor/src/UltralightLayer.bf b/GlitchyEditor/src/UltralightLayer.bf
index b33044e..bfe2e0b 100644
--- a/GlitchyEditor/src/UltralightLayer.bf
+++ b/GlitchyEditor/src/UltralightLayer.bf
@@ -12,10 +12,67 @@ namespace GlitchyEditor;
class UltralightLayer : Layer
{
+ Window windoww ~ delete _;
+
+ int2 cursorPosition;
+
public this()
{
NoApp();
//RenderApp();
+
+ WindowDescription windowDesc = .Default;
+ windowDesc.Icon = "Resources/Textures/GlitchyEngineIcon.ico";
+ windowDesc.Title = "Test";
+
+ windoww = new Window(windowDesc);
+ windoww.EventCallback = new => EventHandler;
+ }
+
+ private void EventHandler(Event e)
+ {
+ EventDispatcher dispatcher = EventDispatcher(e);
+
+ dispatcher.Dispatch(scope => MouseMoved);
+ dispatcher.Dispatch(scope (e) => MousePressed(e, true));
+ dispatcher.Dispatch(scope (e) => MousePressed(e, false));
+ }
+
+ private bool MouseMoved(MouseMovedEvent e)
+ {
+ if (e.Window == windoww)
+ {
+ Log.EngineLogger.Warning($"{e.PositionX}");
+ ULMouseEvent evt = ulCreateMouseEvent(.kMouseEventType_MouseMoved, e.PositionX, e.PositionY, .kMouseButton_None);
+ ulViewFireMouseEvent(view, evt);
+ ulDestroyMouseEvent(evt);
+
+ cursorPosition = .(e.PositionX, e.PositionY);
+ }
+
+ return false;
+ }
+
+ private bool MousePressed(MouseButtonEvent e, bool press)
+ {
+ if (e.Window == windoww)
+ {
+ ULMouseButton button = .kMouseButton_None;
+
+ switch (e.MouseButton)
+ {
+ case .LeftButton: button = .kMouseButton_Left;
+ case .RightButton: button = .kMouseButton_Right;
+ case .MiddleButton: button = .kMouseButton_Middle;
+ default: button = .kMouseButton_None;
+ }
+
+ ULMouseEvent evt = ulCreateMouseEvent(press ? .kMouseEventType_MouseDown : .kMouseEventType_MouseUp, cursorPosition.X, cursorPosition.Y, button);
+ ulViewFireMouseEvent(view, evt);
+ ulDestroyMouseEvent(evt);
+ }
+
+ return false;
}
private static void OnAppUpdate(void* user_data)
@@ -162,6 +219,13 @@ class UltralightLayer : Layer
CopybitmapToTexture(ulBitmapSurfaceGetBitmap(surface));
ulSurfaceClearDirtyBounds(surface);
}
+
+ Render();
+ }
+
+ private void Render()
+ {
+ RenderCommand.Clear(windoww.SwapChain.BackBuffer, .Color | .Depth, .(0.7f, 0.2f, 0.2f), 1.0f, 0);
}
private void CreateView()
@@ -171,6 +235,8 @@ class UltralightLayer : Layer
view = ulCreateView(renderer, 500, 500, viewConfig, null);
+ ulViewSetDOMReadyCallback(view, => OnDOMReady, null);
+
ulDestroyViewConfig(viewConfig);
ULString url = ulCreateString("file:///app.html");
diff --git a/GlitchyEngine/src/Application.bf b/GlitchyEngine/src/Application.bf
index eade313..5f35c8c 100644
--- a/GlitchyEngine/src/Application.bf
+++ b/GlitchyEngine/src/Application.bf
@@ -15,6 +15,9 @@ namespace GlitchyEngine
static Application s_Instance = null;
private Window _mainWindow;
+
+ private append List _windows = .();
+
private RendererAPI _rendererApi;
private bool _running = true;
@@ -53,6 +56,8 @@ namespace GlitchyEngine
public Settings Settings {get; private set;} = new .() ~ delete _;
+ public List Windows => _windows;
+
public this()
{
Profiler.ProfileFunction!();
@@ -122,7 +127,11 @@ namespace GlitchyEngine
delete _layerStack;
delete _rendererApi;
- delete _mainWindow;
+
+ while (!_windows.IsEmpty)
+ {
+ delete _windows.Back;
+ }
delete _gameTime;
@@ -197,8 +206,11 @@ namespace GlitchyEngine
#if IMGUI
_imGuiLayer.ImGuiRender();
#endif
-
- _mainWindow.SwapChain.Present();
+
+ for (Window window in _windows)
+ {
+ window.SwapChain.Present();
+ }
}
}
}
diff --git a/GlitchyEngine/src/Events/MouseEvent.bf b/GlitchyEngine/src/Events/MouseEvent.bf
index c785594..bbd68f6 100644
--- a/GlitchyEngine/src/Events/MouseEvent.bf
+++ b/GlitchyEngine/src/Events/MouseEvent.bf
@@ -4,6 +4,7 @@ namespace GlitchyEngine.Events
{
public class MouseMovedEvent : Event, IEvent
{
+ private Window _window;
private int32 _mouseX, _mouseY;
public override EventType EventType => .MouseMoved;
@@ -14,11 +15,14 @@ namespace GlitchyEngine.Events
public static EventType StaticType => .MouseMoved;
+ public Window Window => _window;
+
public int32 PositionX => _mouseX;
public int32 PositionY => _mouseY;
- public this(int32 x, int32 y)
+ public this(Window window, int32 x, int32 y)
{
+ _window = window;
_mouseX = x;
_mouseY = y;
}
@@ -95,14 +99,18 @@ namespace GlitchyEngine.Events
public abstract class MouseButtonEvent : Event
{
+ protected Window _window;
protected MouseButton _mouseButton;
public override EventCategory Category => .Input | .Mouse;
+ public Window Window => _window;
+
public MouseButton MouseButton => _mouseButton;
- protected this(MouseButton mouseButton)
+ protected this(Window window, MouseButton mouseButton)
{
+ _window = window;
_mouseButton = mouseButton;
}
}
@@ -115,7 +123,7 @@ namespace GlitchyEngine.Events
public static EventType StaticType => .MouseButtonPressed;
- public this(MouseButton mouseButton) : base(mouseButton) { }
+ public this(Window window, MouseButton mouseButton) : base(window, mouseButton) { }
public override void ToString(String strBuffer)
{
@@ -132,7 +140,7 @@ namespace GlitchyEngine.Events
public static EventType StaticType => .MouseButtonReleased;
- public this(MouseButton mouseButton) : base(mouseButton) { }
+ public this(Window window, MouseButton mouseButton) : base(window, mouseButton) { }
public override void ToString(String strBuffer)
{
diff --git a/GlitchyEngine/src/Platform/Windows/WindowsWindow.bf b/GlitchyEngine/src/Platform/Windows/WindowsWindow.bf
index 83a1b7d..01e4438 100644
--- a/GlitchyEngine/src/Platform/Windows/WindowsWindow.bf
+++ b/GlitchyEngine/src/Platform/Windows/WindowsWindow.bf
@@ -162,6 +162,8 @@ namespace GlitchyEngine
_minMaxInfo.MaximumTrackingSize.x = int32.MaxValue;
_minMaxInfo.MaximumTrackingSize.y = int32.MaxValue;
+ Application.Instance.Windows.Add(this);
+
Init(desc);
}
@@ -181,7 +183,10 @@ namespace GlitchyEngine
Log.EngineLogger.Error($"Failed to destroy window: Message ({(int)res}): {res}");
}
+ // TODO manage window classes somehow
UnregisterClass(WindowClassName.ToScopedNativeWChar!(), _instanceHandle);
+
+ Application.Instance.Windows.Remove(this);
}
[LinkName(.C)]
@@ -217,7 +222,7 @@ namespace GlitchyEngine
{
uint32 lastError = GetLastError();
Log.EngineLogger.Error($"Failed to register window class. Message({(int)lastError}): {(HResult)lastError}");
- Runtime.FatalError("Failed to register window class");
+ //Runtime.FatalError("Failed to register window class");
}
{
@@ -381,34 +386,34 @@ namespace GlitchyEngine
// Left mouse button
case WM_LBUTTONDOWN:
{
- var event = scope MouseButtonPressedEvent(.LeftButton);
+ var event = scope MouseButtonPressedEvent(window, .LeftButton);
window._eventCallback(event);
}
case WM_LBUTTONUP:
{
- var event = scope MouseButtonReleasedEvent(.LeftButton);
+ var event = scope MouseButtonReleasedEvent(window, .LeftButton);
window._eventCallback(event);
}
// Right mouse button
case WM_RBUTTONDOWN:
{
- var event = scope MouseButtonPressedEvent(.RightButton);
+ var event = scope MouseButtonPressedEvent(window, .RightButton);
window._eventCallback(event);
}
case WM_RBUTTONUP:
{
- var event = scope MouseButtonReleasedEvent(.RightButton);
+ var event = scope MouseButtonReleasedEvent(window, .RightButton);
window._eventCallback(event);
}
// Middle mouse button
case WM_MBUTTONDOWN:
{
- var event = scope MouseButtonPressedEvent(.MiddleButton);
+ var event = scope MouseButtonPressedEvent(window, .MiddleButton);
window._eventCallback(event);
}
case WM_MBUTTONUP:
{
- var event = scope MouseButtonReleasedEvent(.MiddleButton);
+ var event = scope MouseButtonReleasedEvent(window, .MiddleButton);
window._eventCallback(event);
}
// X button
@@ -420,7 +425,7 @@ namespace GlitchyEngine
else
button = .XButton2;
- var event = scope MouseButtonPressedEvent(button);
+ var event = scope MouseButtonPressedEvent(window, button);
window._eventCallback(event);
}
case WM_XBUTTONUP:
@@ -431,7 +436,7 @@ namespace GlitchyEngine
else
button = .XButton2;
- var event = scope MouseButtonReleasedEvent(button);
+ var event = scope MouseButtonReleasedEvent(window, button);
window._eventCallback(event);
}
// Vertical scrolling
@@ -453,8 +458,8 @@ namespace GlitchyEngine
case WM_MOUSEMOVE:
{
SplitHighAndLowOrder!(lParam, let x, let y);
-
- var event = scope MouseMovedEvent(x, y);
+
+ var event = scope MouseMovedEvent(window, x, y);
window._eventCallback(event);
}
case WM_INPUT:
@@ -470,8 +475,8 @@ namespace GlitchyEngine
RAWINPUT* raw = (.)rawData.CArray();
if (raw.Header.Type == RIM_TYPEMOUSE)
{
- var event = scope MouseMovedEvent(raw.Data.Mouse.lLastX, raw.Data.Mouse.lLastY);
- window._eventCallback(event);
+ var event = scope MouseMovedEvent(window, raw.Data.Mouse.lLastX, raw.Data.Mouse.lLastY);
+ //window._eventCallback(event);
// We accumulate the raw movements an collect them once each frame in WindowsInput.Impl_NewFrame()
window._rawMouseMovementAccumulator += int2(raw.Data.Mouse.lLastX, raw.Data.Mouse.lLastY);
diff --git a/GlitchyEngine/src/Window.bf b/GlitchyEngine/src/Window.bf
index 2147c50..fc0fad7 100644
--- a/GlitchyEngine/src/Window.bf
+++ b/GlitchyEngine/src/Window.bf
@@ -31,7 +31,7 @@ namespace GlitchyEngine
public delegate void EventCallback(Event e);
- protected EventCallback _eventCallback ~ delete _;
+ protected EventCallback _eventCallback = new => DefaultEventHandler ~ delete _;
public SwapChain SwapChain => _swapChain;
@@ -105,7 +105,11 @@ namespace GlitchyEngine
public EventCallback EventCallback
{
get => _eventCallback;
- set => _eventCallback = value;
+ set
+ {
+ delete _eventCallback;
+ _eventCallback = value;
+ }
}
public extern void Update();
@@ -114,5 +118,10 @@ namespace GlitchyEngine
* Sets the Icon of the window to the given file.
*/
public extern Result SetIcon(StringView filePath);
+
+ private void DefaultEventHandler(Event e)
+ {
+ Log.EngineLogger.Error($"No event handler registered for window.");
+ }
}
}