mirror of https://github.com/zeldaret/botw.git
gsys: Add Model, ModelAccessKey and ModelUnit stubs
This commit is contained in:
parent
6ce04bccaa
commit
9d02ca33d8
|
@ -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
|
||||
)
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue