summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/gsys/CMakeLists.txt6
-rw-r--r--lib/gsys/include/gsys/gsysModel.h53
-rw-r--r--lib/gsys/include/gsys/gsysModelAccessKey.h58
-rw-r--r--lib/gsys/include/gsys/gsysModelNW.h15
-rw-r--r--lib/gsys/include/gsys/gsysModelUnit.h17
-rw-r--r--lib/gsys/src/gsys/gsysModelAccessKey.cpp61
6 files changed, 210 insertions, 0 deletions
diff --git a/lib/gsys/CMakeLists.txt b/lib/gsys/CMakeLists.txt
index 1c8707f4..f6ec27a6 100644
--- a/lib/gsys/CMakeLists.txt
+++ b/lib/gsys/CMakeLists.txt
@@ -1,8 +1,14 @@
project(gsys CXX ASM)
add_library(gsys OBJECT
+ include/gsys/gsysModel.h
+ include/gsys/gsysModelAccessKey.h
+ include/gsys/gsysModelNW.h
+ include/gsys/gsysModelUnit.h
include/gsys/gsysORUtil.h
include/gsys/gsysParticleConfig.h
+
+ src/gsys/gsysModelAccessKey.cpp
src/gsys/gsysParticleConfig.cpp
)
diff --git a/lib/gsys/include/gsys/gsysModel.h b/lib/gsys/include/gsys/gsysModel.h
new file mode 100644
index 00000000..b666b159
--- /dev/null
+++ b/lib/gsys/include/gsys/gsysModel.h
@@ -0,0 +1,53 @@
+#pragma once
+
+#include <basis/seadTypes.h>
+#include <container/seadBuffer.h>
+#include <container/seadPtrArray.h>
+#include <heap/seadDisposer.h>
+#include <hostio/seadHostIONode.h>
+#include <thread/seadCriticalSection.h>
+
+namespace gsys {
+
+class IModelAccesssHandle;
+class ModelBone;
+class ModelUnit;
+
+class ModelInfo {
+public:
+ ModelUnit* mModelUnit;
+ void* _8;
+ void* _10;
+ u32 _18;
+ s16 mAccessIndex;
+ u8 _1e;
+ void* _20;
+ void* _28;
+ u32 _30;
+ u32 _34;
+};
+
+// TODO
+class Model : public sead::IDisposer, public sead::hostio::Node {
+public:
+ Model();
+ ~Model() override;
+
+ sead::PtrArray<ModelInfo>& getUnits() { return mUnitAccess; }
+ const sead::PtrArray<ModelInfo>& getUnits() const { return mUnitAccess; }
+
+ // For internal use.
+ void add_(IModelAccesssHandle* handle) const;
+ void remove_(IModelAccesssHandle* handle) const;
+ sead::CriticalSection& getCS() const { return mCS; }
+
+private:
+ sead::Buffer<ModelInfo> mUnitPool;
+ /// Indices into this array are called "model unit access indices".
+ sead::PtrArray<ModelInfo> mUnitAccess;
+ u8 _48[0x140 - 0x48];
+ mutable sead::CriticalSection mCS;
+ u8 _180[0x2b8 - 0x180];
+};
+
+} // namespace gsys
diff --git a/lib/gsys/include/gsys/gsysModelAccessKey.h b/lib/gsys/include/gsys/gsysModelAccessKey.h
new file mode 100644
index 00000000..a6015ac7
--- /dev/null
+++ b/lib/gsys/include/gsys/gsysModelAccessKey.h
@@ -0,0 +1,58 @@
+#pragma once
+
+#include <container/seadListImpl.h>
+#include <prim/seadSafeString.h>
+
+namespace gsys {
+
+class Model;
+
+// sic: this should be called IModelAccessHandle
+class IModelAccesssHandle {
+public:
+ IModelAccesssHandle();
+ virtual ~IModelAccesssHandle();
+
+ bool search(const Model* p_model, const sead::SafeString& name);
+ bool search();
+ void remove();
+
+ static constexpr size_t getListNodeOffset() { return offsetof(IModelAccesssHandle, mListNode); }
+
+protected:
+ virtual bool searchImpl_() = 0;
+ virtual void removeImpl_() = 0;
+
+ sead::SafeString mName = sead::SafeString::cEmptyString;
+ const Model* mModel{};
+ sead::ListNode mListNode;
+};
+
+struct BoneAccessKey {
+ BoneAccessKey() { reset(); }
+
+ void reset() {
+ model_unit_index = -1;
+ bone_index = -1;
+ }
+
+ s16 model_unit_index{};
+ s16 bone_index{};
+};
+
+class BoneAccessKeyEx : public IModelAccesssHandle {
+public:
+ BoneAccessKeyEx();
+ ~BoneAccessKeyEx() override;
+
+ using IModelAccesssHandle::search;
+ bool search(const Model* p_model, const BoneAccessKey& key);
+
+protected:
+ bool searchImpl_() override;
+ void removeImpl_() override;
+
+ BoneAccessKey mKey;
+};
+
+} // namespace gsys
diff --git a/lib/gsys/include/gsys/gsysModelNW.h b/lib/gsys/include/gsys/gsysModelNW.h
new file mode 100644
index 00000000..5f0afbb7
--- /dev/null
+++ b/lib/gsys/include/gsys/gsysModelNW.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <gsys/gsysModelUnit.h>
+
+namespace gsys {
+
+// XXX: bad name. This doesn't reflect the fact that ModelNW is a ModelUnit, not a Model.
+// TODO
+class ModelNW : public ModelUnit,
+ public nn::g3d::ICalculateWorldCallback,
+ public sead::hostio::Node {
+ SEAD_RTTI_OVERRIDE(ModelNW, ModelUnit)
+};
+
+} // namespace gsys
diff --git a/lib/gsys/include/gsys/gsysModelUnit.h b/lib/gsys/include/gsys/gsysModelUnit.h
new file mode 100644
index 00000000..b38210cf
--- /dev/null
+++ b/lib/gsys/include/gsys/gsysModelUnit.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include <hostio/seadHostIONode.h>
+#include <nn/g3d/World.h>
+#include <prim/seadRuntimeTypeInfo.h>
+
+namespace gsys {
+
+// TODO
+class ModelUnit {
+ SEAD_RTTI_BASE(ModelUnit)
+public:
+ ModelUnit();
+ virtual ~ModelUnit();
+};
+
+} // namespace gsys
diff --git a/lib/gsys/src/gsys/gsysModelAccessKey.cpp b/lib/gsys/src/gsys/gsysModelAccessKey.cpp
new file mode 100644
index 00000000..065aee05
--- /dev/null
+++ b/lib/gsys/src/gsys/gsysModelAccessKey.cpp
@@ -0,0 +1,61 @@
+#include "gsys/gsysModelAccessKey.h"
+#include <basis/seadRawPrint.h>
+#include <prim/seadMemUtil.h>
+#include <prim/seadScopedLock.h>
+#include "gsys/gsysModel.h"
+
+namespace gsys {
+
+IModelAccesssHandle::IModelAccesssHandle() = default;
+
+IModelAccesssHandle::~IModelAccesssHandle() {
+ ;
+}
+
+bool IModelAccesssHandle::search(const Model* p_model, const sead::SafeString& name) {
+ SEAD_ASSERT(p_model != nullptr);
+ SEAD_ASSERT_MSG(!sead::MemUtil::isStack(name.cstr()), "String[%s] is on stack.", name.cstr());
+
+ if (mModel != p_model) {
+ remove();
+ p_model->add_(this);
+ mModel = p_model;
+ }
+
+ mName = name;
+ return search();
+}
+
+void IModelAccesssHandle::remove() {
+ if (!mModel)
+ return;
+
+ auto lock = sead::makeScopedLock(mModel->getCS());
+ if (!mListNode.isLinked())
+ return;
+
+ SEAD_ASSERT(mModel != nullptr);
+ mModel->remove_(this);
+ mModel = nullptr;
+ removeImpl_();
+}
+
+bool IModelAccesssHandle::search() {
+ if (!mListNode.isLinked())
+ return false;
+
+ SEAD_ASSERT(mModel != nullptr);
+ return searchImpl_();
+}
+
+BoneAccessKeyEx::BoneAccessKeyEx() = default;
+
+BoneAccessKeyEx::~BoneAccessKeyEx() {
+ remove();
+}
+
+void BoneAccessKeyEx::removeImpl_() {
+ mKey.reset();
+}
+
+} // namespace gsys