From 250e30d73f09e9da2b5a81d0fbae63744ae12a73 Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 2 Apr 2019 08:47:15 +0800 Subject: *misc --- source/modules/asura-core/window/window.h | 151 ++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 source/modules/asura-core/window/window.h (limited to 'source/modules/asura-core/window/window.h') diff --git a/source/modules/asura-core/window/window.h b/source/modules/asura-core/window/window.h new file mode 100644 index 0000000..8ce0e64 --- /dev/null +++ b/source/modules/asura-core/window/window.h @@ -0,0 +1,151 @@ +#ifndef __ASURA_ENGINE_WINDOW_H__ +#define __ASURA_ENGINE_WINDOW_H__ + +#include +#include +#include + +#include "../graphics/image.h" +#include "../graphics/render_state.h" +#include "../graphics/render_target.h" + +namespace AsuraEngine +{ + namespace Window + { + + class WindowImpl; + + /// + /// 从SDL拷贝过来的,留下一些有用的。 + /// + enum WindowFlag + { + WINDOW_FULLSCREEN = 1 << 1, ///< fullscreen window + WINDOW_OPENGL = 1 << 2, ///< window usable with OpenGL context + WINDOW_SHOWN = 1 << 3, ///< window is visible + WINDOW_HIDDEN = 1 << 4, ///< window is not visible + WINDOW_BORDERLESS = 1 << 5, ///< no window decoration + WINDOW_RESIZABLE = 1 << 6, ///< window can be resized + WINDOW_MINIMIZED = 1 << 7, ///< window is minimized + WINDOW_MAXIMIZED = 1 << 8, ///< window is maximized + WINDOW_INPUT_GRABBED = 1 << 9, ///< window has grabbed input focus + WINDOW_INPUT_FOCUS = 1 << 10, ///< window has input focus + WINDOW_MOUSE_FOCUS = 1 << 11, ///< window has mouse focus + WINDOW_ALLOW_HIGHDPI = 1 << 12, ///< window should be created in high-DPI mode if supported. + ///< On macOS NSHighResolutionCapable must be set true in the + ///< application's Info.plist for this to have any effect. + WINDOW_MOUSE_CAPTURE = 1 << 13, ///< window has mouse captured (unrelated to INPUT_GRABBED) + WINDOW_ALWAYS_ON_TOP = 1 << 14, ///< window should always be above others + }; + + /// + /// Window初始化配置项 + /// + struct WindowConfig + { + uint width, height; ///< 尺寸 + int x, y; ///< 窗口初始坐标 + std::string title; ///< 标题名 + bool vsync; ///< 垂直同步 + AEGraphics::ImageData* icon; ///< 图标 + bool show; ///< 是否显示 + int flag; ///< 窗口标记 + }; + + /// + /// 游戏的单窗口,runner只需要一个窗口。不同的客户端实现此接口并手动注册到lua。编辑器不 + /// 会导入此类,将会嫁接到编辑器的虚拟窗口上。 + /// + class Window ASURA_FINAL + : public AEGraphics::RenderTarget + , public AEScripting::Portable + , public Singleton + { + public: + + /// + /// 游戏运行时的窗口是唯一的,编辑器不会用到此类。 + /// + LUAX_DECL_SINGLETON(Window); + + Window(); + ~Window(); + + /// + /// 在这里真正创建窗口。 + /// + bool Init(const WindowConfig& config); + void Exit(); + + void SetSize(uint width, uint height); + void SetPosition(int x, int y); + void SetTitle(const std::string& title); + void SetIcon(AEGraphics::ImageData* imgData); + + void Show(); + void Hide(); + + /// + /// 如果是开启双缓冲的窗口,需要交换缓冲区来展示到前台 + /// + void SwapRenderBuffer(); + + void Clear(const AEGraphics::Color& col = AEGraphics::Color::Black) override; + void Clear(const Math::Recti& quad, const AEGraphics::Color& col = AEGraphics::Color::Black) override; + + void Draw(const AEGraphics::Drawable* texture, const AEGraphics::RenderState& state) override; + void Draw(const AEGraphics::Drawable* texture, const Math::Recti& quad, const AEGraphics::RenderState& state) override; + + private: + + //----------------------------------------------------------------------------// + + LUAX_DECL_ENUM(WindowFlag, 0); + + LUAX_DECL_METHOD(_Init); + LUAX_DECL_METHOD(_Exit); + LUAX_DECL_METHOD(_Show); + LUAX_DECL_METHOD(_Hide); + LUAX_DECL_METHOD(_SetSize); + LUAX_DECL_METHOD(_SetPosition); + LUAX_DECL_METHOD(_SetTitle); + LUAX_DECL_METHOD(_SetIcon); + LUAX_DECL_METHOD(_SwapRenderBuffer); + LUAX_DECL_METHOD(_Clear); + LUAX_DECL_METHOD(_Draw); + + //----------------------------------------------------------------------------// + + WindowImpl* mImpl; + + }; + + using RenderWindow = Window; + + ASURA_ABSTRACT class WindowImpl + { + public: + + WindowImpl() {}; + virtual ~WindowImpl() {}; + + virtual bool Init(const WindowConfig& config); + + virtual void SetSize(uint width, uint height) = 0; + virtual void SetPosition(int x, int y) = 0; + virtual void SetTitils(const std::string& title) = 0; + + virtual void Show() = 0; + virtual void Hide() = 0; + + virtual void SwapRenderBuffer() = 0; + + }; + + } +} + +namespace AEWindow = AsuraEngine::Window; + +#endif \ No newline at end of file -- cgit v1.1-26-g67d0