Skip to content

Commit eecc2bd

Browse files
committed
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.
1 parent 23e30e8 commit eecc2bd

17 files changed

Lines changed: 297 additions & 36 deletions

Engine/source/T3D/SubScene.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ IMPLEMENT_CALLBACK(SubScene, onLoaded, void, (), (),
2525
IMPLEMENT_CALLBACK(SubScene, onUnloaded, void, (), (),
2626
"@brief Called when a subScene has been unloaded and has game mode implications.\n\n");
2727

28+
namespace Sim
29+
{
30+
// Defined in simManager.cpp
31+
extern SceneStreaming* sgStreamingInstance;
32+
}
33+
34+
2835
SubScene::SubScene() :
2936
mSubSceneAssetId(StringTable->EmptyString()),
3037
mGameModesNames(StringTable->EmptyString()),
@@ -360,10 +367,12 @@ void SubScene::_loadFile(bool addFileNotify)
360367

361368
String evalCmd = String::ToString("exec(\"%s\");", mSubSceneAsset->getLevelPath());
362369

370+
Sim::sgStreamingInstance->smStreaming = true;
363371
String instantGroup = Con::getVariable("InstantGroup");
364372
Con::setIntVariable("InstantGroup", this->getId());
365373
Con::evaluate((const char*)evalCmd.c_str(), false, mSubSceneAsset->getLevelPath());
366374
Con::setVariable("InstantGroup", instantGroup.c_str());
375+
Sim::sgStreamingInstance->smStreaming = false;
367376

368377
if (addFileNotify)
369378
Torque::FS::AddChangeNotification(mSubSceneAsset->getLevelPath(), this, &SubScene::_onFileChanged);

Engine/source/T3D/gameBase/gameBase.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,64 @@ void GameBase::readPacketData(GameConnection*, BitStream*)
575575
{
576576
}
577577

578+
U32 GameBase::partialPackUpdate(NetConnection* conn, U32 mask, BitStream* stream)
579+
{
580+
U32 retMask = Parent::partialPackUpdate(conn, mask, stream);
581+
582+
if (stream->writeFlag(mask & ScaleMask))
583+
{
584+
// Only write one bit if the scale is one.
585+
if (stream->writeFlag(mObjScale != Point3F::One))
586+
mathWrite(*stream, mObjScale);
587+
588+
retMask &= ~ScaleMask;
589+
}
590+
591+
if (stream->writeFlag((mask & DataBlockMask) && mDataBlock != NULL))
592+
{
593+
stream->writeRangedU32(mDataBlock->getId(),
594+
DataBlockObjectIdFirst,
595+
DataBlockObjectIdLast);
596+
if (stream->writeFlag(mNetFlags.test(NetOrdered)))
597+
stream->writeInt(mOrderGUID, 16);
598+
599+
retMask &= ~DataBlockMask;
600+
}
601+
602+
return retMask;
603+
}
604+
605+
void GameBase::partialUnpackUpdate(NetConnection* conn, BitStream* stream)
606+
{
607+
Parent::partialUnpackUpdate(conn, stream);
608+
609+
// ScaleMask
610+
if (stream->readFlag())
611+
{
612+
if (stream->readFlag())
613+
{
614+
VectorF scale;
615+
mathRead(*stream, &scale);
616+
setScale(scale);
617+
}
618+
else
619+
setScale(Point3F::One);
620+
}
621+
622+
// DataBlockMask
623+
if (stream->readFlag())
624+
{
625+
GameBaseData* dptr = 0;
626+
SimObjectId id = stream->readRangedU32(DataBlockObjectIdFirst,
627+
DataBlockObjectIdLast);
628+
if (stream->readFlag())
629+
mOrderGUID = stream->readInt(16);
630+
631+
if (!Sim::findObject(id, dptr) || !setDataBlock(dptr))
632+
conn->setLastError("Invalid packet GameBase::unpackUpdate()");
633+
}
634+
}
635+
578636
U32 GameBase::packUpdate( NetConnection *connection, U32 mask, BitStream *stream )
579637
{
580638
U32 retMask = Parent::packUpdate( connection, mask, stream );

Engine/source/T3D/gameBase/gameBase.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,8 @@ class GameBase : public SceneObject
363363
/// @{
364364
void interpolateTick(F32 dt) override;
365365
F32 getUpdatePriority( CameraScopeQuery *focusObject, U32 updateMask, S32 updateSkips ) override;
366+
U32 partialPackUpdate(NetConnection* conn, U32 mask, BitStream* stream) override;
367+
void partialUnpackUpdate(NetConnection* conn, BitStream* stream) override;
366368
U32 packUpdate ( NetConnection *conn, U32 mask, BitStream *stream ) override;
367369
void unpackUpdate( NetConnection *conn, BitStream *stream ) override;
368370

Engine/source/T3D/tsStatic.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,86 @@ void TSStatic::setTransform(const MatrixF& mat)
942942
setRenderTransform(mat);
943943
}
944944

945+
U32 TSStatic::partialPackUpdate(NetConnection* conn, U32 mask, BitStream* stream)
946+
{
947+
U32 retMask = Parent::partialPackUpdate(conn,mask,stream);
948+
949+
if (stream->writeFlag(mask & TransformMask))
950+
{
951+
mathWrite(*stream, getTransform());
952+
retMask &= ~TransformMask;
953+
}
954+
955+
if (stream->writeFlag(mask & AdvancedStaticOptionsMask))
956+
{
957+
PACK_ASSET_REFACTOR(conn, Shape);
958+
959+
stream->writeInt(mDecalType, 4);
960+
961+
stream->writeFlag(mAllowPlayerStep);
962+
stream->writeFlag(mMeshCulling);
963+
stream->writeFlag(mUseOriginSort);
964+
965+
stream->write(mRenderNormalScalar);
966+
967+
stream->write(mForceDetail);
968+
969+
if (stream->writeFlag(mPlayAmbient && hasAnim()))
970+
{
971+
if (stream->writeFlag(mAnimOffset != 0.0f))
972+
stream->writeFloat(mAnimOffset, 7);
973+
974+
if (stream->writeFlag(mAnimSpeed != 1.0f))
975+
stream->writeSignedFloat(mAnimSpeed / AnimSpeedMax, 7);
976+
}
977+
978+
retMask &= ~AdvancedStaticOptionsMask;
979+
}
980+
981+
return retMask;
982+
}
983+
984+
void TSStatic::partialUnpackUpdate(NetConnection* conn, BitStream* stream)
985+
{
986+
Parent::partialUnpackUpdate(conn, stream);
987+
988+
if (stream->readFlag()) // TransformMask
989+
{
990+
MatrixF mat;
991+
mathRead(*stream, &mat);
992+
setTransform(mat);
993+
setRenderTransform(mat);
994+
}
995+
996+
if (stream->readFlag()) // AdvancedStaticOptionsMask
997+
{
998+
UNPACK_ASSET_REFACTOR(conn, Shape);
999+
1000+
mDecalType = (MeshType)stream->readInt(4);
1001+
1002+
mAllowPlayerStep = stream->readFlag();
1003+
mMeshCulling = stream->readFlag();
1004+
mUseOriginSort = stream->readFlag();
1005+
1006+
stream->read(&mRenderNormalScalar);
1007+
1008+
stream->read(&mForceDetail);
1009+
1010+
mPlayAmbient = stream->readFlag();
1011+
if (mPlayAmbient)
1012+
{
1013+
if (stream->readFlag())
1014+
mAnimOffset = stream->readFloat(7);
1015+
1016+
if (stream->readFlag())
1017+
mAnimSpeed = stream->readSignedFloat(7) * AnimSpeedMax;
1018+
}
1019+
1020+
//update our shape, figuring that it likely changed
1021+
_createShape();
1022+
}
1023+
}
1024+
9451025
U32 TSStatic::packUpdate(NetConnection* con, U32 mask, BitStream* stream)
9461026
{
9471027
U32 retMask = Parent::packUpdate(con, mask, stream);

Engine/source/T3D/tsStatic.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ class TSStatic : public SceneObject, protected AssetPtrCallback
254254
void reSkin();
255255

256256
// NetObject
257+
U32 partialPackUpdate(NetConnection* conn, U32 mask, BitStream* stream) override;
258+
void partialUnpackUpdate(NetConnection* conn, BitStream* stream) override;
257259
U32 packUpdate(NetConnection* conn, U32 mask, BitStream* stream) override;
258260
void unpackUpdate(NetConnection* conn, BitStream* stream) override;
259261

Engine/source/console/sim.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,3 +266,18 @@ DefineEngineFunction( isValidObjectName, bool, (const char * name), , "( string
266266
}
267267
268268
ConsoleFunctionGroupEnd( SimFunctions );
269+
270+
void SceneStreaming::processTick()
271+
{
272+
if (smStreaming)
273+
{
274+
for (U32 i = 0; i < mMaxObjects && !smPendingRegister.empty(); i++)
275+
{
276+
SimObject* obj = smPendingRegister.first();
277+
smPendingRegister.pop_front();
278+
279+
if (!obj->onAdd())
280+
obj->unregisterObject();
281+
}
282+
}
283+
}

Engine/source/console/sim.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535
#ifndef _CONSOLE_H_
3636
#include "console/console.h"
3737
#endif
38+
#ifndef _ITICKABLE_H_
39+
#include "core/iTickable.h"
40+
#endif
3841

3942
// Forward Refs
4043
class SimSet;
@@ -44,6 +47,21 @@ class SimObject;
4447
class SimEvent;
4548
class Stream;
4649

50+
class SceneStreaming : public virtual ITickable
51+
{
52+
protected:
53+
U32 mMaxObjects = 20;
54+
public:
55+
SceneStreaming(){}
56+
~SceneStreaming() {}
57+
bool smStreaming;
58+
Vector<SimObject*> smPendingRegister;
59+
60+
void interpolateTick(F32 delta) override {return;}
61+
void processTick() override;
62+
void advanceTime(F32 timeDelta) override { return; }
63+
};
64+
4765
// Sim Types
4866
typedef U32 SimTime;
4967
typedef U32 SimObjectId;

Engine/source/console/simManager.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,14 +280,16 @@ U32 getTargetTime()
280280

281281
SimGroup *gRootGroup = NULL;
282282
SimManagerNameDictionary *gNameDictionary;
283+
SceneStreaming* sgStreamingInstance = NULL;
283284
SimIdDictionary *gIdDictionary;
284285
U32 gNextObjectId;
285286

286287
static void initRoot()
287288
{
288289
gIdDictionary = new SimIdDictionary;
289290
gNameDictionary = new SimManagerNameDictionary;
290-
291+
sgStreamingInstance = new SceneStreaming;
292+
sgStreamingInstance->smStreaming = false;
291293
gRootGroup = new SimGroup();
292294
gRootGroup->incRefCount();
293295

@@ -305,6 +307,7 @@ static void shutdownRoot()
305307
gRootGroup->deleteObject();
306308
gRootGroup = NULL;
307309

310+
SAFE_DELETE(sgStreamingInstance);
308311
SAFE_DELETE(gNameDictionary);
309312
SAFE_DELETE(gIdDictionary);
310313
}

Engine/source/console/simObject.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "console/script.h"
4444

4545
#include "sim/netObject.h"
46+
#include "scene/sceneObject.h"
4647

4748
ImplementBitfieldType(GameTypeMasksType,
4849
"The type of animation effect to apply to this material.\n"
@@ -109,6 +110,7 @@ namespace Sim
109110
// Defined in simManager.cpp
110111
extern SimGroup *gRootGroup;
111112
extern SimManagerNameDictionary *gNameDictionary;
113+
extern SceneStreaming* sgStreamingInstance;
112114
extern SimIdDictionary *gIdDictionary;
113115
extern U32 gNextObjectId;
114116
}
@@ -725,6 +727,12 @@ bool SimObject::registerObject()
725727

726728
Sim::gNameDictionary->insert(this);
727729

730+
if (Sim::sgStreamingInstance->smStreaming && dynamic_cast<SceneObject*>(this))
731+
{
732+
Sim::sgStreamingInstance->smPendingRegister.push_back(this);
733+
return true; // pretend success
734+
}
735+
728736
// Notify object
729737
bool ret = onAdd();
730738

Engine/source/console/simObject.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@
4040
#ifndef _TAML_CALLBACKS_H_
4141
#include "persistence/taml/tamlCallbacks.h"
4242
#endif
43+
44+
#ifndef _OBJECTTYPES_H_
4345
#include "T3D/objectTypes.h"
46+
#endif
4447

4548
class Stream;
4649
class LightManager;

0 commit comments

Comments
 (0)