#pragma once #include "Foundation/NSAutoreleasePool.hpp" #include "Graphics.h" #include "Graphics/Window.h" #include "Resources.h" #include "Texture.h" #define GLFW_INCLUDE_NONE #include #define GLFW_EXPOSE_NATIVE_COCOA #include #include #include #include namespace Seele { namespace Metal { class Window : public Gfx::Window { public: Window(PGraphics graphics, const WindowCreateInfo& createInfo); virtual ~Window(); virtual void show() override; virtual void pollInput() override; virtual void beginFrame() override; virtual void endFrame() override; virtual Gfx::PTexture2D getBackBuffer() const override; virtual void onWindowCloseEvent() override; virtual void setKeyCallback(std::function callback) override; virtual void setMouseMoveCallback(std::function callback) override; virtual void setMouseButtonCallback(std::function callback) override; virtual void setScrollCallback(std::function callback) override; virtual void setFileCallback(std::function callback) override; virtual void setCloseCallback(std::function callback) override; virtual void setResizeCallback(std::function callback) override; void keyPress(KeyCode code, InputAction action, KeyModifier modifier); void mouseMove(double x, double y); void mouseButton(MouseButton button, InputAction action, KeyModifier modifier); void scroll(double x, double y); void fileDrop(int num, const char** files); void close(); void resize(int width, int height); private: void createBackBuffer(); PGraphics graphics; WindowCreateInfo preferences; GLFWwindow* windowHandle; NSWindow* metalWindow; CA::MetalLayer* metalLayer; CA::MetalDrawable* drawable; OTexture2D backBuffer; OEvent renderDoneSemaphore; std::function keyCallback; std::function mouseMoveCallback; std::function mouseButtonCallback; std::function scrollCallback; std::function fileCallback; std::function closeCallback; std::function resizeCallback; }; DEFINE_REF(Window); class Viewport : public Gfx::Viewport { public: Viewport(PWindow owner, const ViewportCreateInfo& createInfo); virtual ~Viewport(); constexpr MTL::Viewport getHandle() const { return viewport; } virtual void resize(uint32 newX, uint32 newY); virtual void move(uint32 newOffset, uint32 newOffsetY); private: MTL::Viewport viewport; }; } // namespace Metal } // namespace Seele