diff options
Diffstat (limited to 'source/modules/asura-core/wnd/window.h')
-rw-r--r-- | source/modules/asura-core/wnd/window.h | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/source/modules/asura-core/wnd/window.h b/source/modules/asura-core/wnd/window.h new file mode 100644 index 0000000..1ecb934 --- /dev/null +++ b/source/modules/asura-core/wnd/window.h @@ -0,0 +1,149 @@ +#ifndef __ASURA_ENGINE_WINDOW_H__ +#define __ASURA_ENGINE_WINDOW_H__ + +#include <asura-utils/scripting/portable.hpp> +#include <asura-utils/math/vector2.hpp> +#include <asura-utils/singleton.hpp> + +#include "../graphics/image.h" +#include "../graphics/render_state.h" +#include "../graphics/render_target.h" + +namespace AsuraEngine +{ + namespace Wnd + { + + 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<Window> + , public Singleton<Window> + { + 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 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(); + virtual void Hide(); + + virtual void SwapRenderBuffer() = 0; + + }; + + } +} + +namespace AEWnd = AsuraEngine::Wnd; + +#endif
\ No newline at end of file |