Removes current implement of shadow caching

Also removes EC stuff as it's not ready for prime-time yet
This commit is contained in:
Areloch 2019-12-13 01:14:03 -06:00
parent f007700646
commit 66cc6fb9d1
141 changed files with 67 additions and 19491 deletions

View file

@ -85,27 +85,21 @@ LightShadowMap::LightShadowMap( LightInfo *light )
: mWorldToLightProj( true ),
mTexSize( 0 ),
mLight( light ),
mLastUpdate( 0 ),
mLastShader( NULL ),
mIsViewDependent( false ),
mLastCull( 0 ),
mLastScreenSize( 0.0f ),
mLastPriority( 0.0f ),
mIsDynamic( false )
mLastPriority( 0.0f )
{
GFXTextureManager::addEventDelegate( this, &LightShadowMap::_onTextureEvent );
mTarget = GFX->allocRenderToTextureTarget();
smShadowMaps.push_back( this );
mStaticRefreshTimer = PlatformTimer::create();
mDynamicRefreshTimer = PlatformTimer::create();
}
LightShadowMap::~LightShadowMap()
{
mTarget = NULL;
SAFE_DELETE(mStaticRefreshTimer);
SAFE_DELETE(mDynamicRefreshTimer);
releaseTextures();
@ -246,7 +240,6 @@ void LightShadowMap::releaseTextures()
{
mShadowMapTex = NULL;
mDebugTarget.setTexture( NULL );
mLastUpdate = 0;
smUsedShadowMaps.remove( this );
}
@ -268,7 +261,7 @@ GFXTextureObject* LightShadowMap::_getDepthTarget( U32 width, U32 height )
bool LightShadowMap::setTextureStage( U32 currTexFlag, LightingShaderConstants* lsc )
{
if ( currTexFlag == Material::DynamicLight && !isDynamic() )
if ( currTexFlag == Material::DynamicLight )
{
S32 reg = lsc->mShadowMapSC->getSamplerRegister();
@ -276,16 +269,7 @@ bool LightShadowMap::setTextureStage( U32 currTexFlag, LightingShaderConstants*
GFX->setTexture( reg, mShadowMapTex);
return true;
} else if ( currTexFlag == Material::DynamicShadowMap && isDynamic() )
{
S32 reg = lsc->mDynamicShadowMapSC->getSamplerRegister();
if ( reg != -1 )
GFX->setTexture( reg, mShadowMapTex);
return true;
}
else if ( currTexFlag == Material::DynamicLightMask )
} else if ( currTexFlag == Material::DynamicLightMask )
{
S32 reg = lsc->mCookieMapSC->getSamplerRegister();
if ( reg != -1 )
@ -304,35 +288,16 @@ bool LightShadowMap::setTextureStage( U32 currTexFlag, LightingShaderConstants*
return false;
}
void LightShadowMap::render(RenderPassManager* renderPass,
const SceneRenderState *diffuseState,
bool _dynamic, bool _forceUpdate)
void LightShadowMap::render(RenderPassManager* renderPass, const SceneRenderState *diffuseState)
{
if (!_forceUpdate)
{
// control how often shadow maps are refreshed
if (!_dynamic && (mStaticRefreshTimer->getElapsedMs() < getLightInfo()->getStaticRefreshFreq()))
return;
}
mStaticRefreshTimer->reset();
if (_dynamic && (mDynamicRefreshTimer->getElapsedMs() < getLightInfo()->getDynamicRefreshFreq()))
return;
mDynamicRefreshTimer->reset();
mDebugTarget.setTexture( NULL );
_render( renderPass, diffuseState );
mDebugTarget.setTexture( mShadowMapTex );
// Add it to the used list unless we're been updated.
if ( !mLastUpdate )
{
AssertFatal( !smUsedShadowMaps.contains( this ), "LightShadowMap::render - Used shadow map inserted twice!" );
//AssertFatal( !smUsedShadowMaps.contains( this ), "LightShadowMap::render - Used shadow map inserted twice!" );
if(!smUsedShadowMaps.contains(this))
smUsedShadowMaps.push_back( this );
}
mLastUpdate = Sim::getCurrentTime();
}
BaseMatInstance* LightShadowMap::getShadowMaterial( BaseMatInstance *inMat ) const
@ -395,8 +360,6 @@ void LightShadowMap::updatePriority( const SceneRenderState *state, U32 currTime
return;
}
U32 timeSinceLastUpdate = currTimeMs - mLastUpdate;
const Point3F &camPt = state->getCameraPosition();
F32 range = mLight->getRange().x;
F32 dist;
@ -422,7 +385,6 @@ void LightShadowMap::updatePriority( const SceneRenderState *state, U32 currTime
// Update the priority.
mLastPriority = mPow( mLastScreenSize * 50.0f, 2.0f );
mLastPriority += timeSinceLastUpdate;
mLastPriority *= mLight->getPriority();
}
@ -466,7 +428,6 @@ LightingShaderConstants::LightingShaderConstants()
mVectorLightColorSC(NULL),
mVectorLightBrightnessSC(NULL),
mShadowMapSC(NULL),
mDynamicShadowMapSC(NULL),
mShadowMapSizeSC(NULL),
mCookieMapSC(NULL),
mRandomDirsConst(NULL),
@ -484,15 +445,7 @@ LightingShaderConstants::LightingShaderConstants()
mScaleYSC(NULL),
mOffsetXSC(NULL),
mOffsetYSC(NULL),
mFarPlaneScalePSSM(NULL),
mDynamicWorldToLightProjSC(NULL),
mDynamicViewToLightProjSC(NULL),
mDynamicScaleXSC(NULL),
mDynamicScaleYSC(NULL),
mDynamicOffsetXSC(NULL),
mDynamicOffsetYSC(NULL),
mDynamicFarPlaneScalePSSM(NULL)
mFarPlaneScalePSSM(NULL)
{
}
@ -534,7 +487,6 @@ void LightingShaderConstants::init(GFXShader* shader)
mVectorLightBrightnessSC = shader->getShaderConstHandle(ShaderGenVars::vectorLightBrightness);
mShadowMapSC = shader->getShaderConstHandle("$shadowMap");
mDynamicShadowMapSC = shader->getShaderConstHandle("$dynamicShadowMap");
mShadowMapSizeSC = shader->getShaderConstHandle("$shadowMapSize");
mCookieMapSC = shader->getShaderConstHandle("$cookieMap");
@ -556,14 +508,6 @@ void LightingShaderConstants::init(GFXShader* shader)
mOffsetYSC = shader->getShaderConstHandle("$offsetY");
mFarPlaneScalePSSM = shader->getShaderConstHandle("$farPlaneScalePSSM");
mDynamicWorldToLightProjSC = shader->getShaderConstHandle("$dynamicWorldToLightProj");
mDynamicViewToLightProjSC = shader->getShaderConstHandle("$dynamicViewToLightProj");
mDynamicScaleXSC = shader->getShaderConstHandle("$dynamicScaleX");
mDynamicScaleYSC = shader->getShaderConstHandle("$dynamicScaleY");
mDynamicOffsetXSC = shader->getShaderConstHandle("$dynamicOffsetX");
mDynamicOffsetYSC = shader->getShaderConstHandle("$dynamicOffsetY");
mDynamicFarPlaneScalePSSM = shader->getShaderConstHandle("$dynamicFarPlaneScalePSSM");
mInit = true;
}
@ -585,9 +529,7 @@ LightInfoExType ShadowMapParams::Type( "" );
ShadowMapParams::ShadowMapParams( LightInfo *light )
: mShadowMap( NULL ),
mLight( light ),
mDynamicShadowMap ( NULL ),
isDynamic ( true )
mLight( light )
{
attenuationRatio.set( 0.0f, 1.0f, 1.0f );
shadowType = ShadowType_Spot;
@ -608,7 +550,6 @@ ShadowMapParams::~ShadowMapParams()
{
SAFE_DELETE( mQuery );
SAFE_DELETE( mShadowMap );
SAFE_DELETE( mDynamicShadowMap );
}
void ShadowMapParams::_validate()
@ -665,12 +606,9 @@ void ShadowMapParams::_validate()
texSize = mClamp( texSize, 32, maxTexSize );
}
LightShadowMap* ShadowMapParams::getOrCreateShadowMap(bool _isDynamic)
LightShadowMap* ShadowMapParams::getOrCreateShadowMap()
{
if (_isDynamic && mDynamicShadowMap)
return mDynamicShadowMap;
if (!_isDynamic && mShadowMap)
if (mShadowMap)
return mShadowMap;
if ( !mLight->getCastShadows() )
@ -702,18 +640,8 @@ LightShadowMap* ShadowMapParams::getOrCreateShadowMap(bool _isDynamic)
break;
}
if ( _isDynamic )
{
newShadowMap->setDynamic( true );
mDynamicShadowMap = newShadowMap;
return mDynamicShadowMap;
}
else
{
newShadowMap->setDynamic(false);
mShadowMap = newShadowMap;
return mShadowMap;
}
mShadowMap = newShadowMap;
return mShadowMap;
}
GFXTextureObject* ShadowMapParams::getCookieTex()
@ -788,7 +716,6 @@ void ShadowMapParams::unpackUpdate( BitStream *stream )
// map so it can be reallocated on the next render.
shadowType = newType;
SAFE_DELETE( mShadowMap );
SAFE_DELETE( mDynamicShadowMap );
}
mathRead( *stream, &attenuationRatio );

View file

@ -96,7 +96,6 @@ struct LightingShaderConstants
GFXShaderConstHandle* mVectorLightBrightnessSC;
GFXShaderConstHandle* mShadowMapSC;
GFXShaderConstHandle* mDynamicShadowMapSC;
GFXShaderConstHandle* mShadowMapSizeSC;
GFXShaderConstHandle* mCookieMapSC;
@ -123,15 +122,6 @@ struct LightingShaderConstants
GFXShaderConstHandle* mOffsetYSC;
GFXShaderConstHandle* mFarPlaneScalePSSM;
// Dynamic Specific:
GFXShaderConstHandle* mDynamicWorldToLightProjSC;
GFXShaderConstHandle* mDynamicViewToLightProjSC;
GFXShaderConstHandle* mDynamicScaleXSC;
GFXShaderConstHandle* mDynamicScaleYSC;
GFXShaderConstHandle* mDynamicOffsetXSC;
GFXShaderConstHandle* mDynamicOffsetYSC;
GFXShaderConstHandle* mDynamicFarPlaneScalePSSM;
LightingShaderConstants();
~LightingShaderConstants();
@ -165,10 +155,7 @@ public:
virtual ~LightShadowMap();
void render( RenderPassManager* renderPass,
const SceneRenderState *diffuseState,
bool _dynamic, bool _forceUpdate);
U32 getLastUpdate() const { return mLastUpdate; }
const SceneRenderState *diffuseState);
//U32 getLastVisible() const { return mLastVisible; }
@ -248,11 +235,6 @@ protected:
/// be skipped if visible and within active range.
bool mIsViewDependent;
/// The time this shadow was last updated.
U32 mLastUpdate;
PlatformTimer *mStaticRefreshTimer;
PlatformTimer *mDynamicRefreshTimer;
/// The time this shadow was last culled and prioritized.
U32 mLastCull;
@ -280,13 +262,6 @@ protected:
/// The callback used to get texture events.
/// @see GFXTextureManager::addEventDelegate
void _onTextureEvent( GFXTexCallbackCode code );
bool mIsDynamic;
public:
bool isDynamic() { return mIsDynamic; }
void setDynamic(bool value) { mIsDynamic = value; }
};
GFX_DeclareTextureProfile( ShadowMapProfile );
@ -309,9 +284,9 @@ public:
virtual void packUpdate( BitStream *stream ) const;
virtual void unpackUpdate( BitStream *stream );
LightShadowMap* getShadowMap(bool _isDynamic = false) const { return _isDynamic ? mDynamicShadowMap : mShadowMap; }
LightShadowMap* getShadowMap() const { return mShadowMap; }
LightShadowMap* getOrCreateShadowMap(bool _isDynamic = false);
LightShadowMap* getOrCreateShadowMap();
bool hasCookieTex() const { return cookie.isNotEmpty(); }
@ -330,7 +305,6 @@ protected:
///
LightShadowMap *mShadowMap;
LightShadowMap *mDynamicShadowMap;
GFXOcclusionQuery* mQuery;
LightInfo *mLight;
@ -393,7 +367,6 @@ public:
bool lastSplitTerrainOnly;
/// @}
bool isDynamic;
};
#endif // _LIGHTSHADOWMAP_H_

View file

@ -445,20 +445,11 @@ void PSSMLightShadowMap::setShaderParameters(GFXShaderConstBuffer* params, Light
}
// These values change based on static/dynamic.
if ( mIsDynamic )
{
params->setSafe(lsc->mDynamicScaleXSC, sx);
params->setSafe(lsc->mDynamicScaleYSC, sy);
params->setSafe(lsc->mDynamicOffsetXSC, ox);
params->setSafe(lsc->mDynamicOffsetYSC, oy);
params->setSafe( lsc->mDynamicFarPlaneScalePSSM, mFarPlaneScalePSSM);
} else {
params->setSafe(lsc->mScaleXSC, sx);
params->setSafe(lsc->mScaleYSC, sy);
params->setSafe(lsc->mOffsetXSC, ox);
params->setSafe(lsc->mOffsetYSC, oy);
params->setSafe( lsc->mFarPlaneScalePSSM, mFarPlaneScalePSSM);
}
params->setSafe(lsc->mScaleXSC, sx);
params->setSafe(lsc->mScaleYSC, sy);
params->setSafe(lsc->mOffsetXSC, ox);
params->setSafe(lsc->mOffsetYSC, oy);
params->setSafe(lsc->mFarPlaneScalePSSM, mFarPlaneScalePSSM);
params->setSafe(lsc->mAtlasXOffsetSC, aXOff);
params->setSafe(lsc->mAtlasYOffsetSC, aYOff);

View file

@ -99,7 +99,6 @@ Signal<void(void)> ShadowMapManager::smShadowDeactivateSignal;
ShadowMapManager::ShadowMapManager()
: mShadowMapPass(NULL),
mCurrentShadowMap(NULL),
mCurrentDynamicShadowMap(NULL),
mIsActive(false)
{
}
@ -114,12 +113,10 @@ void ShadowMapManager::setLightShadowMapForLight( LightInfo *light )
if ( params )
{
mCurrentShadowMap = params->getShadowMap();
mCurrentDynamicShadowMap = params->getShadowMap(true);
}
else
{
mCurrentShadowMap = NULL;
mCurrentDynamicShadowMap = NULL;
}
}

View file

@ -60,14 +60,12 @@ public:
/// Sets the current shadowmap (used in setLightInfo/setTextureStage calls)
void setLightShadowMap( LightShadowMap *lm ) { mCurrentShadowMap = lm; }
void setLightDynamicShadowMap( LightShadowMap *lm ) { mCurrentDynamicShadowMap = lm; }
/// Looks up the shadow map for the light then sets it.
void setLightShadowMapForLight( LightInfo *light );
/// Return the current shadow map
LightShadowMap* getCurrentShadowMap() const { return mCurrentShadowMap; }
LightShadowMap* getCurrentDynamicShadowMap() const { return mCurrentDynamicShadowMap; }
ShadowMapPass* getShadowMapPass() const { return mShadowMapPass; }
@ -90,7 +88,6 @@ protected:
ShadowMapPass *mShadowMapPass;
LightShadowMap *mCurrentShadowMap;
LightShadowMap *mCurrentDynamicShadowMap;
///
GFXTexHandle mTapRotationTex;
@ -108,4 +105,4 @@ public:
GFX_DeclareTextureProfile( ShadowMapTexProfile );
#endif // _SHADOWMAPMANAGER_H_
#endif // _SHADOWMAPMANAGER_H_

View file

@ -79,15 +79,6 @@ ShadowMapPass::ShadowMapPass(LightManager* lightManager, ShadowMapManager* shado
mShadowRPM->addManager( new RenderTerrainMgr( 0.5f, 0.5f ) );
mShadowRPM->addManager( new RenderImposterMgr( 0.6f, 0.6f ) );
// Dynamic
mDynamicShadowRPM = new DynamicShadowRenderPassManager();
mDynamicShadowRPM->assignName( "DynamicShadowRenderPassManager" );
mDynamicShadowRPM->registerObject();
Sim::getRootGroup()->addObject( mDynamicShadowRPM );
mDynamicShadowRPM->addManager( new RenderMeshMgr(RenderPassManager::RIT_Mesh, 0.3f, 0.3f) );
mDynamicShadowRPM->addManager( new RenderTerrainMgr( 0.5f, 0.5f ) );
mDynamicShadowRPM->addManager( new RenderImposterMgr( 0.6f, 0.6f ) );
mActiveLights = 0;
mPrevCamPos = Point3F::Zero;
mPrevCamRot = Point3F::Zero;
@ -132,9 +123,6 @@ ShadowMapPass::~ShadowMapPass()
if ( mShadowRPM )
mShadowRPM->deleteObject();
if ( mDynamicShadowRPM )
mDynamicShadowRPM->deleteObject();
}
void ShadowMapPass::render( SceneManager *sceneManager,
@ -165,7 +153,7 @@ void ShadowMapPass::render( SceneManager *sceneManager,
// First do a loop thru the lights setting up the shadow
// info array for this pass.
Vector<LightShadowMap*> shadowMaps;
shadowMaps.reserve( mActiveLights * 2 );
shadowMaps.reserve( mActiveLights );
for ( U32 i = 0; i < mActiveLights; i++ )
{
ShadowMapParams *params = mLights[i]->getExtended<ShadowMapParams>();
@ -176,7 +164,6 @@ void ShadowMapPass::render( SceneManager *sceneManager,
// --- Static Shadow Map ---
LightShadowMap *lsm = params->getOrCreateShadowMap();
LightShadowMap *dlsm = params->getOrCreateShadowMap(true);
// First check the visiblity query... if it wasn't
// visible skip it.
@ -191,17 +178,6 @@ void ShadowMapPass::render( SceneManager *sceneManager,
lsm->updatePriority(diffuseState, currTime);
shadowMaps.push_back(lsm);
// --- Dynamic Shadow Map ---
// Any shadow that is visible is counted as being
// active regardless if we update it or not.
++smActiveShadowMaps;
// Do a priority update for this shadow.
dlsm->updatePriority(diffuseState, currTime);
shadowMaps.push_back( dlsm );
}
// Now sort the shadow info by priority.
@ -238,32 +214,19 @@ void ShadowMapPass::render( SceneManager *sceneManager,
mPrevCamFov = control->getCameraFov();
// 2 Shadow Maps per Light. This may fail.
for ( U32 i = 0; i < shadowMaps.size(); i += 2 )
for ( U32 i = 0; i < shadowMaps.size(); i++ )
{
LightShadowMap *lsm = shadowMaps[i];
LightShadowMap *dlsm = shadowMaps[i + 1];
{
GFXDEBUGEVENT_SCOPE( ShadowMapPass_Render_Shadow, ColorI::RED );
mShadowManager->setLightShadowMap(lsm);
mShadowManager->setLightDynamicShadowMap( dlsm );
mShadowManager->setLightShadowMap(lsm);
lsm->render(mShadowRPM, diffuseState, false, forceUpdate);
dlsm->render(mDynamicShadowRPM, diffuseState, true, forceUpdate);
lsm->render(mShadowRPM, diffuseState);
++smUpdatedShadowMaps;
}
// View dependent shadows or ones that are covering the entire
// screen are updated every frame no matter the time left in
// our shadow rendering budget.
if ( dlsm->isViewDependent() || dlsm->getLastScreenSize() >= 1.0f )
{
++smNearShadowMaps;
continue;
}
// See if we're over our frame budget for shadow
// updates... give up completely in that case.
if ( mTimer->getElapsedMs() > smRenderBudgetMs )
@ -284,7 +247,6 @@ void ShadowMapPass::render( SceneManager *sceneManager,
// The NULL here is importaint as having it around
// will cause extra work in AdvancedLightManager::setLightInfo().
mShadowManager->setLightShadowMap( NULL );
mShadowManager->setLightDynamicShadowMap( NULL );
}
void ShadowRenderPassManager::addInst( RenderInst *inst )
@ -298,29 +260,7 @@ void ShadowRenderPassManager::addInst( RenderInst *inst )
return;
const BaseMaterialDefinition *mat = meshRI->matInst->getMaterial();
if ( !mat->castsShadows() || mat->castsDynamicShadows() || mat->isTranslucent() )
{
// Do not add this instance, return here and avoid the default behavior
// of calling up to Parent::addInst()
return;
}
}
Parent::addInst(inst);
}
void DynamicShadowRenderPassManager::addInst( RenderInst *inst )
{
PROFILE_SCOPE(DynamicShadowRenderPassManager_addInst);
if ( inst->type == RIT_Mesh )
{
MeshRenderInst *meshRI = static_cast<MeshRenderInst*>( inst );
if ( !meshRI->matInst )
return;
const BaseMaterialDefinition *mat = meshRI->matInst->getMaterial();
if ( !mat->castsShadows() || !mat->castsDynamicShadows() || mat->isTranslucent() )
if ( !mat->castsShadows() || mat->isTranslucent() )
{
// Do not add this instance, return here and avoid the default behavior
// of calling up to Parent::addInst()

View file

@ -45,7 +45,6 @@ class RenderObjectMgr;
class RenderTerrainMgr;
class PlatformTimer;
class ShadowRenderPassManager;
class DynamicShadowRenderPassManager;
/// ShadowMapPass, this is plugged into the SceneManager to generate
/// ShadowMaps for the scene.
@ -109,7 +108,6 @@ private:
LightInfoList mLights;
U32 mActiveLights;
SimObjectPtr<ShadowRenderPassManager> mShadowRPM;
SimObjectPtr<DynamicShadowRenderPassManager> mDynamicShadowRPM;
LightManager* mLightManager;
ShadowMapManager* mShadowManager;
Point3F mPrevCamPos;
@ -127,14 +125,4 @@ public:
virtual void addInst( RenderInst *inst );
};
class DynamicShadowRenderPassManager : public RenderPassManager
{
typedef RenderPassManager Parent;
public:
DynamicShadowRenderPassManager() : Parent() {}
/// Add a RenderInstance to the list
virtual void addInst(RenderInst *inst);
};
#endif // _SHADOWMAPPASS_H_