Centralize view and proj matrix to avoid recomputation.

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14928 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
vincentlj
2014-01-05 21:12:19 +00:00
parent 7778a71c0a
commit 869386c338
5 changed files with 27 additions and 58 deletions

View File

@@ -227,18 +227,15 @@ void RainEffectProvider::OnSetConstants(IMaterialRendererServices *srv, int)
{
const float screenw = (float)UserConfigParams::m_width;
const float time = irr_driver->getDevice()->getTimer()->getTime() / 90.0f;
const matrix4 viewm = srv->getVideoDriver()->getTransform(ETS_VIEW);
matrix4 invproj = srv->getVideoDriver()->getTransform(ETS_PROJECTION);
invproj.makeInverse();
const vector3df campos = irr_driver->getSceneManager()->getActiveCamera()->getPosition();
float screen[2] = { (float)UserConfigParams::m_width,
(float)UserConfigParams::m_height };
srv->setVertexShaderConstant("screenw", &screenw, 1);
srv->setVertexShaderConstant("time", &time, 1);
srv->setVertexShaderConstant("viewm", viewm.pointer(), 16);
srv->setVertexShaderConstant("viewm", irr_driver->getViewMatrix().pointer(), 16);
srv->setVertexShaderConstant("campos", &campos.X, 3);
srv->setPixelShaderConstant("invproj", invproj.pointer(), 16);
srv->setPixelShaderConstant("invproj", irr_driver->getInvProjMatrix().pointer(), 16);
srv->setPixelShaderConstant("screen", screen, 2);
s32 tex = 0;
srv->setPixelShaderConstant("tex", &tex, 1);
@@ -375,14 +372,13 @@ void LightBlendProvider::OnSetConstants(IMaterialRendererServices *srv, int)
void PointLightProvider::OnSetConstants(IMaterialRendererServices *srv, int)
{
int lightcount = m_color.size() / 4;
srv->setVertexShaderConstant("screen", m_screen, 2);
srv->setVertexShaderConstant("spec", &m_specular, 1);
srv->setVertexShaderConstant("invproj", m_invproj.pointer(), 16);
srv->setVertexShaderConstant("invproj", irr_driver->getInvProjMatrix().pointer(), 16);
srv->setVertexShaderConstant("energy[0]", m_energy.data(), m_energy.size());
srv->setVertexShaderConstant("col[0]", m_color.data(), m_color.size());
srv->setVertexShaderConstant("center[0]", m_pos.data(), m_pos.size());
srv->setVertexShaderConstant("viewm", m_view.pointer(), 16);
srv->setVertexShaderConstant("viewm", irr_driver->getViewMatrix().pointer(), 16);
if (!firstdone)
{
@@ -406,7 +402,7 @@ void SunLightProvider::OnSetConstants(IMaterialRendererServices *srv, int)
srv->setVertexShaderConstant("screen", m_screen, 2);
srv->setVertexShaderConstant("col", m_color, 3);
srv->setVertexShaderConstant("center", m_pos, 3);
srv->setVertexShaderConstant("invproj", m_invproj.pointer(), 16);
srv->setVertexShaderConstant("invproj", irr_driver->getInvProjMatrix().pointer(), 16);
srv->setVertexShaderConstant("hasclouds", &hasclouds, 1);
const float time = irr_driver->getDevice()->getTimer()->getTime() / 1000.0f;
@@ -529,8 +525,8 @@ void MLAANeigh3Provider::OnSetConstants(IMaterialRendererServices *srv, int)
void SSAOProvider::OnSetConstants(IMaterialRendererServices *srv, int)
{
srv->setPixelShaderConstant("invprojm", invprojm.pointer(), 16);
srv->setPixelShaderConstant("projm", projm.pointer(), 16);
srv->setPixelShaderConstant("invprojm", irr_driver->getInvProjMatrix().pointer(), 16);
srv->setPixelShaderConstant("projm", irr_driver->getProjMatrix().pointer(), 16);
srv->setPixelShaderConstant("samplePoints[0]", array, 64);
if (!firstdone)

View File

@@ -421,17 +421,7 @@ public:
m_energy = e;
}
void updateIPVMatrix()
{
const video::IVideoDriver * const drv = irr_driver->getVideoDriver();
m_view = drv->getTransform(video::ETS_VIEW);
m_invproj = drv->getTransform(video::ETS_PROJECTION);
m_invproj.makeInverse();
}
private:
core::matrix4 m_invproj, m_view;
std::vector<float> m_color;
std::vector<float> m_pos;
std::vector<float> m_energy;
@@ -476,22 +466,13 @@ public:
m_pos[2] = pos.Z;
}
void updateIPVMatrix()
{
// Update the IPV matrix, only once per frame since it's costly
const video::IVideoDriver * const drv = irr_driver->getVideoDriver();
m_invproj = drv->getTransform(video::ETS_PROJECTION);
m_invproj.makeInverse();
}
void setShadowMatrix(const core::matrix4 &mat)
{
m_shadowmat = mat;
}
private:
core::matrix4 m_invproj, m_shadowmat;
core::matrix4 m_shadowmat;
float m_color[3];
float m_pos[3];
float m_screen[2];
@@ -542,7 +523,6 @@ public:
class SSAOProvider: public CallBase
{
private:
core::matrix4 projm, invprojm;
float array[64];
public:
SSAOProvider() : CallBase() {
@@ -569,14 +549,6 @@ public:
}
virtual void OnSetConstants(video::IMaterialRendererServices *srv, int);
void updateIPVMatrix()
{
// Update the IPV matrix, only once per frame since it's costly
const video::IVideoDriver * const drv = irr_driver->getVideoDriver();
projm = drv->getTransform(video::ETS_PROJECTION);
projm.getInverse(invprojm);
}
};
//

View File

@@ -342,7 +342,6 @@ void ParticleSystemProxy::simulate()
return;
}
u32 now = time;
u32 timediff = time - LastEmitTime;
LastEmitTime = time;
@@ -398,8 +397,7 @@ void ParticleSystemProxy::draw()
glDepthMask(GL_FALSE);
glDisable(GL_CULL_FACE);
glEnable(GL_BLEND);
core::matrix4 projm = irr_driver->getVideoDriver()->getTransform(video::ETS_PROJECTION);
core::matrix4 viewm = irr_driver->getVideoDriver()->getTransform(video::ETS_VIEW);
if (m_alpha_additive)
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
else
@@ -415,16 +413,14 @@ void ParticleSystemProxy::draw()
(float)UserConfigParams::m_width,
(float)UserConfigParams::m_height
};
irr::core::matrix4 invproj = irr_driver->getVideoDriver()->getTransform(irr::video::ETS_PROJECTION);
invproj.makeInverse();
bindUniformToTextureUnit(uniform_texture, texture, 0);
bindUniformToTextureUnit(uniform_normal_and_depths, normal_and_depth, 1);
glUniformMatrix4fv(uniform_invproj, 1, GL_FALSE, invproj.pointer());
glUniformMatrix4fv(uniform_invproj, 1, GL_FALSE, irr_driver->getInvProjMatrix().pointer());
glUniform2f(uniform_screen, screen[0], screen[1]);
glUniformMatrix4fv(uniform_matrix, 1, GL_FALSE, projm.pointer());
glUniformMatrix4fv(uniform_viewmatrix, 1, GL_FALSE, viewm.pointer());
glUniformMatrix4fv(uniform_matrix, 1, GL_FALSE, irr_driver->getProjMatrix().pointer());
glUniformMatrix4fv(uniform_viewmatrix, 1, GL_FALSE, irr_driver->getViewMatrix().pointer());
glBindBuffer(GL_ARRAY_BUFFER, quad_vertex_buffer);
glVertexAttribPointer(attrib_quadcorner, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);

View File

@@ -99,6 +99,9 @@ private:
/** The main MRT setup. */
core::array<video::IRenderTarget> m_mrt;
/** Matrixes used in several places stored here to avoid recomputation. */
core::matrix4 m_ViewMatrix, m_ProjMatrix, m_InvProjMatrix, m_ProjViewMatrix, m_InvProjViewMatrix;
/** Flag to indicate if a resolution change is pending (which will be
* acted upon in the next update). None means no change, yes means
* change to new resolution and trigger confirmation dialog.
@@ -462,7 +465,15 @@ public:
void clearLights();
// ------------------------------------------------------------------------
scene::IMeshSceneNode *getSunInterposer() { return m_sun_interposer; }
// ------------------------------------------------------------------------
void setViewMatrix(core::matrix4 matrix) { m_ViewMatrix = matrix; }
const core::matrix4 &getViewMatrix() const { return m_ViewMatrix; }
void setProjMatrix(core::matrix4 matrix) { m_ProjMatrix = matrix; matrix.getInverse(m_InvProjMatrix); }
const core::matrix4 &getProjMatrix() const { return m_ProjMatrix; }
const core::matrix4 &getInvProjMatrix() const { return m_InvProjMatrix; }
void genProjViewMatrix() { m_ProjViewMatrix = m_ProjMatrix * m_ViewMatrix; m_InvProjViewMatrix = m_ProjViewMatrix; m_InvProjViewMatrix.makeInverse(); }
const core::matrix4 &getProjViewMatrix() const { return m_ProjViewMatrix; }
const core::matrix4 &getInvProjViewMatrix() const { return m_InvProjViewMatrix; }
#ifdef DEBUG
/** Removes debug meshes. */
void clearDebugMesh() { m_debug_meshes.clear(); }

View File

@@ -194,6 +194,9 @@ void IrrDriver::renderGLSL(float dt)
m_renderpass = scene::ESNRP_CAMERA | scene::ESNRP_SOLID;
m_scene_manager->drawAll(m_renderpass);
irr_driver->setProjMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_PROJECTION));
irr_driver->setViewMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_VIEW));
irr_driver->genProjViewMatrix();
ShadowImportanceProvider * const sicb = (ShadowImportanceProvider *)
irr_driver->getCallback(ES_SHADOW_IMPORTANCE);
@@ -684,18 +687,9 @@ void IrrDriver::renderLights(const core::aabbox3df& cambox,
video::SColor(0, 0, 0, 0));
m_scene_manager->drawAll(scene::ESNRP_CAMERA);
PointLightProvider * const pcb = (PointLightProvider *) irr_driver->
getCallback(ES_POINTLIGHT);
pcb->updateIPVMatrix();
SunLightProvider * const scb = (SunLightProvider *) irr_driver->
getCallback(ES_SUNLIGHT);
scb->updateIPVMatrix();
FogProvider * const fogcb = (FogProvider *) irr_driver->
getCallback(ES_FOG);
fogcb->updateIPVMatrix();
SSAOProvider * const ssaocb = (SSAOProvider *) irr_driver->
getCallback(ES_SSAO);
ssaocb->updateIPVMatrix();
const u32 lightcount = m_lights.size();