diff options
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 | 
