Преглед на файлове

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

JeffR преди 3 години
родител
ревизия
7efab038d1
променени са 3 файла, в които са добавени 105 реда и са изтрити 21 реда
  1. 77 9
      Engine/source/T3D/assets/SoundAsset.h
  2. 3 2
      Engine/source/T3D/fx/explosion.cpp
  3. 25 10
      Engine/source/T3D/shapeImage.cpp

+ 77 - 9
Engine/source/T3D/assets/SoundAsset.h

@@ -186,6 +186,7 @@ public:
    AssetPtr<SoundAsset> 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<SFXResource> m##name[max];\
@@ -342,6 +369,7 @@ public: \
    StringTableEntry m##name##AssetId[max];\
    AssetPtr<SoundAsset> 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_

+ 3 - 2
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);

+ 25 - 10
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);
       }
    }