Test PR of lazy load of ghosts and scene streaming

For now scene streaming only affects how subscenes are loaded. If you try it on everything in a scene expect issues as the namespaces are not linked up at that point.

This is a TEST! Do not merge! If you do you will open up a gate to an alternate reality where all that you believe will cease to exist in an endless void of darkness.
This commit is contained in:
marauder2k7 2026-02-20 14:36:14 +00:00
parent 23e30e801f
commit eecc2bdaee
17 changed files with 298 additions and 37 deletions

View file

@ -25,6 +25,13 @@ IMPLEMENT_CALLBACK(SubScene, onLoaded, void, (), (),
IMPLEMENT_CALLBACK(SubScene, onUnloaded, void, (), (),
"@brief Called when a subScene has been unloaded and has game mode implications.\n\n");
namespace Sim
{
// Defined in simManager.cpp
extern SceneStreaming* sgStreamingInstance;
}
SubScene::SubScene() :
mSubSceneAssetId(StringTable->EmptyString()),
mGameModesNames(StringTable->EmptyString()),
@ -360,10 +367,12 @@ void SubScene::_loadFile(bool addFileNotify)
String evalCmd = String::ToString("exec(\"%s\");", mSubSceneAsset->getLevelPath());
Sim::sgStreamingInstance->smStreaming = true;
String instantGroup = Con::getVariable("InstantGroup");
Con::setIntVariable("InstantGroup", this->getId());
Con::evaluate((const char*)evalCmd.c_str(), false, mSubSceneAsset->getLevelPath());
Con::setVariable("InstantGroup", instantGroup.c_str());
Sim::sgStreamingInstance->smStreaming = false;
if (addFileNotify)
Torque::FS::AddChangeNotification(mSubSceneAsset->getLevelPath(), this, &SubScene::_onFileChanged);

View file

@ -575,6 +575,64 @@ void GameBase::readPacketData(GameConnection*, BitStream*)
{
}
U32 GameBase::partialPackUpdate(NetConnection* conn, U32 mask, BitStream* stream)
{
U32 retMask = Parent::partialPackUpdate(conn, mask, stream);
if (stream->writeFlag(mask & ScaleMask))
{
// Only write one bit if the scale is one.
if (stream->writeFlag(mObjScale != Point3F::One))
mathWrite(*stream, mObjScale);
retMask &= ~ScaleMask;
}
if (stream->writeFlag((mask & DataBlockMask) && mDataBlock != NULL))
{
stream->writeRangedU32(mDataBlock->getId(),
DataBlockObjectIdFirst,
DataBlockObjectIdLast);
if (stream->writeFlag(mNetFlags.test(NetOrdered)))
stream->writeInt(mOrderGUID, 16);
retMask &= ~DataBlockMask;
}
return retMask;
}
void GameBase::partialUnpackUpdate(NetConnection* conn, BitStream* stream)
{
Parent::partialUnpackUpdate(conn, stream);
// ScaleMask
if (stream->readFlag())
{
if (stream->readFlag())
{
VectorF scale;
mathRead(*stream, &scale);
setScale(scale);
}
else
setScale(Point3F::One);
}
// DataBlockMask
if (stream->readFlag())
{
GameBaseData* dptr = 0;
SimObjectId id = stream->readRangedU32(DataBlockObjectIdFirst,
DataBlockObjectIdLast);
if (stream->readFlag())
mOrderGUID = stream->readInt(16);
if (!Sim::findObject(id, dptr) || !setDataBlock(dptr))
conn->setLastError("Invalid packet GameBase::unpackUpdate()");
}
}
U32 GameBase::packUpdate( NetConnection *connection, U32 mask, BitStream *stream )
{
U32 retMask = Parent::packUpdate( connection, mask, stream );

View file

@ -363,6 +363,8 @@ public:
/// @{
void interpolateTick(F32 dt) override;
F32 getUpdatePriority( CameraScopeQuery *focusObject, U32 updateMask, S32 updateSkips ) override;
U32 partialPackUpdate(NetConnection* conn, U32 mask, BitStream* stream) override;
void partialUnpackUpdate(NetConnection* conn, BitStream* stream) override;
U32 packUpdate ( NetConnection *conn, U32 mask, BitStream *stream ) override;
void unpackUpdate( NetConnection *conn, BitStream *stream ) override;

View file

@ -942,6 +942,86 @@ void TSStatic::setTransform(const MatrixF& mat)
setRenderTransform(mat);
}
U32 TSStatic::partialPackUpdate(NetConnection* conn, U32 mask, BitStream* stream)
{
U32 retMask = Parent::partialPackUpdate(conn,mask,stream);
if (stream->writeFlag(mask & TransformMask))
{
mathWrite(*stream, getTransform());
retMask &= ~TransformMask;
}
if (stream->writeFlag(mask & AdvancedStaticOptionsMask))
{
PACK_ASSET_REFACTOR(conn, Shape);
stream->writeInt(mDecalType, 4);
stream->writeFlag(mAllowPlayerStep);
stream->writeFlag(mMeshCulling);
stream->writeFlag(mUseOriginSort);
stream->write(mRenderNormalScalar);
stream->write(mForceDetail);
if (stream->writeFlag(mPlayAmbient && hasAnim()))
{
if (stream->writeFlag(mAnimOffset != 0.0f))
stream->writeFloat(mAnimOffset, 7);
if (stream->writeFlag(mAnimSpeed != 1.0f))
stream->writeSignedFloat(mAnimSpeed / AnimSpeedMax, 7);
}
retMask &= ~AdvancedStaticOptionsMask;
}
return retMask;
}
void TSStatic::partialUnpackUpdate(NetConnection* conn, BitStream* stream)
{
Parent::partialUnpackUpdate(conn, stream);
if (stream->readFlag()) // TransformMask
{
MatrixF mat;
mathRead(*stream, &mat);
setTransform(mat);
setRenderTransform(mat);
}
if (stream->readFlag()) // AdvancedStaticOptionsMask
{
UNPACK_ASSET_REFACTOR(conn, Shape);
mDecalType = (MeshType)stream->readInt(4);
mAllowPlayerStep = stream->readFlag();
mMeshCulling = stream->readFlag();
mUseOriginSort = stream->readFlag();
stream->read(&mRenderNormalScalar);
stream->read(&mForceDetail);
mPlayAmbient = stream->readFlag();
if (mPlayAmbient)
{
if (stream->readFlag())
mAnimOffset = stream->readFloat(7);
if (stream->readFlag())
mAnimSpeed = stream->readSignedFloat(7) * AnimSpeedMax;
}
//update our shape, figuring that it likely changed
_createShape();
}
}
U32 TSStatic::packUpdate(NetConnection* con, U32 mask, BitStream* stream)
{
U32 retMask = Parent::packUpdate(con, mask, stream);

View file

@ -254,6 +254,8 @@ public:
void reSkin();
// NetObject
U32 partialPackUpdate(NetConnection* conn, U32 mask, BitStream* stream) override;
void partialUnpackUpdate(NetConnection* conn, BitStream* stream) override;
U32 packUpdate(NetConnection* conn, U32 mask, BitStream* stream) override;
void unpackUpdate(NetConnection* conn, BitStream* stream) override;