Merge pull request #1928 from lukaspj/particle-manager-lmactivate-cleanup

Cleanup when deactivating light manager instead of reinitializing
This commit is contained in:
Areloch 2017-01-25 21:23:36 -06:00 committed by GitHub
commit ac19e0e84c

View file

@ -589,43 +589,51 @@ bool RenderParticleMgr::_initShader()
void RenderParticleMgr::_onLMActivate( const char*, bool activate ) void RenderParticleMgr::_onLMActivate( const char*, bool activate )
{ {
RenderPassManager *rpm = getRenderPass(); if ( activate )
if ( !rpm )
return;
// Hunt for the pre-pass manager/target
RenderPrePassMgr *prePassBin = NULL;
for( U32 i = 0; i < rpm->getManagerCount(); i++ )
{ {
RenderBinManager *bin = rpm->getManager(i); RenderPassManager *rpm = getRenderPass();
if( bin->getRenderInstType() == RenderPrePassMgr::RIT_PrePass ) if ( !rpm )
return;
// Hunt for the pre-pass manager/target
RenderPrePassMgr *prePassBin = NULL;
for( U32 i = 0; i < rpm->getManagerCount(); i++ )
{ {
prePassBin = (RenderPrePassMgr*)bin; RenderBinManager *bin = rpm->getManager(i);
break; if( bin->getRenderInstType() == RenderPrePassMgr::RIT_PrePass )
{
prePassBin = (RenderPrePassMgr*)bin;
break;
}
} }
}
// If we found the prepass bin, set this bin to render very shortly afterwards // If we found the prepass bin, set this bin to render very shortly afterwards
// and re-add this render-manager. If there is no pre-pass bin, or it doesn't // and re-add this render-manager. If there is no pre-pass bin, or it doesn't
// have a depth-texture, we can't render offscreen. // have a depth-texture, we can't render offscreen.
mOffscreenRenderEnabled = prePassBin && (prePassBin->getTargetChainLength() > 0); mOffscreenRenderEnabled = prePassBin && (prePassBin->getTargetChainLength() > 0);
if(mOffscreenRenderEnabled) if(mOffscreenRenderEnabled)
{ {
rpm->removeManager(this); rpm->removeManager(this);
setRenderOrder( prePassBin->getRenderOrder() + 0.011f ); setRenderOrder( prePassBin->getRenderOrder() + 0.011f );
rpm->addManager(this); rpm->addManager(this);
} }
// Find the targets we use // Find the targets we use
mPrepassTarget = NamedTexTarget::find( "prepass" ); mPrepassTarget = NamedTexTarget::find( "prepass" );
mEdgeTarget = NamedTexTarget::find( "edge" ); mEdgeTarget = NamedTexTarget::find( "edge" );
// Setup the shader // Setup the shader
if ( activate )
_initShader(); _initShader();
if ( mScreenQuadVertBuff.isNull() ) if ( mScreenQuadVertBuff.isNull() )
_initGFXResources(); _initGFXResources();
}
else
{
mStencilClearSB = NULL;
mScreenQuadPrimBuff = NULL;
mScreenQuadVertBuff = NULL;
}
} }
GFXStateBlockRef RenderParticleMgr::_getOffscreenStateBlock(ParticleRenderInst *ri) GFXStateBlockRef RenderParticleMgr::_getOffscreenStateBlock(ParticleRenderInst *ri)