engine/src/Render/RenderInterface.cpp

324 lines
7.4 KiB
C++
Raw Normal View History

2013-01-19 20:02:34 +00:00
#include "include/Render/RenderInterface.h"
#include "include/Engine.h"
namespace SE
{
TRendererInterface::TRendererInterface()
: ScreenWidth(0)
, ScreenHeight(0)
{
}
void TRendererInterface::TryEnableVertexAttribArrays()
{
EnableVertexAttribArray(CONST_STRING_POSITION_ATTRIB);
EnableVertexAttribArray(CONST_STRING_NORMAL_ATTRIB);
EnableVertexAttribArray(CONST_STRING_TEXCOORD_ATTRIB);
EnableVertexAttribArray(CONST_STRING_TANGENT_ATTRIB);
EnableVertexAttribArray(CONST_STRING_BINORMAL_ATTRIB);
}
void TRendererInterface::TryDisableVertexAttribArrays()
{
DisableVertexAttribArray(CONST_STRING_BINORMAL_ATTRIB);
DisableVertexAttribArray(CONST_STRING_TANGENT_ATTRIB);
DisableVertexAttribArray(CONST_STRING_TEXCOORD_ATTRIB);
DisableVertexAttribArray(CONST_STRING_NORMAL_ATTRIB);
DisableVertexAttribArray(CONST_STRING_POSITION_ATTRIB);
}
int TRendererInterface::GetScreenWidth()
{
return ScreenWidth;
}
int TRendererInterface::GetScreenHeight()
{
return ScreenHeight;
}
float TRendererInterface::GetMatrixWidth()
{
return MatrixWidth;
}
float TRendererInterface::GetMatrixHeight()
{
return MatrixHeight;
}
void TRendererInterface::SetScreenWidthHeight(int screenWidth, int screenHeight)
{
ScreenWidth = screenWidth;
ScreenHeight = screenHeight;
}
void TRendererInterface::PushMatrix()
{
if (ModelviewMatrixStack.size() == 0)
{
throw ErrorToLog("Modelview matrix stack underflow!!!!");
}
ModelviewMatrixStack.push(ModelviewMatrixStack.top());
if (ModelviewMatrixStack.size() > 64)
{
throw ErrorToLog("Modelview matrix stack overflow!!!!");
}
}
void TRendererInterface::LoadIdentity()
{
if (ModelviewMatrixStack.size() == 0)
{
throw ErrorToLog("Modelview matrix stack underflow!!!!");
}
ModelviewMatrixStack.pop();
ModelviewMatrixStack.push(IdentityMatrix4);
SetUniforms();
}
void TRendererInterface::TranslateMatrix(const vec3& p)
{
mat4 m = IdentityMatrix4;
m.m[12] = p.v[0];
m.m[13] = p.v[1];
m.m[14] = p.v[2];
m = MultMatrixMatrix(ModelviewMatrixStack.top(), m);
if (ModelviewMatrixStack.size() == 0)
{
throw ErrorToLog("Modelview matrix stack underflow!!!!");
}
ModelviewMatrixStack.pop();
ModelviewMatrixStack.push(m);
SetUniforms();
}
void TRendererInterface::ScaleMatrix(float scale)
{
mat4 m = IdentityMatrix4;
m.m[0] = scale;
m.m[5] = scale;
m.m[10] = scale;
m = MultMatrixMatrix(ModelviewMatrixStack.top(), m);
if (ModelviewMatrixStack.size() == 0)
{
throw ErrorToLog("Modelview matrix stack underflow!!!!");
}
ModelviewMatrixStack.pop();
ModelviewMatrixStack.push(m);
SetUniforms();
}
void TRendererInterface::ScaleMatrix(const vec3& scale)
{
mat4 m = IdentityMatrix4;
m.m[0] = scale.v[0];
m.m[5] = scale.v[1];
m.m[10] = scale.v[2];
m = MultMatrixMatrix(ModelviewMatrixStack.top(), m);
if (ModelviewMatrixStack.size() == 0)
{
throw ErrorToLog("Modelview matrix stack underflow!!!!");
}
ModelviewMatrixStack.pop();
ModelviewMatrixStack.push(m);
SetUniforms();
}
void TRendererInterface::RotateMatrix(const vec4& q)
{
mat3 m3(q);
mat4 m = IdentityMatrix4;
m.m[0] = m3.m[0];
m.m[1] = m3.m[1];
m.m[2] = m3.m[2];
m.m[4] = m3.m[3];
m.m[5] = m3.m[4];
m.m[6] = m3.m[5];
m.m[8] = m3.m[6];
m.m[9] = m3.m[7];
m.m[10] = m3.m[8];
m = MultMatrixMatrix(ModelviewMatrixStack.top(), m);
if (ModelviewMatrixStack.size() == 0)
{
throw ErrorToLog("Modelview matrix stack underflow!!!!");
}
ModelviewMatrixStack.pop();
ModelviewMatrixStack.push(m);
SetUniforms();
}
void TRendererInterface::PushSpecialMatrix(const mat4& m)
{
if (ModelviewMatrixStack.size() > 64)
{
throw ErrorToLog("Modelview matrix stack overflow!!!!");
}
ModelviewMatrixStack.push(m);
SetUniforms();
}
void TRendererInterface::PopMatrix()
{
if (ModelviewMatrixStack.size() == 0)
{
throw ErrorToLog("Modelview matrix stack underflow!!!!");
}
ModelviewMatrixStack.pop();
SetUniforms();
}
void TRendererInterface::PushProjectionMatrix(float width, float height)
{
mat4 m = MakeOrthoMatrix(width, height);
ProjectionMatrixStack.push(m);
SetUniforms();
if (ProjectionMatrixStack.size() > 64)
{
throw ErrorToLog("Projection matrix stack overflow!!!!");
}
}
void TRendererInterface::PopProjectionMatrix()
{
if (ProjectionMatrixStack.size() == 0)
{
throw ErrorToLog("Projection matrix stack underflow!!!!");
}
ProjectionMatrixStack.pop();
SetUniforms();
}
void TRendererInterface::SetProjectionMatrix(float width, float height)
{
mat4 m = MakeOrthoMatrix(width, height);
if (ProjectionMatrixStack.size() == 0)
{
throw ErrorToLog("Projection matrix stack underflow!!!!");
}
ProjectionMatrixStack.pop();
ProjectionMatrixStack.push(m);
SetUniforms();
}
void TRendererInterface::SetFrameViewport(const std::string& frameName)
{
ivec2 frameWidthHeight = ResourceManager->FrameManager.GetFrameWidthHeight(frameName);
glViewport(0, 0, frameWidthHeight.v[0], frameWidthHeight.v[1]);
}
void TRendererInterface::SetFullScreenViewport()
{
glViewport(0, 0, ScreenWidth, ScreenHeight);
}
void TRendererInterface::PushShader(const std::string& shaderName)
{
ResourceManager->ShaderManager.PushShader(shaderName);
SetUniforms();
TryEnableVertexAttribArrays();
}
void TRendererInterface::PopShader()
{
ResourceManager->ShaderManager.PopShader();
SetUniforms();
TryEnableVertexAttribArrays();
}
void TRendererInterface::DrawRect(const vec2& p1, const vec2& p2)
{
T2DQuad quad;
quad.VertexCoord[0] = vec3(p1.v[0], p1.v[1], 0.0f);
quad.VertexCoord[1] = vec3(p1.v[0], p2.v[1], 0.0f);
quad.VertexCoord[2] = vec3(p2.v[0], p1.v[1], 0.0f);
quad.VertexCoord[3] = vec3(p2.v[0], p2.v[1], 0.0f);
quad.TextureCoord[0] = vec2(0.01f, 0.01f);
quad.TextureCoord[1] = vec2(0.01f, 0.99f);
quad.TextureCoord[2] = vec2(0.99f, 0.01f);
quad.TextureCoord[3] = vec2(0.99f, 0.99f);
DrawQuad(quad);
}
void TRendererInterface::DrawRect(const vec2& p1, const vec2& p2, const vec2& t1, const vec2& t2)
{
T2DQuad quad;
quad.VertexCoord[0] = vec3(p1.v[0], p1.v[1], 0.0f);
quad.VertexCoord[1] = vec3(p1.v[0], p2.v[1], 0.0f);
quad.VertexCoord[2] = vec3(p2.v[0], p1.v[1], 0.0f);
quad.VertexCoord[3] = vec3(p2.v[0], p2.v[1], 0.0f);
quad.TextureCoord[0] = vec2(t1.v[0], t1.v[1]);
quad.TextureCoord[1] = vec2(t1.v[0], t2.v[1]);
quad.TextureCoord[2] = vec2(t2.v[0], t1.v[1]);
quad.TextureCoord[3] = vec2(t2.v[0], t2.v[1]);
DrawQuad(quad);
}
void TRendererInterface::DrawFrameFullScreen(const std::string& frameName)
{
DrawFramePartScreen(frameName, vec2(0, 0), vec2(1, 1));
}
void TRendererInterface::DrawFramePartScreen(const std::string& frameName, vec2 posFrom, vec2 posTo)
{
cardinal texID = ResourceManager->FrameManager.GetFrameTexture(frameName.c_str());
if (texID != 0)
{
PushProjectionMatrix(1,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
LoadIdentity();
glBindTexture(GL_TEXTURE_2D,texID);
DrawRect(posFrom, posTo, posFrom, posTo);
PopProjectionMatrix();
}
}
} //namespace SE