From d35560ccd78c29de557c2a4acd1317bc4eb87946 Mon Sep 17 00:00:00 2001 From: Jan Date: Tue, 8 Sep 2020 12:11:16 +0200 Subject: [PATCH] Add support for loading sound assets from iw4 zones --- src/ZoneCode.lua | 6 +- src/ZoneCode/Game/IW4/IW4_Commands.txt | 59 +++++++- src/ZoneCommon/Game/IW4/GameAssetPoolIW4.cpp | 30 ++-- src/ZoneCommon/Game/IW4/GameAssetPoolIW4.h | 6 +- src/ZoneCommon/Game/IW4/IW4_Assets.h | 133 +++++++++++++++++- src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp | 12 +- .../loadedsound/loadedsound_actions.cpp | 22 +++ .../XAssets/loadedsound/loadedsound_actions.h | 15 ++ 8 files changed, 246 insertions(+), 37 deletions(-) create mode 100644 src/ZoneLoading/Game/IW4/XAssets/loadedsound/loadedsound_actions.cpp create mode 100644 src/ZoneLoading/Game/IW4/XAssets/loadedsound/loadedsound_actions.h diff --git a/src/ZoneCode.lua b/src/ZoneCode.lua index cf628d37..560373d5 100644 --- a/src/ZoneCode.lua +++ b/src/ZoneCode.lua @@ -12,9 +12,9 @@ ZoneCode.Assets = { "MaterialVertexDeclaration", "MaterialTechniqueSet", "GfxImage", - -- "snd_alias_list_t", - -- "SndCurve", - -- "LoadedSound", + "snd_alias_list_t", + "SndCurve", + "LoadedSound", -- "clipMap_t", -- "ComWorld", -- "GameWorldSp", diff --git a/src/ZoneCode/Game/IW4/IW4_Commands.txt b/src/ZoneCode/Game/IW4/IW4_Commands.txt index 5ccda63f..10c85e8f 100644 --- a/src/ZoneCode/Game/IW4/IW4_Commands.txt +++ b/src/ZoneCode/Game/IW4/IW4_Commands.txt @@ -12,9 +12,9 @@ asset MaterialVertexShader ASSET_TYPE_VERTEXSHADER; asset MaterialVertexDeclaration ASSET_TYPE_VERTEXDECL; asset MaterialTechniqueSet ASSET_TYPE_TECHNIQUE_SET; asset GfxImage ASSET_TYPE_IMAGE; -// asset snd_alias_list_t ASSET_TYPE_SOUND; -// asset SndCurve ASSET_TYPE_SOUND_CURVE; -// asset LoadedSound ASSET_TYPE_LOADED_SOUND; +asset snd_alias_list_t ASSET_TYPE_SOUND; +asset SndCurve ASSET_TYPE_SOUND_CURVE; +asset LoadedSound ASSET_TYPE_LOADED_SOUND; // asset clipMap_t ASSET_TYPE_CLIPMAP_MP; // asset ComWorld ASSET_TYPE_COMWORLD; // asset GameWorldSp ASSET_TYPE_GAMEWORLD_SP; @@ -346,6 +346,59 @@ use GfxImageLoadDef; set action LoadImageData(GfxImageLoadDef, GfxImage); set arraysize data resourceSize; +// ========================================= +// snd_alias_list_t +// ========================================= +use snd_alias_list_t; +set string aliasName; +set name aliasName; +set reusable head; +set count head count; + +// snd_alias_t +use snd_alias_t; +set string aliasName; +set string subtitle; +set string secondaryAliasName; +set string chainAliasName; +set string mixerGroup; +set reusable soundFile; +set reusable speakerMap; + +// SoundFile +set condition SoundFile::u::loadSnd type == SAT_LOADED; + +// SpeakerMap +set string SpeakerMap::name; + +// StreamedSound +use StreamedSound; +set string dir; +set string name; + +// ========================================= +// SndCurve +// ========================================= +use SndCurve; +set string filename; +set name filename; + +// ========================================= +// LoadedSound +// ========================================= +use LoadedSound; +set string name; +set name name; + +// MssSound +use MssSound; +set block data XFILE_BLOCK_TEMP; +set reusable data; +set count data info::data_len; +set condition info::data_ptr never; +set condition info::initial_ptr never; +set action SetSoundData(MssSound); + // ========================================= // RawFile // ========================================= diff --git a/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.cpp b/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.cpp index 21405747..4b03aa1f 100644 --- a/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.cpp +++ b/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.cpp @@ -113,9 +113,9 @@ GameAssetPoolIW4::GameAssetPoolIW4(const int priority) m_material_vertex_decl = nullptr; m_technique_set = nullptr; m_image = nullptr; - // m_sound = nullptr; - // m_sound_curve = nullptr; - // m_loaded_sound = nullptr; + m_sound = nullptr; + m_sound_curve = nullptr; + m_loaded_sound = nullptr; // m_clip_map = nullptr; // m_com_world = nullptr; // m_game_world_sp = nullptr; @@ -165,9 +165,9 @@ void GameAssetPoolIW4::InitPoolStatic(const asset_type_t type, const size_t capa CASE_INIT_POOL_STATIC(ASSET_TYPE_VERTEXDECL, m_material_vertex_decl, MaterialVertexDeclaration); CASE_INIT_POOL_STATIC(ASSET_TYPE_TECHNIQUE_SET, m_technique_set, MaterialTechniqueSet); CASE_INIT_POOL_STATIC(ASSET_TYPE_IMAGE, m_image, GfxImage); - // CASE_INIT_POOL_STATIC(ASSET_TYPE_SOUND, m_sound, snd_alias_list_t); - // CASE_INIT_POOL_STATIC(ASSET_TYPE_SOUND_CURVE, m_sound_curve, SndCurve); - // CASE_INIT_POOL_STATIC(ASSET_TYPE_LOADED_SOUND, m_loaded_sound, LoadedSound); + CASE_INIT_POOL_STATIC(ASSET_TYPE_SOUND, m_sound, snd_alias_list_t); + CASE_INIT_POOL_STATIC(ASSET_TYPE_SOUND_CURVE, m_sound_curve, SndCurve); + CASE_INIT_POOL_STATIC(ASSET_TYPE_LOADED_SOUND, m_loaded_sound, LoadedSound); // CASE_INIT_POOL_STATIC(ASSET_TYPE_CLIPMAP_SP, m_clip_map, clipMap_t); // CASE_INIT_POOL_STATIC(ASSET_TYPE_CLIPMAP_MP, m_clip_map, clipMap_t); // CASE_INIT_POOL_STATIC(ASSET_TYPE_COMWORLD, m_com_world, ComWorld); @@ -225,9 +225,9 @@ void GameAssetPoolIW4::InitPoolDynamic(const asset_type_t type) CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_VERTEXDECL, m_material_vertex_decl, MaterialVertexDeclaration); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_TECHNIQUE_SET, m_technique_set, MaterialTechniqueSet); CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_IMAGE, m_image, GfxImage); - // CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_SOUND, m_sound, snd_alias_list_t); - // CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_SOUND_CURVE, m_sound_curve, SndCurve); - // CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_LOADED_SOUND, m_loaded_sound, LoadedSound); + CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_SOUND, m_sound, snd_alias_list_t); + CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_SOUND_CURVE, m_sound_curve, SndCurve); + CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_LOADED_SOUND, m_loaded_sound, LoadedSound); // CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_CLIPMAP_SP, m_clip_map, clipMap_t); // CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_CLIPMAP_MP, m_clip_map, clipMap_t); // CASE_INIT_POOL_DYNAMIC(ASSET_TYPE_COMWORLD, m_com_world, ComWorld); @@ -294,9 +294,9 @@ XAssetInfoGeneric* GameAssetPoolIW4::AddAsset(asset_type_t type, std::string nam CASE_ADD_TO_POOL(ASSET_TYPE_VERTEXDECL, m_material_vertex_decl, vertexDecl); CASE_ADD_TO_POOL(ASSET_TYPE_TECHNIQUE_SET, m_technique_set, techniqueSet); CASE_ADD_TO_POOL(ASSET_TYPE_IMAGE, m_image, image); - // CASE_ADD_TO_POOL(ASSET_TYPE_SOUND, m_sound, sound); - // CASE_ADD_TO_POOL(ASSET_TYPE_SOUND_CURVE, m_sound_curve, sndCurve); - // CASE_ADD_TO_POOL(ASSET_TYPE_LOADED_SOUND, m_loaded_sound, loadSnd); + CASE_ADD_TO_POOL(ASSET_TYPE_SOUND, m_sound, sound); + CASE_ADD_TO_POOL(ASSET_TYPE_SOUND_CURVE, m_sound_curve, sndCurve); + CASE_ADD_TO_POOL(ASSET_TYPE_LOADED_SOUND, m_loaded_sound, loadSnd); // CASE_ADD_TO_POOL(ASSET_TYPE_CLIPMAP_SP, m_clip_map, clipMap); // CASE_ADD_TO_POOL(ASSET_TYPE_CLIPMAP_MP, m_clip_map, clipMap); // CASE_ADD_TO_POOL(ASSET_TYPE_COMWORLD, m_com_world, comWorld); @@ -354,9 +354,9 @@ XAssetInfoGeneric* GameAssetPoolIW4::GetAsset(const asset_type_t type, std::stri CASE_GET_ASSET(ASSET_TYPE_VERTEXDECL, m_material_vertex_decl); CASE_GET_ASSET(ASSET_TYPE_TECHNIQUE_SET, m_technique_set); CASE_GET_ASSET(ASSET_TYPE_IMAGE, m_image); - // CASE_GET_ASSET(ASSET_TYPE_SOUND, m_sound); - // CASE_GET_ASSET(ASSET_TYPE_SOUND_CURVE, m_sound_curve); - // CASE_GET_ASSET(ASSET_TYPE_LOADED_SOUND, m_loaded_sound); + CASE_GET_ASSET(ASSET_TYPE_SOUND, m_sound); + CASE_GET_ASSET(ASSET_TYPE_SOUND_CURVE, m_sound_curve); + CASE_GET_ASSET(ASSET_TYPE_LOADED_SOUND, m_loaded_sound); // CASE_GET_ASSET(ASSET_TYPE_CLIPMAP_SP, m_clip_map); // CASE_GET_ASSET(ASSET_TYPE_CLIPMAP_MP, m_clip_map); // CASE_GET_ASSET(ASSET_TYPE_COMWORLD, m_com_world); diff --git a/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.h b/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.h index 44835d57..ba5cd7e2 100644 --- a/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.h +++ b/src/ZoneCommon/Game/IW4/GameAssetPoolIW4.h @@ -25,9 +25,9 @@ public: std::unique_ptr> m_material_vertex_decl; std::unique_ptr> m_technique_set; std::unique_ptr> m_image; - // std::unique_ptr> m_sound; - // std::unique_ptr> m_sound_curve; - // std::unique_ptr> m_loaded_sound; + std::unique_ptr> m_sound; + std::unique_ptr> m_sound_curve; + std::unique_ptr> m_loaded_sound; // std::unique_ptr> m_clip_map; // std::unique_ptr> m_com_world; // std::unique_ptr> m_game_world_sp; diff --git a/src/ZoneCommon/Game/IW4/IW4_Assets.h b/src/ZoneCommon/Game/IW4/IW4_Assets.h index c7f0ebe6..1d972d37 100644 --- a/src/ZoneCommon/Game/IW4/IW4_Assets.h +++ b/src/ZoneCommon/Game/IW4/IW4_Assets.h @@ -84,9 +84,9 @@ namespace IW4 struct MaterialVertexDeclaration; struct MaterialTechniqueSet; struct GfxImage; - // struct snd_alias_list_t; - // struct SndCurve; - // struct LoadedSound; + struct snd_alias_list_t; + struct SndCurve; + struct LoadedSound; // struct clipMap_t; // struct ComWorld; // struct GameWorldSp; @@ -105,7 +105,6 @@ namespace IW4 // struct FxImpactTable; struct RawFile; struct StringTable; - // struct LeaderboardDef; // struct StructuredDataDefSet; // struct TracerDef; @@ -125,9 +124,9 @@ namespace IW4 MaterialVertexDeclaration* vertexDecl; MaterialTechniqueSet* techniqueSet; GfxImage* image; - // snd_alias_list_t* sound; - // SndCurve* sndCurve; - // LoadedSound* loadSnd; + snd_alias_list_t* sound; + SndCurve* sndCurve; + LoadedSound* loadSnd; // clipMap_t* clipMap; // ComWorld* comWorld; // GameWorldSp* gameWorldSp; @@ -852,6 +851,126 @@ namespace IW4 StringTableCell* values; }; + struct _AILSOUNDINFO + { + int format; + const void* data_ptr; + unsigned int data_len; + unsigned int rate; + int bits; + int channels; + unsigned int samples; + unsigned int block_size; + const void* initial_ptr; + }; + + struct MssSound + { + _AILSOUNDINFO info; + char* data; + }; + + struct LoadedSound + { + const char* name; + MssSound sound; + }; + + struct StreamedSound + { + const char* dir; + const char* name; + }; + + union SoundFileRef + { + LoadedSound* loadSnd; + StreamedSound streamSnd; + }; + + enum snd_alias_type_t : char + { + SAT_UNKNOWN = 0x0, + SAT_LOADED = 0x1, + SAT_STREAMED = 0x2, + SAT_VOICED = 0x3, + SAT_COUNT, + }; + + struct SoundFile + { + snd_alias_type_t type; + char exists; + SoundFileRef u; + }; + + struct MSSSpeakerLevels + { + int speaker; + int numLevels; + float levels[2]; + }; + + struct MSSChannelMap + { + int speakerCount; + MSSSpeakerLevels speakers[6]; + }; + + struct SpeakerMap + { + bool isDefault; + const char* name; + MSSChannelMap channelMaps[2][2]; + }; + + struct snd_alias_t + { + const char* aliasName; + const char* subtitle; + const char* secondaryAliasName; + const char* chainAliasName; + const char* mixerGroup; + SoundFile* soundFile; + int sequence; + float volMin; + float volMax; + float pitchMin; + float pitchMax; + float distMin; + float distMax; + float velocityMin; + int flags; + union + { + float slavePercentage; + float masterPercentage; + }; + float probability; + float lfePercentage; + float centerPercentage; + int startDelay; + SndCurve* volumeFalloffCurve; + float envelopMin; + float envelopMax; + float envelopPercentage; + SpeakerMap* speakerMap; + }; + + struct snd_alias_list_t + { + const char* aliasName; + snd_alias_t* head; + int count; + }; + + struct SndCurve + { + const char* filename; + unsigned __int16 knotCount; + float knots[16][2]; + }; + #ifndef __zonecodegenerator } #endif diff --git a/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp b/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp index 27d803e9..f92ba10f 100644 --- a/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp +++ b/src/ZoneLoading/Game/IW4/ContentLoaderIW4.cpp @@ -17,7 +17,7 @@ //#include "Game/IW4/XAssets/gfxlightdef/gfxlightdef_load_db.h" //#include "Game/IW4/XAssets/gfxworld/gfxworld_load_db.h" //#include "Game/IW4/XAssets/leaderboarddef/leaderboarddef_load_db.h" -//#include "Game/IW4/XAssets/loadedsound/loadedsound_load_db.h" +#include "Game/IW4/XAssets/loadedsound/loadedsound_load_db.h" //#include "Game/IW4/XAssets/localizeentry/localizeentry_load_db.h" //#include "Game/IW4/XAssets/mapents/mapents_load_db.h" #include "Game/IW4/XAssets/material/material_load_db.h" @@ -30,8 +30,8 @@ #include "Game/IW4/XAssets/physcollmap/physcollmap_load_db.h" #include "Game/IW4/XAssets/physpreset/physpreset_load_db.h" #include "Game/IW4/XAssets/rawfile/rawfile_load_db.h" -//#include "Game/IW4/XAssets/snd_alias_list_t/snd_alias_list_t_load_db.h" -//#include "Game/IW4/XAssets/sndcurve/sndcurve_load_db.h" +#include "Game/IW4/XAssets/snd_alias_list_t/snd_alias_list_t_load_db.h" +#include "Game/IW4/XAssets/sndcurve/sndcurve_load_db.h" //#include "Game/IW4/XAssets/snddriverglobals/snddriverglobals_load_db.h" #include "Game/IW4/XAssets/stringtable/stringtable_load_db.h" //#include "Game/IW4/XAssets/structureddatadefset/structureddatadefset_load_db.h" @@ -110,9 +110,9 @@ void ContentLoaderIW4::LoadXAsset(const bool atStreamStart) LOAD_ASSET(ASSET_TYPE_VERTEXDECL, MaterialVertexDeclaration, vertexDecl); LOAD_ASSET(ASSET_TYPE_TECHNIQUE_SET, MaterialTechniqueSet, techniqueSet); LOAD_ASSET(ASSET_TYPE_IMAGE, GfxImage, image); - // LOAD_ASSET(ASSET_TYPE_SOUND, snd_alias_list_t, sound); - // LOAD_ASSET(ASSET_TYPE_SOUND_CURVE, SndCurve, sndCurve); - // LOAD_ASSET(ASSET_TYPE_LOADED_SOUND, LoadedSound, loadSnd); + LOAD_ASSET(ASSET_TYPE_SOUND, snd_alias_list_t, sound); + LOAD_ASSET(ASSET_TYPE_SOUND_CURVE, SndCurve, sndCurve); + LOAD_ASSET(ASSET_TYPE_LOADED_SOUND, LoadedSound, loadSnd); // LOAD_ASSET(ASSET_TYPE_CLIPMAP_SP, clipMap_t, clipMap); // LOAD_ASSET(ASSET_TYPE_CLIPMAP_MP, clipMap_t, clipMap); // LOAD_ASSET(ASSET_TYPE_COMWORLD, ComWorld, comWorld); diff --git a/src/ZoneLoading/Game/IW4/XAssets/loadedsound/loadedsound_actions.cpp b/src/ZoneLoading/Game/IW4/XAssets/loadedsound/loadedsound_actions.cpp new file mode 100644 index 00000000..b12f56c9 --- /dev/null +++ b/src/ZoneLoading/Game/IW4/XAssets/loadedsound/loadedsound_actions.cpp @@ -0,0 +1,22 @@ +#include "loadedsound_actions.h" + +using namespace IW4; + +Actions_LoadedSound::Actions_LoadedSound(Zone* zone) + : AssetLoadingActions(zone) +{ +} + +void Actions_LoadedSound::SetSoundData(MssSound* sound) const +{ + if (sound->info.data_len > 0) + { + char* tempData = sound->data; + sound->data = static_cast(m_zone->GetMemory()->Alloc(sound->info.data_len)); + memcpy(sound->data, tempData, sound->info.data_len); + } + else + { + sound->data = nullptr; + } +} diff --git a/src/ZoneLoading/Game/IW4/XAssets/loadedsound/loadedsound_actions.h b/src/ZoneLoading/Game/IW4/XAssets/loadedsound/loadedsound_actions.h new file mode 100644 index 00000000..bf0f16de --- /dev/null +++ b/src/ZoneLoading/Game/IW4/XAssets/loadedsound/loadedsound_actions.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Loading/AssetLoadingActions.h" +#include "Game/IW4/IW4.h" + +namespace IW4 +{ + class Actions_LoadedSound final : public AssetLoadingActions + { + public: + explicit Actions_LoadedSound(Zone* zone); + + void SetSoundData(MssSound* sound) const; + }; +}