mirror of
https://github.com/zeldaret/botw
synced 2026-08-17 21:13:01 -04:00
ksys/res: Implement EntryFactory (base class and template)
Also adds a heap-related function that's used by EntryFactory (and many other functions)
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
#include "KingSystem/Resource/resEntryFactory.h"
|
||||
|
||||
namespace ksys::res {
|
||||
|
||||
static EntryFactory<Resource> sDefaultEntryFactory;
|
||||
|
||||
u32 EntryFactoryBase::getResourceSize() const {
|
||||
KSYS_CHECK_SIZE_NX150(sead::DirectResource, 0x20);
|
||||
return sizeof(sead::DirectResource);
|
||||
}
|
||||
|
||||
u32 EntryFactoryBase::getLoadDataAlignment() const {
|
||||
return sizeof(void*);
|
||||
}
|
||||
|
||||
EntryFactory<Resource>& getDefaultResourceFactory() {
|
||||
return sDefaultEntryFactory;
|
||||
}
|
||||
|
||||
} // namespace ksys::res
|
||||
@@ -0,0 +1,53 @@
|
||||
#pragma once
|
||||
|
||||
#include <basis/seadNew.h>
|
||||
#include <heap/seadHeapMgr.h>
|
||||
#include <resource/seadResource.h>
|
||||
#include "KingSystem/Resource/resResource.h"
|
||||
#include "KingSystem/Utils/HeapUtil.h"
|
||||
#include "KingSystem/Utils/Types.h"
|
||||
|
||||
namespace ksys::res {
|
||||
|
||||
class EntryFactoryBase : public sead::DirectResourceFactoryBase {
|
||||
SEAD_RTTI_OVERRIDE(EntryFactoryBase, sead::DirectResourceFactoryBase)
|
||||
public:
|
||||
explicit EntryFactoryBase(f32 size_multiplier = 1.0, u32 size_constant = 0)
|
||||
: mSizeMultiplier(size_multiplier), mSizeConstant(size_constant) {}
|
||||
~EntryFactoryBase() override { ; }
|
||||
|
||||
virtual u32 getResourceSize() const;
|
||||
virtual u32 getLoadDataAlignment() const;
|
||||
|
||||
f32 getSizeMultiplier() const { return mSizeMultiplier; }
|
||||
u32 getSizeConstant() const { return mSizeConstant; }
|
||||
|
||||
protected:
|
||||
f32 mSizeMultiplier;
|
||||
u32 mSizeConstant;
|
||||
};
|
||||
KSYS_CHECK_SIZE_NX150(EntryFactoryBase, 0x80);
|
||||
|
||||
template <typename T>
|
||||
class EntryFactory : public EntryFactoryBase {
|
||||
SEAD_RTTI_OVERRIDE(EntryFactory<T>, EntryFactoryBase)
|
||||
public:
|
||||
using EntryFactoryBase::EntryFactoryBase;
|
||||
|
||||
u32 getResourceSize() const override { return sizeof(T); }
|
||||
u32 getLoadDataAlignment() const override { return T::cLoadDataAlignment; }
|
||||
|
||||
T* newResource_(sead::Heap* heap_, s32 alignment) override {
|
||||
sead::Heap* heap = util::getHeapOrCurrentHeap(heap_);
|
||||
sead::ScopedCurrentHeapSetter setter{heap};
|
||||
return new (heap, alignment, std::nothrow_t{}) T{};
|
||||
}
|
||||
|
||||
protected:
|
||||
// XXX: What is this used for?
|
||||
T mResource;
|
||||
};
|
||||
|
||||
EntryFactory<Resource>& getDefaultResourceFactory();
|
||||
|
||||
} // namespace ksys::res
|
||||
@@ -34,6 +34,8 @@ public:
|
||||
bool finishParsing();
|
||||
bool m7();
|
||||
|
||||
static constexpr size_t cLoadDataAlignment = 4;
|
||||
|
||||
protected:
|
||||
virtual void onDestroy_() {}
|
||||
virtual bool parse_(u8* data, size_t size, sead::Heap* heap);
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
#include "KingSystem/Utils/HeapUtil.h"
|
||||
#include <heap/seadHeapMgr.h>
|
||||
#include <thread/seadThread.h>
|
||||
|
||||
namespace ksys::util {
|
||||
|
||||
sead::Heap* getHeapOrCurrentHeap(sead::Heap* heap) {
|
||||
if (heap)
|
||||
return heap;
|
||||
|
||||
if (!sead::ThreadMgr::instance())
|
||||
return nullptr;
|
||||
|
||||
return sead::HeapMgr::instance()->getCurrentHeap();
|
||||
}
|
||||
|
||||
} // namespace ksys::util
|
||||
@@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
#include <basis/seadTypes.h>
|
||||
|
||||
namespace sead {
|
||||
class Heap;
|
||||
}
|
||||
|
||||
namespace ksys::util {
|
||||
|
||||
/// Returns the specified heap if it is not null. Otherwise, this returns the current heap.
|
||||
sead::Heap* getHeapOrCurrentHeap(sead::Heap* heap);
|
||||
|
||||
} // namespace ksys::util
|
||||
Reference in New Issue
Block a user