gsys: Add Model, ModelAccessKey and ModelUnit stubs

This commit is contained in:
Léo Lam 2022-03-31 12:48:14 +02:00
parent 6ce04bccaa
commit 9d02ca33d8
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
6 changed files with 210 additions and 0 deletions

View File

@ -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
)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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