浏览代码

more enum work, now with somewhat clearer boundary names, and some debug spam for initpersistfields, and pack and unpack macros to help us try and trace why those are scrambling

AzaezelX 4 年之前
父节点
当前提交
19eb3c42f0
共有 3 个文件被更改,包括 77 次插入38 次删除
  1. 44 3
      Engine/source/T3D/assets/SoundAsset.h
  2. 31 33
      Engine/source/T3D/player.cpp
  3. 2 2
      Engine/source/T3D/player.h

+ 44 - 3
Engine/source/T3D/assets/SoundAsset.h

@@ -381,11 +381,18 @@ DefineEngineMethod(className, set##name, bool, (const char*  shape), , assetText
    {\
       const char* enumString = castConsoleTypeToString(static_cast<enumType>(i));\
       if (enumString && enumString[0])\
-      {\
+      { Con::printf("%s", enumString);\
          addProtectedField(assetEnumNameConcat(enumString, File), TypeSoundFilename, Offset(m##name##Name[i], consoleClass), _set##name##Data, & defaultProtectedGetFn, assetText(name, docs), AbstractClassRep::FIELD_HideInInspectors); \
          addProtectedField(assetEnumNameConcat(enumString, Asset), TypeSoundAssetId, Offset(m##name##AssetId[i], consoleClass), _set##name##Data, & defaultProtectedGetFn, assetText(name, asset reference.));\
       }\
    }
+
+#define INITPERSISTFIELD_SOUNDASSET_ENUM(enumString, name, enumVal, consoleClass, docs) \
+      {\
+         addProtectedField(assetText(enumString, File), TypeSoundFilename, Offset(m##name##Name[enumVal], consoleClass), _set##name##Data, & defaultProtectedGetFn, assetText(name[enumVal], docs), AbstractClassRep::FIELD_HideInInspectors); \
+         addProtectedField(assetText(enumString, Asset), TypeSoundAssetId, Offset(m##name##AssetId[enumVal], consoleClass), _set##name##Data, & defaultProtectedGetFn, assetText(name[enumVal], asset reference.));\
+      }\
+
 #pragma region Arrayed Asset Macros
 
 #define DECLARE_SOUNDASSET_ARRAY(className,name,max) public: \
@@ -574,6 +581,7 @@ DefineEngineMethod(className, set##name, bool, (const char* map, S32 index), , a
    m##name##Name[index] = other.m##name##Name[index];\
    m##name##AssetId[index] = other.m##name##AssetId[index];\
    m##name##Asset[index] = other.m##name##Asset[index];\
+   m##name[index] = = other.m##name[index];\
 }
 
 #define LOAD_SOUNDASSET_ARRAY(name, index)\
@@ -602,7 +610,10 @@ if (m##name##AssetId[index] != StringTable->EmptyString())\
       _set##name(m##name##AssetId[index], index);\
    }\
    else\
-      m##name##Name[index] = stream->readSTString();
+   {\
+      m##name##Name[index] = stream->readSTString();\
+      _set##name(m##name##AssetId[index], index);\
+   }
 
 #define PACK_SOUNDASSET_ARRAY(netconn, name, index)\
    if (stream->writeFlag(m##name##Asset[index].notNull()))\
@@ -620,8 +631,38 @@ if (m##name##AssetId[index] != StringTable->EmptyString())\
       _set##name(m##name##AssetId[index], index);\
    }\
    else\
-      m##name##Name[index] = stream->readSTString();
+   {\
+      m##name##Name[index] = stream->readSTString();\
+      _set##name(m##name##AssetId[index], index);\
+   }
+
+#define PACKDATA_SOUNDASSET_ARRAY_ENUMED(name, enumType, index )\
+{\
+   if (stream->writeFlag(m##name##Asset[index].notNull()))\
+   {\
+      stream->writeString(m##name##Asset[index].getAssetId());\
+      const char* enumString = castConsoleTypeToString(static_cast<enumType>(index));\
+      Con::printf("pack: %s = %s",enumString, m##name##AssetId[index]);\
+   }\
+   else\
+      stream->writeString(m##name##Name[index]);\
+}
 
+#define UNPACKDATA_SOUNDASSET_ARRAY_ENUMED(name, enumType, index )\
+{\
+   if (stream->readFlag())\
+   {\
+      m##name##AssetId[index] = stream->readSTString();\
+      _set##name(m##name##AssetId[index], index);\
+      const char* enumString = castConsoleTypeToString(static_cast<enumType>(index));\
+      Con::printf("unpack: %s = %s",enumString, m##name##AssetId[index]);\
+   }\
+   else\
+   {\
+      m##name##Name[index] = stream->readSTString();\
+      _set##name(m##name##AssetId[index], index);\
+   }\
+}
 #pragma endregion
 
 #endif // _ASSET_BASE_H_

+ 31 - 33
Engine/source/T3D/player.cpp

@@ -194,24 +194,24 @@ DefineEnumType(playerSoundsEnum);
 
 ImplementEnumType(playerSoundsEnum, "enum types.\n"
    "@ingroup PlayerData\n\n")
-   {PlayerData::Sounds::FootSoft,            "FootSoft","..." },
-   {PlayerData::Sounds::FootHard,            "FootHard","..." },
-   {PlayerData::Sounds::FootMetal,           "FootMetal","..." },
-   {PlayerData::Sounds::FootSnow,            "FootSnow","..." },
-   {PlayerData::Sounds::FootShallowSplash,   "FootShallowSplash","..." },
-   {PlayerData::Sounds::FootWading,          "FootWading","..." },
-   {PlayerData::Sounds::FootUnderWater,      "FootUnderWater","..." },
-   {PlayerData::Sounds::FootBubbles,         "FootBubbles","..." },
-   {PlayerData::Sounds::MoveBubbles,         "MoveBubbles","..." },
-   {PlayerData::Sounds::WaterBreath,         "WaterBreath","..." },
-   {PlayerData::Sounds::ImpactSoft,          "ImpactSoft","..." },
-   {PlayerData::Sounds::ImpactHard,          "ImpactHard","..." },
-   {PlayerData::Sounds::ImpactMetal,         "ImpactMetal","..." },
-   {PlayerData::Sounds::ImpactSnow,          "ImpactSnow","..." },
-   {PlayerData::Sounds::ImpactWaterEasy,     "ImpactWaterEasy","..." },
-   {PlayerData::Sounds::ImpactWaterMedium,   "ImpactWaterMedium","..." },
-   {PlayerData::Sounds::ImpactWaterHard,     "ImpactWaterHard","..." },
-   {PlayerData::Sounds::ExitWater,           "ExitWater","..." },
+   { playerSoundsEnum::FootSoft,            "FootSoft", "..." },
+   { playerSoundsEnum::FootHard,            "FootHard","..." },
+   { playerSoundsEnum::FootMetal,           "FootMetal","..." },
+   { playerSoundsEnum::FootSnow,            "FootSnow","..." },
+   { playerSoundsEnum::FootShallowSplash,   "FootShallowSplash","..." },
+   { playerSoundsEnum::FootWading,          "FootWading","..." },
+   { playerSoundsEnum::FootUnderWater,      "FootUnderWater","..." },
+   { playerSoundsEnum::FootBubbles,         "FootBubbles","..." },
+   { playerSoundsEnum::MoveBubbles,         "MoveBubbles","..." },
+   { playerSoundsEnum::WaterBreath,         "WaterBreath","..." },
+   { playerSoundsEnum::ImpactSoft,          "ImpactSoft","..." },
+   { playerSoundsEnum::ImpactHard,          "ImpactHard","..." },
+   { playerSoundsEnum::ImpactMetal,         "ImpactMetal","..." },
+   { playerSoundsEnum::ImpactSnow,          "ImpactSnow","..." },
+   { playerSoundsEnum::ImpactWaterEasy,     "ImpactWaterEasy","..." },
+   { playerSoundsEnum::ImpactWaterMedium,   "ImpactWaterMedium","..." },
+   { playerSoundsEnum::ImpactWaterHard,     "ImpactWaterHard","..." },
+   { playerSoundsEnum::ExitWater,           "ExitWater","..." },
 EndImplementEnumType;
 
 //----------------------------------------------------------------------------
@@ -469,18 +469,16 @@ bool PlayerData::preload(bool server, String &errorStr)
    if(!Parent::preload(server, errorStr))
       return false;
 
-   // Resolve objects transmitted from server
-   if( !server )
+   for (U32 i = 0; i < MaxSounds; ++i)
    {
-      for( U32 i = 0; i < MaxSounds; ++ i )
+      _setPlayerSound(getPlayerSound(i), i);
+      if (getPlayerSound(i) != StringTable->EmptyString())
       {
-         if (getPlayerSound(i) != StringTable->EmptyString())
-         {
-            _setPlayerSound(getPlayerSound(i), i);
-         }
-
          if (!getPlayerSoundProfile(i))
-            Con::errorf("PlayerData::Preload() - unable to find sfxProfile for asset %d %s", i, getPlayerSound(i));
+            Con::errorf("PlayerData::Preload() - unable to find sfxProfile for asset %d %s", i, mPlayerSoundAssetId[i]);
+
+         const char* enumString = castConsoleTypeToString(static_cast<Sounds>(i));
+            Con::printf("preload: %s = %s", enumString, mPlayerSoundAssetId[i]);
       }
    }
 
@@ -1051,7 +1049,7 @@ void PlayerData::initPersistFields()
 
    addGroup( "Interaction: Sounds" );
 
-      INITPERSISTFIELD_SOUNDASSET_ENUMED(PlayerSound, playerSoundsEnum, PlayerData::Sounds::MaxSounds, PlayerData, "Sounds related to player interaction.");
+   INITPERSISTFIELD_SOUNDASSET_ENUMED(PlayerSound, playerSoundsEnum, PlayerData::Sounds::MaxSounds, PlayerData, "Sounds related to player interaction.");
 
    endGroup( "Interaction: Sounds" );
 
@@ -1277,7 +1275,7 @@ void PlayerData::packData(BitStream* stream)
    stream->write(minLateralImpactSpeed);
 
    for (U32 i = 0; i < MaxSounds; i++)
-      PACKDATA_SOUNDASSET_ARRAY(PlayerSound, i);
+      PACKDATA_SOUNDASSET_ARRAY_ENUMED(PlayerSound, PlayerData::Sounds, i);
 
    mathWrite(*stream, boxSize);
    mathWrite(*stream, crouchBoxSize);
@@ -1458,7 +1456,7 @@ void PlayerData::unpackData(BitStream* stream)
    stream->read(&minLateralImpactSpeed);
 
    for (U32 i = 0; i < MaxSounds; i++)
-      UNPACKDATA_SOUNDASSET_ARRAY(PlayerSound, i);
+      UNPACKDATA_SOUNDASSET_ARRAY_ENUMED(PlayerSound, PlayerData::Sounds, i);
 
    mathRead(*stream, &boxSize);
    mathRead(*stream, &crouchBoxSize);
@@ -7059,7 +7057,7 @@ void Player::playFootstepSound( bool triggeredLeft, Material* contactMaterial, S
       // Play default sound.
 
       S32 sound = -1;
-      if (contactMaterial && (contactMaterial->mFootstepSoundId>-1 && contactMaterial->mFootstepSoundId<PlayerData::MaxSoundOffsets))
+      if (contactMaterial && (contactMaterial->mFootstepSoundId > -1 && contactMaterial->mFootstepSoundId < PlayerData::WaterStart))
          sound = contactMaterial->mFootstepSoundId;
       else if( contactObject && contactObject->getTypeMask() & VehicleObjectType )
          sound = 2;
@@ -7090,13 +7088,13 @@ void Player:: playImpactSound()
          else
          {
             S32 sound = -1;
-            if (material && (material->mImpactSoundId>-1 && material->mImpactSoundId<PlayerData::MaxSoundOffsets))
+            if (material && (material->mImpactSoundId > -1 && material->mImpactSoundId < PlayerData::WaterStart))
                sound = material->mImpactSoundId;
             else if( rInfo.object->getTypeMask() & VehicleObjectType )
                sound = 2; // Play metal;
 
             if (sound >= 0)
-               SFX->playOnce(mDataBlock->getPlayerSoundProfile(PlayerData::ImpactStart + sound), &getTransform());
+               SFX->playOnce(mDataBlock->getPlayerSoundProfile(PlayerData::ImpactSoft + sound), &getTransform());
          }
       }
    }

+ 2 - 2
Engine/source/T3D/player.h

@@ -201,8 +201,8 @@ struct PlayerData: public ShapeBaseData {
       FootHard,
       FootMetal,
       FootSnow,
-      MaxSoundOffsets,
-      FootShallowSplash,
+      WaterStart,
+      FootShallowSplash = WaterStart,
       FootWading,
       FootUnderWater,
       FootBubbles,