From 9d02ca33d84d44f9fb9fa7c7728d4e3386b83093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Thu, 31 Mar 2022 12:48:14 +0200 Subject: [PATCH] gsys: Add Model, ModelAccessKey and ModelUnit stubs --- lib/gsys/CMakeLists.txt | 6 +++ lib/gsys/include/gsys/gsysModel.h | 53 +++++++++++++++++++ lib/gsys/include/gsys/gsysModelAccessKey.h | 58 ++++++++++++++++++++ lib/gsys/include/gsys/gsysModelNW.h | 15 ++++++ lib/gsys/include/gsys/gsysModelUnit.h | 17 ++++++ lib/gsys/src/gsys/gsysModelAccessKey.cpp | 61 ++++++++++++++++++++++ 6 files changed, 210 insertions(+) create mode 100644 lib/gsys/include/gsys/gsysModel.h create mode 100644 lib/gsys/include/gsys/gsysModelAccessKey.h create mode 100644 lib/gsys/include/gsys/gsysModelNW.h create mode 100644 lib/gsys/include/gsys/gsysModelUnit.h create mode 100644 lib/gsys/src/gsys/gsysModelAccessKey.cpp 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 +#include +#include +#include +#include +#include + +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& getUnits() { return mUnitAccess; } + const sead::PtrArray& 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 mUnitPool; + /// Indices into this array are called "model unit access indices". + sead::PtrArray 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 +#include + +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 + +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 +#include +#include + +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 +#include +#include +#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