Merge pull request #1669 from Azaezel/alpha41/reflectionCorrection
Some checks are pending
Linux Build / Ubuntu Latest GCC (push) Waiting to run
MacOSX Build / MacOSX Latest Clang (push) Waiting to run
Windows Build / Windows Latest MSVC (push) Waiting to run

make reflectors optional
This commit is contained in:
Brian Roberts 2026-02-23 10:23:49 -06:00 committed by GitHub
commit 23e30e801f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 56 additions and 23 deletions

View file

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

View file

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

View file

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

View file

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