diff options
| author | Léo Lam <leo@leolam.fr> | 2021-10-28 20:48:35 +0200 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2021-10-30 12:17:26 +0200 |
| commit | 70aaa429fe82098d954d0945bfb1b8253a7fa45a (patch) | |
| tree | 7a7d8e94b3a905831c6f06c4e6449cf08ad32245 /src/KingSystem/Physics/System/physMaterialTable.cpp | |
| parent | 5580b4934565823844a7fa02ad0eb62cc7e3ab55 (diff) | |
ksys/phys: Start adding SystemData
- SystemData (WIP)
- MaterialTable (should be complete)
Diffstat (limited to 'src/KingSystem/Physics/System/physMaterialTable.cpp')
| -rw-r--r-- | src/KingSystem/Physics/System/physMaterialTable.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/KingSystem/Physics/System/physMaterialTable.cpp b/src/KingSystem/Physics/System/physMaterialTable.cpp new file mode 100644 index 00000000..50bfe70f --- /dev/null +++ b/src/KingSystem/Physics/System/physMaterialTable.cpp @@ -0,0 +1,124 @@ +#include "KingSystem/Physics/System/physMaterialTable.h" +#include <heap/seadFrameHeap.h> + +namespace ksys::phys { + +MaterialTable::MaterialTable() = default; + +MaterialTable::~MaterialTable() = default; + +void MaterialTable::loadMaterialTable(sead::Heap* heap, agl::utl::ResParameterArchive archive) { + addMaterialTableList("MaterialTable"); + + for (int i = 0; i < Material::size(); ++i) { + const char* material_name = materialToText(i); + auto& obj = mMaterialTable[i]; + mMaterialTablePList.addObj(&obj, material_name); + + for (int j = 0; j < Material::size(); ++j) { + const char* target_name = materialToText(j); + obj.values[j].init(sead::Vector2f::zero, target_name, target_name, &obj); + } + } + + mMaterialTablePIO.applyResParameterArchive(archive); +} + +void MaterialTable::loadSubMaterialTable(sead::Heap* heap, agl::utl::ResParameterArchive archive) { + addSubMaterialTableList("SubMaterialTable"); + + const auto SubMaterialTable = archive.getRootList().getResParameterList(0); + + auto* str_heap = sead::FrameHeap::create( + 0, "SubMaterialString", heap, 8, sead::Heap::HeapDirection::cHeapDirection_Forward, false); + + for (int i = 0; i < Material::size() && i < SubMaterialTable.getResParameterObjNum(); ++i) { + const char* material_name = materialToText(i); + auto& obj = mSubMaterialTable[i]; + mSubMaterialTablePList.addObj(&obj, material_name); + obj.num_values = SubMaterialTable.getResParameterObj(i).getNum(); + + for (int submat = 0; submat < obj.values.size(); ++submat) { + auto* key = new (str_heap) sead::FormatFixedSafeString<32>("submat_%d", submat); + obj.values[submat].init(sead::SafeString::cEmptyString, *key, *key, &obj); + } + } + + if (archive.getRootList().getResParameterListNum() >= 2) { + mSubMaterialTablePIO.addList(&mSoundSubMaterialTablePList, "SoundSubMaterialTable"); + for (int i = 0; i < Material::size() && i < SubMaterialTable.getResParameterObjNum(); ++i) { + const char* material_name = materialToText(i); + auto& obj = mSoundSubMaterialTable[i]; + mSoundSubMaterialTablePList.addObj(&obj, material_name); + obj.num_values = SubMaterialTable.getResParameterObj(i).getNum(); + + for (int submat = 0; submat < obj.values.size(); ++submat) { + auto* key = new (str_heap) sead::FormatFixedSafeString<32>("submat_%d", submat); + obj.values[submat].init(sead::SafeString::cEmptyString, *key, *key, &obj); + } + } + } + + if (archive.getRootList().getResParameterListNum() >= 3) { + mSubMaterialTablePIO.addList(&mSoundMatchingSubMaterialTablePList, + "SoundMatchingSubMaterialTable"); + const auto list = archive.getRootList().getResParameterList(2); + for (int i = 0; i < Material::size() && i < list.getResParameterObjNum(); ++i) { + const char* material_name = materialToText(i); + auto& obj = mSoundMatchingSubMaterialTable[i]; + mSoundMatchingSubMaterialTablePList.addObj(&obj, material_name); + obj.num_values = list.getResParameterObj(i).getNum(); + + for (int submat = 0; submat < obj.values.size(); ++submat) { + auto* key = new (str_heap) sead::FormatFixedSafeString<32>("submat_%d", submat); + obj.values[submat].init(sead::SafeString::cEmptyString, *key, *key, &obj); + } + } + } + + str_heap->adjust(); + mSubMaterialTablePIO.applyResParameterArchive(archive); +} + +const sead::SafeString& MaterialTable::getSubMaterial(Material material, int submat_idx) const { + return mSubMaterialTable[material].values[submat_idx].ref(); +} + +const sead::SafeString& MaterialTable::getSoundMatchingSubMaterial(Material material, + int submat_idx) const { + return mSoundMatchingSubMaterialTable[material].values[submat_idx].ref(); +} + +static int getSubMaterialIdx_(const MaterialTable::SubValues& table, Material material, + const sead::SafeString& submat_name) { + for (int i = 0; i < table.num_values; ++i) { + if (submat_name == table.values[i].ref()) + return i; + } + + if (submat_name == sead::SafeString::cEmptyString) + return 0; + + return -1; +} + +int MaterialTable::getSubMaterialIdx(Material material, const sead::SafeString& submat_name) const { + const auto& table = mSubMaterialTable[material]; + return getSubMaterialIdx_(table, material, submat_name); +} + +int MaterialTable::getSoundSubMaterialIdx(Material material, + const sead::SafeString& submat_name) const { + const auto& table = mSoundSubMaterialTable[material]; + return getSubMaterialIdx_(table, material, submat_name); +} + +int MaterialTable::getNumSubMaterials(Material material) const { + return mSubMaterialTable[material].num_values; +} + +bool MaterialTable::subMaterialHasSound(Material material, int submat_idx) const { + return getSoundSubMaterialIdx(material, getSubMaterial(material, submat_idx)) != -1; +} + +} // namespace ksys::phys |
