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)
|
project(gsys CXX ASM)
|
||||||
|
|
||||||
add_library(gsys OBJECT
|
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/gsysORUtil.h
|
||||||
include/gsys/gsysParticleConfig.h
|
include/gsys/gsysParticleConfig.h
|
||||||
|
|
||||||
|
src/gsys/gsysModelAccessKey.cpp
|
||||||
src/gsys/gsysParticleConfig.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