summaryrefslogtreecommitdiff
path: root/Source/modules/asura-core/Graphics/GfxDevice.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/modules/asura-core/Graphics/GfxDevice.h')
-rw-r--r--Source/modules/asura-core/Graphics/GfxDevice.h141
1 files changed, 141 insertions, 0 deletions
diff --git a/Source/modules/asura-core/Graphics/GfxDevice.h b/Source/modules/asura-core/Graphics/GfxDevice.h
new file mode 100644
index 0000000..2b105df
--- /dev/null
+++ b/Source/modules/asura-core/Graphics/GfxDevice.h
@@ -0,0 +1,141 @@
+#ifndef _ASURA_ENGINE_GFX_DEVICE_H_
+#define _ASURA_ENGINE_GFX_DEVICE_H_
+
+#include <stack>
+
+#include <glad/glad.h>
+
+#include <asura-base/Scripting/Scripting.h>
+#include <asura-base/Math/Rect.hpp>
+#include <asura-base/Math/matrix44.h>
+#include <asura-base/Math/vector4.h>
+
+#include "Color.h"
+#include "MatrixStack.h"
+
+namespace_begin(AsuraEngine)
+namespace_begin(Graphics)
+
+class Profiler;
+class Shader;
+class GPUBuffer;
+class Canvas;
+
+enum MatrixMode
+{
+ MATRIX_MODE_PROJECTION = 0,
+ MATRIX_MODE_MODEL = 1,
+ MATRIX_MODE_VIEW = 2,
+};
+
+enum GLParams
+{
+ GL_PARAM_MAX_TEXTURE_UNIT = 1,
+};
+
+class GfxDevice : public AEScripting::Portable<GfxDevice>
+{
+public:
+
+ GfxDevice();
+ ~GfxDevice();
+
+ static GfxDevice& Get();
+
+ int GetParam(GLParams param);
+
+ bool Init(const AEMath::Recti& viewport);
+ bool Inited();
+
+ void SetViewport(const AEMath::Recti viewport);
+
+ const AEMath::Recti& GetViewport();
+
+ void PushMatrix();
+ void PopMatrix();
+
+ void LoadIdentity();
+ void Rotate(float angle);
+ void Translate(float x, float y);
+ void Scale(float x, float y);
+ void Ortho(float l, float r, float b, float t, float n, float f);
+
+ uint GetMatrixDepth();
+ uint GetMatrixIndex();
+
+ void DrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ AEMath::Matrix44& GetMatrix(MatrixMode mode);
+ AEMath::Matrix44 GetMVPMatrix();
+
+ void SetDrawColor(float r, float g, float b, float a);
+ Color& GetDrawColor();
+
+ void SetActiveShader(Shader* = NULL);
+ Shader* GetActiveShader() const;
+
+ void WipeError();
+ bool HasError();
+ GLenum GetError();
+
+ GET_SET(MatrixMode, MatrixMode, state.matrixMode);
+ GET_SET(Canvas*, ActiveCanvas, state.canvas);
+
+private:
+
+ friend class Profiler;
+
+ struct
+ {
+ AEMath::Recti viewport; ///< ǰлHDC߱ڴСı߲ˢʱ䶯
+ MatrixStack matrix[3]; ///< model, view, projection
+ MatrixMode matrixMode; ///< ǰľ
+ Color drawColor; ///< Ƶɫ
+ Canvas* canvas; ///< ǰcanvas
+ Shader* shader; ///< ǰʹõshader
+ } state;
+
+#if ASURA_GL_PROFILE
+ struct
+ {
+ uint drawCall; ///< ͳdrawcall
+ uint canvasSwitch; ///< лtextureĴ
+ uint shaderSwitch; ///< лshaderĴ
+ } stats;
+#endif
+
+luaxport:
+
+ LUAX_DECL_SINGLETON(GfxDevice);
+
+ LUAX_DECL_ENUM(MatrixMode, 1);
+ LUAX_DECL_ENUM(GLParams, 1);
+
+ LUAX_DECL_METHOD(_SetMatrixMode);
+ LUAX_DECL_METHOD(_GetMatrixMode);
+ LUAX_DECL_METHOD(_PushMatrix);
+ LUAX_DECL_METHOD(_PopMatrix);
+ LUAX_DECL_METHOD(_LoadIdentity);
+ LUAX_DECL_METHOD(_Rotate);
+ LUAX_DECL_METHOD(_Translate);
+ LUAX_DECL_METHOD(_Scale);
+ LUAX_DECL_METHOD(_Ortho);
+ LUAX_DECL_METHOD(_GetMatrixDepth);
+ LUAX_DECL_METHOD(_GetMatrixIndex);
+ LUAX_DECL_METHOD(_UseShader);
+ LUAX_DECL_METHOD(_UnuseShader);
+
+};
+
+extern GfxDevice g_Device;
+
+
+#define GL_CALL(x) do { x; /*GLAssert(); */} while(0)
+
+
+
+
+namespace_end
+namespace_end
+
+#endif \ No newline at end of file