diff options
| author | Léo Lam <leo@leolam.fr> | 2021-12-30 00:39:17 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2022-01-03 23:53:40 +0100 |
| commit | eb16cbaf55931853533d4e0ed2c71e643bc54c33 (patch) | |
| tree | 9efe14bece5cd25dd801c79328f41b93002c1966 /src/KingSystem/Physics/System/physMaterialMask.cpp | |
| parent | 75a270118adfc1e4838cd776a8b2adb11dad06f0 (diff) | |
ksys/phys: Add MaterialMask
Diffstat (limited to 'src/KingSystem/Physics/System/physMaterialMask.cpp')
| -rw-r--r-- | src/KingSystem/Physics/System/physMaterialMask.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/KingSystem/Physics/System/physMaterialMask.cpp b/src/KingSystem/Physics/System/physMaterialMask.cpp new file mode 100644 index 00000000..9a2072a6 --- /dev/null +++ b/src/KingSystem/Physics/System/physMaterialMask.cpp @@ -0,0 +1,80 @@ +#include "KingSystem/Physics/System/physMaterialMask.h" +#include "KingSystem/Physics/System/physMaterialTable.h" +#include "KingSystem/Physics/System/physMemSystem.h" + +namespace ksys::phys { + +MaterialMask::MaterialMask() = default; + +MaterialMask::MaterialMask(MaterialMaskData data) : mData(data) {} + +MaterialMask::MaterialMask(Material mat, FloorCode floor, WallCode wall, bool flag) { + mData.material.Init(mat); + mData.floor.Init(floor); + mData.wall.Init(wall); + mData.setFlag(flag); +} + +MaterialMask::MaterialMask(Material mat, const char* submat_name, FloorCode floor, WallCode wall, + bool flag) + : mSubMaterialNameCache(submat_name) { + auto submat_idx = getSubMaterialIdx(mat, submat_name); + if (!MaterialMaskData::isValidSubMaterialIdx(submat_idx)) + submat_idx = 0; + mData.raw = {}; + mData.material.Init(mat); + mData.sub_material.Init(submat_idx); + mData.floor.Init(floor); + mData.wall.Init(wall); + mData.setFlag(flag); +} + +MaterialMask::MaterialMask(Material mat, int submat_idx, FloorCode floor, WallCode wall, bool flag) + : mSubMaterialNameCache(getSubMaterialName(mat, submat_idx).cstr()) { + mData.raw = {}; + mData.material.Init(mat); + mData.sub_material.Init(submat_idx); + mData.floor.Init(floor); + mData.wall.Init(wall); + mData.setFlag(flag); +} + +MaterialMask::~MaterialMask() = default; + +const char* MaterialMask::getMaterialName() const { + const Material material = getMaterial(); + if (isInvalidMaterial(material.value())) + return "Incorrent"; // sic + return materialToText(material); +} + +const char* MaterialMask::getSubMaterialName() const { + if (mSubMaterialNameCache != nullptr) + return mSubMaterialNameCache; + + mSubMaterialNameCache = getSubMaterialName(getMaterial(), getSubMaterialIdx()).cstr(); + return mSubMaterialNameCache; +} + +int MaterialMask::getSubMaterialIdx(Material mat, const sead::SafeString& submat_name) { + return MemSystem::instance()->getMaterialTable()->getSubMaterialIdx(mat, submat_name); +} + +const sead::SafeString& MaterialMask::getSubMaterialName(Material mat, int submat_idx) { + return MemSystem::instance()->getMaterialTable()->getSubMaterial(mat, submat_idx); +} + +int MaterialMask::getNumSubMaterials(Material mat) { + return MemSystem::instance()->getMaterialTable()->getNumSubMaterials(mat); +} + +const sead::SafeString& MaterialMask::getSubMaterialName(int mat, int submat_idx) { + return getSubMaterialName(Material(mat), submat_idx); +} + +void MaterialMask::setMaterial(Material mat) { + mData.material = {}; + mData.material.SetUnsafe(mat); +} + +} // namespace ksys::phys |
