summaryrefslogtreecommitdiff
path: root/source/modules/asura-core/wnd/window.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/modules/asura-core/wnd/window.h')
-rw-r--r--source/modules/asura-core/wnd/window.h149
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