summaryrefslogtreecommitdiff
path: root/src/KingSystem/Physics/physMaterialMask.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/KingSystem/Physics/physMaterialMask.cpp')
-rw-r--r--src/KingSystem/Physics/physMaterialMask.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/KingSystem/Physics/physMaterialMask.cpp b/src/KingSystem/Physics/physMaterialMask.cpp
new file mode 100644
index 00000000..365248fa
--- /dev/null
+++ b/src/KingSystem/Physics/physMaterialMask.cpp
@@ -0,0 +1,80 @@
+#include "KingSystem/Physics/physMaterialMask.h"
+#include "KingSystem/Physics/System/physMaterialTable.h"
+#include "KingSystem/Physics/System/physSystem.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 System::instance()->getMaterialTable()->getSubMaterialIdx(mat, submat_name);
+}
+
+const sead::SafeString& MaterialMask::getSubMaterialName(Material mat, int submat_idx) {
+ return System::instance()->getMaterialTable()->getSubMaterial(mat, submat_idx);
+}
+
+int MaterialMask::getNumSubMaterials(Material mat) {
+ return System::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