make reflectors optional

don't waste memory per object-instance on non reflective objects
This commit is contained in:
AzaezelX 2026-02-19 14:46:19 -06:00
parent 2dae0fbbad
commit 01b10cfb89
4 changed files with 56 additions and 23 deletions

View file

@ -975,6 +975,7 @@ ShapeBase::ShapeBase()
mMoveMotion( false ),
mShapeBaseMount( NULL ),
mShapeInstance( NULL ),
mCubeReflector(NULL),
mConvexList( new Convex ),
mEnergy( 0.0f ),
mRechargeRate( 0.0f ),
@ -1053,6 +1054,12 @@ ShapeBase::~ShapeBase()
mShapeInstance = NULL;
}
if (mCubeReflector)
{
mCubeReflector->unregisterReflector();
SAFE_DELETE(mCubeReflector);
}
CollisionTimeout* ptr = mTimeoutList;
while (ptr) {
CollisionTimeout* cur = ptr;
@ -1173,7 +1180,11 @@ void ShapeBase::onRemove()
if ( isClientObject() )
{
mCubeReflector.unregisterReflector();
if (mCubeReflector)
{
mCubeReflector->unregisterReflector();
SAFE_DELETE(mCubeReflector);
}
}
}
@ -1349,11 +1360,17 @@ bool ShapeBase::onNewDataBlock( GameBaseData *dptr, bool reload )
mLightPlugin->reset();
if ( isClientObject() )
{
mCubeReflector.unregisterReflector();
if ( mDataBlock->reflectorDesc )
mCubeReflector.registerReflector( this, mDataBlock->reflectorDesc );
{
if (mCubeReflector)
{
mCubeReflector->unregisterReflector();
SAFE_DELETE(mCubeReflector);
}
if (mDataBlock->reflectorDesc)
{
mCubeReflector = new CubeReflector();
mCubeReflector->registerReflector(this, mDataBlock->reflectorDesc);
}
}
return true;
@ -2681,7 +2698,7 @@ void ShapeBase::_prepRenderImage( SceneRenderState *state,
// If we're currently rendering our own reflection we
// don't want to render ourselves into it.
if ( mCubeReflector.isRendering() )
if (mCubeReflector && mCubeReflector->isRendering())
return;
// We force all the shapes to use the highest detail
@ -2785,8 +2802,8 @@ void ShapeBase::prepBatchRender(SceneRenderState* state, S32 mountedImageIndex )
// Set up our TS render state.
TSRenderState rdata;
rdata.setSceneState( state );
if ( mCubeReflector.isEnabled() )
rdata.setCubemap( mCubeReflector.getCubemap() );
if (mCubeReflector && mCubeReflector->isEnabled())
rdata.setCubemap( mCubeReflector->getCubemap() );
rdata.setFadeOverride( (1.0f - mCloakLevel) * mFadeVal );
// We might have some forward lit materials
@ -2810,14 +2827,14 @@ void ShapeBase::prepBatchRender(SceneRenderState* state, S32 mountedImageIndex )
mat.scale( mObjScale );
GFX->setWorldMatrix( mat );
if ( state->isDiffusePass() && mCubeReflector.isEnabled() && mCubeReflector.getOcclusionQuery() )
if ( state->isDiffusePass() && mCubeReflector && mCubeReflector->isEnabled() && mCubeReflector->getOcclusionQuery() )
{
RenderPassManager *pass = state->getRenderPass();
OccluderRenderInst *ri = pass->allocInst<OccluderRenderInst>();
ri->type = RenderPassManager::RIT_Occluder;
ri->query = mCubeReflector.getOcclusionQuery();
ri->query = mCubeReflector->getOcclusionQuery();
mObjToWorld.mulP( mObjBox.getCenter(), &ri->position );
ri->scale.set( mObjBox.getExtents() );
ri->orientation = pass->allocUniqueXform( mObjToWorld );

View file

@ -1207,7 +1207,7 @@ public:
static F32 sFullCorrectionDistance;
static F32 sCloakSpeed; // Time to cloak, in seconds
CubeReflector mCubeReflector;
CubeReflector* mCubeReflector;
/// @name Initialization
/// @{

View file

@ -109,7 +109,8 @@ F32 TSStatic::smStaticObjectUnfadeableSize = 75;
TSStatic::TSStatic()
:
cubeDescId(0),
reflectorDesc(NULL)
reflectorDesc(NULL),
mCubeReflector(NULL)
{
mNetFlags.set(Ghostable | ScopeAlways);
@ -159,6 +160,11 @@ TSStatic::~TSStatic()
delete mConvexList;
mConvexList = NULL;
mShapeAsset.unregisterRefreshNotify();
if (mCubeReflector)
{
mCubeReflector->unregisterReflector();
SAFE_DELETE(mCubeReflector);
}
}
ImplementEnumType(TSMeshType,
@ -361,10 +367,17 @@ bool TSStatic::onAdd()
if (isClientObject())
{
mCubeReflector.unregisterReflector();
if (mCubeReflector)
{
mCubeReflector->unregisterReflector();
SAFE_DELETE(mCubeReflector);
}
if (reflectorDesc)
mCubeReflector.registerReflector(this, reflectorDesc);
{
mCubeReflector = new CubeReflector();
mCubeReflector->registerReflector(this, reflectorDesc);
}
}
_updateShouldTick();
@ -594,8 +607,11 @@ void TSStatic::onRemove()
mShapeInstance = NULL;
mAmbientThread = NULL;
if (isClientObject())
mCubeReflector.unregisterReflector();
if (isClientObject() && mCubeReflector)
{
mCubeReflector->unregisterReflector();
SAFE_DELETE(mCubeReflector);
}
Parent::onRemove();
}
@ -780,7 +796,7 @@ void TSStatic::prepRenderImage(SceneRenderState* state)
// If we're currently rendering our own reflection we
// don't want to render ourselves into it.
if (mCubeReflector.isRendering())
if (mCubeReflector && mCubeReflector->isRendering())
return;
@ -800,8 +816,8 @@ void TSStatic::prepRenderImage(SceneRenderState* state)
rdata.setFadeOverride(1.0f);
rdata.setOriginSort(mUseOriginSort);
if (mCubeReflector.isEnabled())
rdata.setCubemap(mCubeReflector.getCubemap());
if (mCubeReflector && mCubeReflector->isEnabled())
rdata.setCubemap(mCubeReflector->getCubemap());
// Acculumation
rdata.setAccuTex(mAccuTex);
@ -830,13 +846,13 @@ void TSStatic::prepRenderImage(SceneRenderState* state)
mat.scale(mObjScale);
GFX->setWorldMatrix(mat);
if (state->isDiffusePass() && mCubeReflector.isEnabled() && mCubeReflector.getOcclusionQuery())
if (state->isDiffusePass() && mCubeReflector && mCubeReflector->isEnabled() && mCubeReflector->getOcclusionQuery())
{
RenderPassManager* pass = state->getRenderPass();
OccluderRenderInst* ri = pass->allocInst<OccluderRenderInst>();
ri->type = RenderPassManager::RIT_Occluder;
ri->query = mCubeReflector.getOcclusionQuery();
ri->query = mCubeReflector->getOcclusionQuery();
mObjToWorld.mulP(mObjBox.getCenter(), &ri->position);
ri->scale.set(mObjBox.getExtents());
ri->orientation = pass->allocUniqueXform(mObjToWorld);

View file

@ -184,7 +184,7 @@ protected:
String cubeDescName;
U32 cubeDescId;
ReflectorDesc* reflectorDesc;
CubeReflector mCubeReflector;
CubeReflector* mCubeReflector;
void onAssetRefreshed(AssetPtrBase* pAssetPtrBase) override
{