summaryrefslogtreecommitdiff
path: root/source/modules/asura-core/graphics/gfx_device.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-06-06 00:11:18 +0800
committerchai <chaifix@163.com>2019-06-06 00:11:18 +0800
commit88b882ed0b432c6aff2063213e2f793a36dd25f7 (patch)
tree5fe5d5334050e1a1146aa63e61e88aa2f5170727 /source/modules/asura-core/graphics/gfx_device.h
parentf6c0498c9728a286c13980ed3b60763d02e1b3a0 (diff)
*misc
Diffstat (limited to 'source/modules/asura-core/graphics/gfx_device.h')
-rw-r--r--source/modules/asura-core/graphics/gfx_device.h160
1 files changed, 160 insertions, 0 deletions
diff --git a/source/modules/asura-core/graphics/gfx_device.h b/source/modules/asura-core/graphics/gfx_device.h
new file mode 100644
index 0000000..5bb8c6a
--- /dev/null
+++ b/source/modules/asura-core/graphics/gfx_device.h
@@ -0,0 +1,160 @@
+#ifndef __ASURA_ENGINE_GFX_DEVICE_H__
+#define __ASURA_ENGINE_GFX_DEVICE_H__
+
+#include <stack>
+
+#include <glad/glad.h>
+
+#include <asura-utils/scripting/portable.hpp>
+#include <asura-utils/math/rect.hpp>
+#include <asura-utils/math/matrix44.h>
+#include <asura-utils/math/vector4.h>
+
+#include "color.h"
+#include "matrix_stack.h"
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+ class Profiler;
+ class Shader;
+
+ enum MatrixMode
+ {
+ MATRIX_MODE_PROJECTION = 0,
+ MATRIX_MODE_MODEL = 1,
+ MATRIX_MODE_VIEW = 2,
+ };
+
+ enum GLParams
+ {
+ GL_PARAM_MAX_TEXTURE_UNIT = 1,
+ };
+
+ ///
+ /// OpenGLģһЩopengl״̬׷١ڱ༭രڻ£һڶӦһhwnd
+ /// һhdcԼopengl contextʹwglMakeCurrent(hdc, glc)ָǰ̶߳
+ /// Ⱦhdcopenglglcglм¼ľһ̵߳һڵһOpenGL
+ /// ĵ״ֶ̬֧Ⱦ
+ ///
+ class GfxDevice : public AEScripting::Portable<GfxDevice>
+ {
+ public:
+
+ GfxDevice();
+ ~GfxDevice();
+
+ ///
+ /// óֵ
+ ///
+ int GetParam(GLParams param);
+
+ ///
+ /// ʼOpenGLIJڴOpenGL֮󡣴˺עOpenGLĵַ
+ ///
+ bool Init(const AEMath::Recti& viewport);
+ bool Inited();
+
+ void SetViewport(const AEMath::Recti viewport);
+ const AEMath::Recti& GetViewport();
+
+ void UseShader(Shader* shader);
+ void UnuseShader();
+ Shader* GetShader();
+
+ // Draw call.
+ void DrawArrays(GLenum mode, GLint first, GLsizei count);
+
+ ///
+ /// Matrix stackز
+ ///
+ void SetMatrixMode(MatrixMode mode);
+ MatrixMode GetMatrixMode();
+ 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);
+ AEMath::Matrix44& GetMatrix(MatrixMode mode);
+ AEMath::Matrix44 GetMVPMatrix();
+ uint GetMatrixDepth();
+ uint GetMatrixIndex();
+
+ void SetDrawColor(float r, float g, float b, float a);
+ Color& GetDrawColor();
+
+ ///
+ /// ʾ
+ ///
+ void WipeError();
+ bool HasError();
+ GLenum GetError();
+
+ ///
+ /// OpenGL3.0Ժû任ӿڡshaderȲﱣһЩOpenGL״̬ע
+ /// ƺȫ̵ģҲ˵Asuraֶ֧߳ȾOpenGLĵĴʹһ
+ /// İһHDC\ϣڴض̴߳ģOpenGLҲһ
+ /// ض̡߳ͬһ̵߳IJͬHDC\ڿԹͬһOpenGLġΪ
+ /// дtextuer\shaderhandle
+ ///
+ struct
+ {
+ Shader* shader; ///< ǰʹõshader
+ AEMath::Recti viewport; ///< ǰлHDC߱ڴСı߲ˢʱ䶯
+ MatrixStack matrix[3]; ///< model, view, projection
+ MatrixMode matrixMode; ///< ǰľ
+ Color drawColor; ///< Ƶɫ
+ } state;
+
+#if ASURA_GL_PROFILE
+ struct
+ {
+ uint drawCall; ///< ͳdrawcall
+ uint canvasSwitch; ///< лtextureĴ
+ uint shaderSwitch; ///< лshaderĴ
+ } stats;
+#endif
+
+ private:
+
+ friend class Profiler;
+
+ //----------------------------------------------------------------------------//
+
+ 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);
+
+ //----------------------------------------------------------------------------//
+
+ };
+
+ ///
+ /// OpenGL
+ ///
+ extern GfxDevice gfx;
+
+ }
+}
+
+#endif \ No newline at end of file