diff options
author | chai <chaifix@163.com> | 2019-06-06 00:11:18 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-06-06 00:11:18 +0800 |
commit | 88b882ed0b432c6aff2063213e2f793a36dd25f7 (patch) | |
tree | 5fe5d5334050e1a1146aa63e61e88aa2f5170727 /source/modules/asura-core/graphics/gfx_device.cpp | |
parent | f6c0498c9728a286c13980ed3b60763d02e1b3a0 (diff) |
*misc
Diffstat (limited to 'source/modules/asura-core/graphics/gfx_device.cpp')
-rw-r--r-- | source/modules/asura-core/graphics/gfx_device.cpp | 197 |
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 |