Fix multiple crashes when new pipeline is turned off

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14598 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria
2013-12-01 19:42:14 +00:00
parent f383440d7f
commit eaef91fc4b
3 changed files with 36 additions and 11 deletions

View File

@@ -348,7 +348,10 @@ public:
// ------------------------------------------------------------------------
inline video::E_MATERIAL_TYPE getShader(const ShaderType num) {return m_shaders->getShader(num);}
// ------------------------------------------------------------------------
inline video::IShaderConstantSetCallBack* getCallback(const ShaderType num) {return m_shaders->m_callbacks[num];}
inline video::IShaderConstantSetCallBack* getCallback(const ShaderType num)
{
return (m_shaders == NULL ? NULL : m_shaders->m_callbacks[num]);
}
// ------------------------------------------------------------------------
inline video::ITexture* getRTT(TypeRTT which) {return m_rtts->getRTT(which);}
// ------------------------------------------------------------------------

View File

@@ -1013,9 +1013,13 @@ void Material::adjustForFog(scene::ISceneNode* parent, video::SMaterial *m,
/** Callback from LOD nodes to create some effects */
void Material::onMadeVisible(scene::IMeshBuffer* who)
{
if (!irr_driver->isGLSL()) return;
BubbleEffectProvider * bubble = (BubbleEffectProvider *)
irr_driver->getCallback(ES_BUBBLES);
bubble->onMadeVisible(who);
if (bubble != NULL)
bubble->onMadeVisible(who);
}
//-----------------------------------------------------------------------------
@@ -1023,18 +1027,24 @@ void Material::onMadeVisible(scene::IMeshBuffer* who)
/** Callback from LOD nodes to create some effects */
void Material::onHidden(scene::IMeshBuffer* who)
{
if (!irr_driver->isGLSL()) return;
BubbleEffectProvider * bubble = (BubbleEffectProvider *)
irr_driver->getCallback(ES_BUBBLES);
bubble->onHidden(who);
if (bubble != NULL)
bubble->onHidden(who);
}
//-----------------------------------------------------------------------------
void Material::isInitiallyHidden(scene::IMeshBuffer* who)
{
if (!irr_driver->isGLSL()) return;
BubbleEffectProvider * bubble = (BubbleEffectProvider *)
irr_driver->getCallback(ES_BUBBLES);
bubble->isInitiallyHidden(who);
if (bubble != NULL)
bubble->isInitiallyHidden(who);
}
//-----------------------------------------------------------------------------

View File

@@ -161,11 +161,14 @@ void PostProcessing::begin()
/** Set the boost amount according to the speed of the camera */
void PostProcessing::giveBoost(unsigned int camera_index)
{
m_boost_time[camera_index] = 0.75f;
if (irr_driver->isGLSL())
{
m_boost_time[camera_index] = 0.75f;
MotionBlurProvider * const cb = (MotionBlurProvider *) irr_driver->
getCallback(ES_MOTIONBLUR);
cb->setBoostTime(camera_index, m_boost_time[camera_index]);
MotionBlurProvider * const cb = (MotionBlurProvider *)irr_driver->
getCallback(ES_MOTIONBLUR);
cb->setBoostTime(camera_index, m_boost_time[camera_index]);
}
} // giveBoost
// ----------------------------------------------------------------------------
@@ -174,10 +177,15 @@ void PostProcessing::giveBoost(unsigned int camera_index)
*/
void PostProcessing::update(float dt)
{
MotionBlurProvider * const cb = (MotionBlurProvider *) irr_driver->
getCallback(ES_MOTIONBLUR);
if (!irr_driver->isGLSL())
return;
for(unsigned int i=0; i<m_boost_time.size(); i++)
MotionBlurProvider* const cb =
(MotionBlurProvider*) irr_driver->getCallback(ES_MOTIONBLUR);
if (cb == NULL) return;
for (unsigned int i=0; i<m_boost_time.size(); i++)
{
if (m_boost_time[i] > 0.0f)
{
@@ -193,6 +201,8 @@ void PostProcessing::update(float dt)
/** Render the post-processed scene, solids only, color to color, no stencil */
void PostProcessing::renderSolid(const u32 cam)
{
if (irr_driver->isGLSL()) return;
// Early out: do nothing if at all possible
if (UserConfigParams::m_ssao < 1 && !World::getWorld()->getTrack()->isFogEnabled())
return;
@@ -316,6 +326,8 @@ void PostProcessing::renderSolid(const u32 cam)
/** Render the post-processed scene */
void PostProcessing::render()
{
if (!irr_driver->isGLSL()) return;
IVideoDriver * const drv = irr_driver->getVideoDriver();
drv->setTransform(ETS_WORLD, core::IdentityMatrix);
drv->setTransform(ETS_VIEW, core::IdentityMatrix);