Adds handling for datablocks to be reloaded if the assets they utilize have their files directly edited.

This commit is contained in:
JeffR 2025-04-24 00:58:20 -05:00
parent 0eafadb1a0
commit f31acf774e
23 changed files with 121 additions and 37 deletions

View file

@ -370,7 +370,7 @@ public: \
#pragma region Arrayed Asset Macros
#define DECLARE_SHAPEASSET_ARRAY(className,name,max) public: \
#define DECLARE_SHAPEASSET_ARRAY(className,name,max,changeFunc) public: \
static const U32 sm##name##Count = max;\
Resource<TSShape>m##name[max];\
StringTableEntry m##name##Name[max]; \
@ -384,6 +384,10 @@ public: \
\
bool _set##name(StringTableEntry _in, const U32& index)\
{\
if (m##name##Asset[index].notNull())\
{\
m##name##Asset[index]->getChangedSignal().remove(this, &className::changeFunc);\
}\
if(m##name##AssetId[index] != _in || m##name##Name[index] != _in)\
{\
if(index >= sm##name##Count || index < 0)\
@ -430,6 +434,8 @@ public: \
if (get##name(index) != StringTable->EmptyString() && m##name##Asset[index].notNull())\
{\
m##name[index] = m##name##Asset[index]->getShapeResource();\
\
m##name##Asset[index]->getChangedSignal().notify(this, &className::changeFunc);\
}\
else\
{\

View file

@ -111,7 +111,10 @@ public:
void onPerformSubstitutions() override;
bool allowSubstitutions() const override { return true; }
void onShapeChanged() {}
void onShapeChanged()
{
reloadOnLocalClient();
}
};
//**************************************************************************

View file

@ -143,7 +143,10 @@ public:
ExplosionData* cloneAndPerformSubstitutions(const SimObject*, S32 index=0);
bool allowSubstitutions() const override { return true; }
void onShapeChanged() {}
void onShapeChanged()
{
reloadOnLocalClient();
}
};

View file

@ -341,7 +341,7 @@ protected:
RectF mBillboardRects[MAX_COVERTYPES];
/// The cover shape filenames.
DECLARE_SHAPEASSET_ARRAY(GroundCover, Shape, MAX_COVERTYPES);
DECLARE_SHAPEASSET_ARRAY(GroundCover, Shape, MAX_COVERTYPES, onShapeChanged);
DECLARE_ASSET_ARRAY_NET_SETGET(GroundCover, Shape, -1);
/// The cover shape instances.
@ -409,6 +409,8 @@ protected:
S32 randSeed );
void _debugRender( ObjectRenderInst *ri, SceneRenderState *state, BaseMatInstance *overrideMat );
void onShapeChanged(){}
};
#endif // _GROUNDCOVER_H_

View file

@ -92,7 +92,10 @@ class ParticleData : public SimDataBlock
static bool protectedSetSizes(void* object, const char* index, const char* data);
static bool protectedSetTimes(void* object, const char* index, const char* data);
void onImageChanged() {}
void onImageChanged()
{
reloadOnLocalClient();
}
public:
ParticleData();

View file

@ -69,8 +69,14 @@ class PrecipitationData : public GameBaseData
void packData(BitStream* stream) override;
void unpackData(BitStream* stream) override;
void onDropChanged() {}
void onSplashChanged() {}
void onDropChanged()
{
reloadOnLocalClient();
}
void onSplashChanged()
{
reloadOnLocalClient();
}
};
struct Raindrop

View file

@ -124,7 +124,10 @@ public:
DECLARE_IMAGEASSET_ARRAY(SplashData, Texture, NUM_TEX, onTextureChanged);
DECLARE_IMAGEASSET_ARRAY_SETGET(SplashData, Texture)
void onTextureChanged() {}
void onTextureChanged()
{
reloadOnLocalClient();
}
ExplosionData* explosion;
S32 explosionId;

View file

@ -106,7 +106,10 @@ protected:
void _makePrimBuffer( GFXPrimitiveBufferHandle *pb, U32 count );
void _renderCorona( ObjectRenderInst *ri, SceneRenderState *state, BaseMatInstance *overrideMat );
void onImageChanged() {}
void onImageChanged()
{
reloadOnLocalClient();
}
protected:

View file

@ -97,7 +97,10 @@ public:
void packData( BitStream *stream ) override;
void unpackData( BitStream *stream ) override;
void onShapeChanged() {}
void onShapeChanged()
{
reloadOnLocalClient();
}
DECLARE_CONOBJECT( PhysicsDebrisData );

View file

@ -135,7 +135,10 @@ public:
SimObjectRef< ExplosionData > explosion;
SimObjectRef< PhysicsShapeData > destroyedShape;
void onShapeChanged() {}
void onShapeChanged()
{
reloadOnLocalClient();
}
};
typedef PhysicsShapeData::SimType PhysicsSimType;

View file

@ -76,7 +76,7 @@ struct PlayerData: public ShapeBaseData {
/// that we don't create a TSThread on the player if we don't
/// need to.
DECLARE_SHAPEASSET_ARRAY(PlayerData, ShapeFP, ShapeBase::MaxMountedImages); ///< Used to render with mounted images in first person [optional]
DECLARE_SHAPEASSET_ARRAY(PlayerData, ShapeFP, ShapeBase::MaxMountedImages, onShapeChanged); ///< Used to render with mounted images in first person [optional]
DECLARE_ASSET_ARRAY_SETGET(PlayerData, ShapeFP);
StringTableEntry imageAnimPrefixFP; ///< Passed along to mounted images to modify
@ -366,6 +366,11 @@ struct PlayerData: public ShapeBaseData {
void packData(BitStream* stream) override;
void unpackData(BitStream* stream) override;
void onShapeChanged()
{
reloadOnLocalClient();
}
/// @name Callbacks
/// @{
DECLARE_CALLBACK( void, onPoseChange, ( Player* obj, const char* oldPose, const char* newPose ) );

View file

@ -154,7 +154,10 @@ public:
ProjectileData(const ProjectileData&, bool = false);
bool allowSubstitutions() const override { return true; }
void onShapeChanged() {}
void onShapeChanged()
{
reloadOnLocalClient();
}
};

View file

@ -345,7 +345,7 @@ bool ShapeBaseData::preload(bool server, String &errorStr)
S32 i;
U32 assetStatus = ShapeAsset::getAssetErrCode(mShapeAsset);
if (assetStatus == AssetBase::Ok|| assetStatus == AssetBase::UsingFallback)
if (assetStatus == AssetBase::Ok || assetStatus == AssetBase::UsingFallback)
{
if (!server && !mShape->preloadMaterialList(mShape.getPath()) && NetConnection::filesWereDownloaded())
shapeError = true;
@ -904,7 +904,17 @@ void ShapeBaseData::unpackData(BitStream* stream)
silent_bbox_check = stream->readFlag();
}
//
//
void ShapeBaseData::onShapeChanged()
{
reloadOnLocalClient();
}
void ShapeBaseData::onDebrisChanged()
{
reloadOnLocalClient();
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------

View file

@ -378,7 +378,7 @@ struct ShapeBaseImageData: public GameBaseData {
F32 scriptAnimTransitionTime; ///< The amount of time to transition between the previous sequence and new sequence
///< when the script prefix has changed.
DECLARE_SHAPEASSET_ARRAY(ShapeBaseImageData, Shape, MaxShapes); ///< Name of shape to render.
DECLARE_SHAPEASSET_ARRAY(ShapeBaseImageData, Shape, MaxShapes, onShapeChanged); ///< Name of shape to render.
DECLARE_ASSET_ARRAY_SETGET(ShapeBaseImageData, Shape);
//DECLARE_SHAPEASSET(ShapeBaseImageData, ShapeFP); ///< Name of shape to render in first person (optional).
@ -505,6 +505,11 @@ struct ShapeBaseImageData: public GameBaseData {
void handleStateSoundTrack(const U32& stateId);
void onShapeChanged()
{
reloadOnLocalClient();
}
/// @}
/// @name Callbacks
@ -681,8 +686,8 @@ public:
Vector<TextureTagRemapping> txr_tag_remappings;
bool silent_bbox_check;
void onShapeChanged() {}
void onDebrisChanged() {}
void onShapeChanged();
void onDebrisChanged();
public:
ShapeBaseData(const ShapeBaseData&, bool = false);
};

View file

@ -74,7 +74,10 @@ struct WheeledVehicleTire: public SimDataBlock
void packData(BitStream* stream) override;
void unpackData(BitStream* stream) override;
void onShapeChanged() {}
void onShapeChanged()
{
reloadOnLocalClient();
}
};