From 7efab038d1c0a4237d7e42e257452a19a34d6bc8 Mon Sep 17 00:00:00 2001 From: JeffR Date: Sat, 4 Jun 2022 00:59:06 -0500 Subject: [PATCH] Adjusts handling for special-case networking of sound assets where we may need to account for stuff like SFXPlaylists. DB names aren't transported, so we need to do Id lookups --- Engine/source/T3D/assets/SoundAsset.h | 86 ++++++++++++++++++++++++--- Engine/source/T3D/fx/explosion.cpp | 5 +- Engine/source/T3D/shapeImage.cpp | 35 +++++++---- 3 files changed, 105 insertions(+), 21 deletions(-) diff --git a/Engine/source/T3D/assets/SoundAsset.h b/Engine/source/T3D/assets/SoundAsset.h index be1866030..13613ab6e 100644 --- a/Engine/source/T3D/assets/SoundAsset.h +++ b/Engine/source/T3D/assets/SoundAsset.h @@ -186,6 +186,7 @@ public: AssetPtr m##name##Asset = NULL;\ SFXProfile* m##name##Profile = NULL;\ SFXDescription* m##name##Desc = NULL;\ + SimObjectId m##name##SFXId = NULL;\ public: \ const StringTableEntry get##name##File() const { return m##name##Name; }\ void set##name##File(const FileName &_in) { m##name##Name = StringTable->insert(_in.c_str());}\ @@ -310,31 +311,57 @@ public: \ #define PACKDATA_SOUNDASSET(name)\ if (stream->writeFlag(m##name##Asset.notNull()))\ {\ - if (m##name##Profile)\ - m##name##Profile->packData(stream);\ - sfxWrite(stream, m##name##Desc);\ + stream->writeString(m##name##Asset.getAssetId());\ }\ else\ - stream->writeString(m##name##Name); + {\ + if(stream->writeFlag(Sim::findObject(m##name##Name)))\ + {\ + SFXTrack* sndTrack;\ + Sim::findObject(m##name##Name, sndTrack);\ + stream->writeRangedU32(SimObjectId(sndTrack->getId()), DataBlockObjectIdFirst, DataBlockObjectIdLast);\ + }\ + else\ + {\ + stream->writeString(m##name##Name);\ + }\ + } + //network recieve - datablock #define UNPACKDATA_SOUNDASSET(name)\ if (stream->readFlag())\ {\ - if (m##name##Profile)\ - m##name##Profile->unpackData(stream);\ - sfxRead(stream, &m##name##Desc);\ + m##name##AssetId = stream->readSTString();\ + _set##name(m##name##AssetId);\ }\ else\ {\ - m##name##Name = stream->readSTString();\ - _set##name(m##name##Name);\ + if(stream->readFlag())\ + {\ + m##name##SFXId = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast );\ + }\ + else\ + {\ + m##name##Name = stream->readSTString(); \ + _set##name(m##name##Name); \ + }\ } #pragma endregion #pragma region Arrayed Asset Macros +#define INIT_SOUNDASSET_ARRAY(name, index) \ +{\ + m##name##Name[index] = StringTable->EmptyString(); \ + m##name##AssetId[index] = StringTable->EmptyString(); \ + m##name##Asset[index] = NULL;\ + m##name[index] = NULL;\ + m##name##Profile[index] = NULL;\ + m##name##SFXId[index] = 0;\ +} + #define DECLARE_SOUNDASSET_ARRAY(className,name,max) public: \ static const U32 sm##name##Count = max;\ Resource m##name[max];\ @@ -342,6 +369,7 @@ public: \ StringTableEntry m##name##AssetId[max];\ AssetPtr m##name##Asset[max];\ SFXProfile* m##name##Profile[max];\ + SimObjectId m##name##SFXId[max];\ public: \ const StringTableEntry get##name##File(const U32& index) const { return m##name##Name[index]; }\ void set##name##File(const FileName &_in, const U32& index) { m##name##Name[index] = StringTable->insert(_in.c_str());}\ @@ -489,6 +517,46 @@ if (m##name##AssetId[index] != StringTable->EmptyString())\ addField(assetEnumNameConcat(enumString, Asset), TypeSoundAssetId, Offset(m##name##AssetId[0], consoleClass) + sizeof(m##name##AssetId[0])*i, assetText(name, asset reference.));\ }\ } + +#define PACKDATA_SOUNDASSET_ARRAY(name, index)\ + if (stream->writeFlag(m##name##Asset[index].notNull()))\ + {\ + stream->writeString(m##name##Asset[index].getAssetId());\ + }\ + else\ + {\ + if(stream->writeFlag(Sim::findObject(m##name##Name[index])))\ + {\ + SFXTrack* sndTrack;\ + Sim::findObject(m##name##Name[index], sndTrack);\ + stream->writeRangedU32(SimObjectId(sndTrack->getId()), DataBlockObjectIdFirst, DataBlockObjectIdLast);\ + }\ + else\ + {\ + stream->writeString(m##name##Name[index]);\ + }\ + } + + +//network recieve - datablock +#define UNPACKDATA_SOUNDASSET_ARRAY(name, index)\ + if (stream->readFlag())\ + {\ + m##name##AssetId[index] = stream->readSTString();\ + _set##name(m##name##AssetId[index], index);\ + }\ + else\ + {\ + if(stream->readFlag())\ + {\ + m##name##SFXId[index] = stream->readRangedU32( DataBlockObjectIdFirst, DataBlockObjectIdLast );\ + }\ + else\ + {\ + m##name##Name[index] = stream->readSTString(); \ + _set##name(m##name##Name[index], index); \ + }\ + } #pragma endregion #endif // _ASSET_BASE_H_ diff --git a/Engine/source/T3D/fx/explosion.cpp b/Engine/source/T3D/fx/explosion.cpp index cfa5d8ef4..b59e87447 100644 --- a/Engine/source/T3D/fx/explosion.cpp +++ b/Engine/source/T3D/fx/explosion.cpp @@ -652,7 +652,8 @@ void ExplosionData::packData(BitStream* stream) PACKDATA_ASSET(ExplosionShape); - PACKDATA_SOUNDASSET(Sound); + //PACKDATA_SOUNDASSET(Sound); + PACKDATA_ASSET(Sound); if (stream->writeFlag(particleEmitter)) stream->writeRangedU32(particleEmitter->getId(),DataBlockObjectIdFirst,DataBlockObjectIdLast); @@ -756,7 +757,7 @@ void ExplosionData::unpackData(BitStream* stream) UNPACKDATA_ASSET(ExplosionShape); - UNPACKDATA_SOUNDASSET(Sound); + UNPACKDATA_ASSET(Sound); if (stream->readFlag()) particleEmitterId = stream->readRangedU32(DataBlockObjectIdFirst, DataBlockObjectIdLast); diff --git a/Engine/source/T3D/shapeImage.cpp b/Engine/source/T3D/shapeImage.cpp index 38a7fda2a..4161dbaf7 100644 --- a/Engine/source/T3D/shapeImage.cpp +++ b/Engine/source/T3D/shapeImage.cpp @@ -258,7 +258,7 @@ ShapeBaseImageData::ShapeBaseImageData() stateShapeSequence[i] = 0; stateScaleShapeSequence[i] = false; - INIT_ASSET_ARRAY(stateSound, i); + INIT_SOUNDASSET_ARRAY(stateSound, i); stateScript[i] = 0; stateEmitter[i] = 0; stateEmitterTime[i] = 0; @@ -588,17 +588,32 @@ void ShapeBaseImageData::handleStateSoundTrack(const U32& stateId) s.sound = getstateSoundAsset(stateId); - if (s.sound == NULL && mstateSoundName[stateId] != StringTable->EmptyString()) + if (s.sound == NULL) { - //ok, so we've got some sort of special-case here like a fallback or SFXPlaylist. So do the hook-up now - SFXTrack* sndTrack; - if (!Sim::findObject(mstateSoundName[stateId], sndTrack)) + if (mstateSoundName[stateId] != StringTable->EmptyString()) { - Con::errorf("ShapeBaseImageData::onAdd() - attempted to find sound %s but failed!", mstateSoundName[stateId]); + //ok, so we've got some sort of special-case here like a fallback or SFXPlaylist. So do the hook-up now + SFXTrack* sndTrack; + if (!Sim::findObject(mstateSoundName[stateId], sndTrack)) + { + Con::errorf("ShapeBaseImageData::onAdd() - attempted to find sound %s but failed!", mstateSoundName[stateId]); + } + else + { + s.soundTrack = sndTrack; + } } - else + else if (mstateSoundSFXId[stateId] != 0) { - s.soundTrack = sndTrack; + SFXTrack* sndTrack; + if (!Sim::findObject(mstateSoundSFXId[stateId], sndTrack)) + { + Con::errorf("ShapeBaseImageData::onAdd() - attempted to find sound %i but failed!", mstateSoundSFXId[stateId]); + } + else + { + s.soundTrack = sndTrack; + } } } } @@ -1172,7 +1187,7 @@ void ShapeBaseImageData::packData(BitStream* stream) } } - PACKDATA_ASSET_ARRAY(stateSound, i); + PACKDATA_SOUNDASSET_ARRAY(stateSound, i); } stream->write(maxConcurrentSounds); stream->writeFlag(useRemainderDT); @@ -1377,7 +1392,7 @@ void ShapeBaseImageData::unpackData(BitStream* stream) else s.emitter = 0; - UNPACKDATA_ASSET_ARRAY(stateSound, i); + UNPACKDATA_SOUNDASSET_ARRAY(stateSound, i); handleStateSoundTrack(i); } }