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:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
//
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user