summaryrefslogtreecommitdiff
path: root/source/modules/asura-core/graphics/gfx_device.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/modules/asura-core/graphics/gfx_device.cpp')
-rw-r--r--source/modules/asura-core/graphics/gfx_device.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/source/modules/asura-core/graphics/gfx_device.cpp b/source/modules/asura-core/graphics/gfx_device.cpp
new file mode 100644
index 0000000..edfa784
--- /dev/null
+++ b/source/modules/asura-core/graphics/gfx_device.cpp
@@ -0,0 +1,197 @@
+#include <asura-utils/type.h>
+
+#include "../core_config.h"
+
+#include "gfx_device.h"
+#include "shader.h"
+#include "matrix_stack.h"
+#include "color.h"
+
+using namespace AEMath;
+
+namespace AsuraEngine
+{
+ namespace Graphics
+ {
+
+#if ASURA_DEBUG
+ static bool _instantiated = false;
+#endif
+
+ GfxDevice gfx;
+
+ GfxDevice::GfxDevice()
+ {
+#if ASURA_DEBUG
+ ASSERT(!_instantiated);
+ _instantiated = true;
+#endif
+ }
+
+ GfxDevice::~GfxDevice()
+ {
+ }
+
+ static bool inited = false;
+
+ bool GfxDevice::Init(const AEMath::Recti& view)
+ {
+ bool loaded = false;
+#if ASURA_OPENGL_LOADER & ASURA_OPENGL_GLAD
+ if (!loaded)
+ loaded = gladLoadGL();
+#endif
+ if (!loaded)
+ return false;
+ SetViewport(view);
+
+ inited = true;
+ return true;
+ }
+
+ bool GfxDevice::Inited()
+ {
+ return inited;
+ }
+
+ void GfxDevice::WipeError()
+ {
+ while (glGetError() != GL_NO_ERROR);
+ }
+
+ bool GfxDevice::HasError()
+ {
+ return glGetError() != GL_NO_ERROR;
+ }
+
+ GLenum GfxDevice::GetError()
+ {
+ return glGetError();
+ }
+
+ void GfxDevice::SetDrawColor(float r, float g, float b, float a)
+ {
+ state.drawColor.Set(r, g, b, a);
+ }
+
+ Color& GfxDevice::GetDrawColor()
+ {
+ return state.drawColor;
+ }
+
+ void GfxDevice::SetViewport(const Recti v)
+ {
+ state.viewport = v;
+ glViewport(v.x, v.y, v.w, v.h);
+ }
+
+ const Recti& GfxDevice::GetViewport()
+ {
+ return state.viewport;
+ }
+
+ void GfxDevice::UseShader(Shader* shader)
+ {
+ if (state.shader != shader)
+ {
+ glUseProgram(shader->GetGLProgram());
+ state.shader = shader;
+#if ASURA_GL_PROFILE
+ ++stats.shaderSwitch;
+#endif
+ }
+ shader->OnUse();
+ }
+
+ void GfxDevice::UnuseShader()
+ {
+ state.shader->OnUnuse();
+ state.shader = nullptr;
+ }
+
+ Shader* GfxDevice::GetShader()
+ {
+ return state.shader;
+ }
+
+ void GfxDevice::DrawArrays(GLenum mode, GLint first, GLsizei count)
+ {
+ glDrawArrays(mode, first, count);
+#if ASURA_GL_PROFILE
+ ++stats.drawCall;
+#endif
+ }
+
+ //------------------------------------------------------------------------------//
+
+ void GfxDevice::SetMatrixMode(MatrixMode mode)
+ {
+ state.matrixMode = mode;
+ }
+
+ MatrixMode GfxDevice::GetMatrixMode()
+ {
+ return state.matrixMode;
+ }
+
+ void GfxDevice::PushMatrix()
+ {
+ state.matrix[state.matrixMode].Push();
+ }
+
+ void GfxDevice::PopMatrix()
+ {
+ state.matrix[state.matrixMode].Pop();
+ }
+
+ void GfxDevice::LoadIdentity()
+ {
+ state.matrix[state.matrixMode].LoadIdentity();
+ }
+
+ void GfxDevice::Rotate(float angle)
+ {
+ state.matrix[state.matrixMode].Rotate(angle);
+ }
+
+ void GfxDevice::Translate(float x, float y)
+ {
+ state.matrix[state.matrixMode].Translate(x, y);
+ }
+
+ void GfxDevice::Scale(float x, float y)
+ {
+ state.matrix[state.matrixMode].Scale(x, y);
+ }
+
+ void GfxDevice::Ortho(float l, float r, float b, float t, float n, float f)
+ {
+ state.matrix[state.matrixMode].Ortho(l, r, b, t, n, f);
+ }
+
+ AEMath::Matrix44& GfxDevice::GetMatrix(MatrixMode mode)
+ {
+ return state.matrix[mode].GetTop();
+ }
+
+ AEMath::Matrix44 GfxDevice::GetMVPMatrix()
+ {
+ return state.matrix[MATRIX_MODE_MODEL].GetTop()
+ * state.matrix[MATRIX_MODE_MODEL].GetTop()
+ * state.matrix[MATRIX_MODE_MODEL].GetTop();
+ }
+
+ uint GfxDevice::GetMatrixDepth()
+ {
+ return state.matrix[state.matrixMode].GetCapacity();
+ }
+
+ uint GfxDevice::GetMatrixIndex()
+ {
+ return state.matrix[state.matrixMode].GetTopIndex();
+ }
+
+ //------------------------------------------------------------------------------//
+
+ }
+} \ No newline at end of file