From da63feb111ea145e33be6d6bf108e6d8f559e77b Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 21 Aug 2025 12:16:10 +0200 Subject: Fix a bunch of splits and implement LayoutArc/ObjectArcControl --- src/toBeSorted/arc_managers/layout_arc_manager.cpp | 66 +++++++++++++++++++++- src/toBeSorted/arc_managers/oarc_manager.cpp | 49 ++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/toBeSorted/arc_managers/layout_arc_manager.cpp b/src/toBeSorted/arc_managers/layout_arc_manager.cpp index ce329680..091fe504 100644 --- a/src/toBeSorted/arc_managers/layout_arc_manager.cpp +++ b/src/toBeSorted/arc_managers/layout_arc_manager.cpp @@ -2,7 +2,6 @@ #include "d/d_heap.h" - LayoutArcManager *LayoutArcManager::sInstance; LayoutArcManager::LayoutArcManager() { @@ -57,3 +56,68 @@ bool LayoutArcManager::create(EGG::Heap *heap) { GetInstance()->init(heap); return true; } + +LayoutArcControl::~LayoutArcControl() { + if (mLayoutArcs != nullptr) { + release(); + } +} + +void LayoutArcControl::set(const char *const *layoutArcs, s32 numArcs) { + mLayoutArcs = layoutArcs; + mNumArcs = numArcs; +} + +bool LayoutArcControl::load(EGG::Heap *heap) const { + if (mLayoutArcs == nullptr) { + return true; + } + + const char *const *ptr = mLayoutArcs; + for (int i = 0; i < mNumArcs; i++) { + LayoutArcManager::GetInstance()->loadLayoutArcFromDisk(*ptr, heap); + ptr++; + } + + return true; +} + +bool LayoutArcControl::allLoaded() const { + if (mLayoutArcs == nullptr) { + return true; + } + + const char *const *ptr = mLayoutArcs; + for (int i = 0; i < mNumArcs; i++) { + dArcResult_e res = LayoutArcManager::GetInstance()->ensureLoaded1(*ptr); + if (res != D_ARC_RESULT_OK) { + return false; + } + ptr++; + } + return true; +} + +bool LayoutArcControl::release() { + if (mLayoutArcs == nullptr) { + return true; + } + + const char *const *ptr = mLayoutArcs; + for (int i = 0; i < mNumArcs; i++) { + dArcResult_e res = LayoutArcManager::GetInstance()->ensureLoaded2(*ptr); + if (res != D_ARC_RESULT_ERROR_NOT_FOUND && res != D_ARC_RESULT_OK) { + return false; + } + ptr++; + } + + ptr = mLayoutArcs; + for (int i = 0; i < mNumArcs; i++) { + LayoutArcManager::GetInstance()->decrement(*ptr); + ptr++; + } + mLayoutArcs = nullptr; + + return true; +} diff --git a/src/toBeSorted/arc_managers/oarc_manager.cpp b/src/toBeSorted/arc_managers/oarc_manager.cpp index 784f88db..aa284e3f 100644 --- a/src/toBeSorted/arc_managers/oarc_manager.cpp +++ b/src/toBeSorted/arc_managers/oarc_manager.cpp @@ -89,3 +89,52 @@ bool OarcManager::create(EGG::Heap *heap) { GetInstance()->init(heap); return true; } + +ObjectArcControl::~ObjectArcControl() { + if (mObjectArcs != nullptr) { + release(); + } +} + +void ObjectArcControl::set(const char *const *objectArcs, s32 numArcs) { + mObjectArcs = objectArcs; + mNumArcs = numArcs; +} + +bool ObjectArcControl::load(EGG::Heap *heap) const { + if (mObjectArcs == nullptr) { + return true; + } + + const char *const *ptr = mObjectArcs; + for (int i = 0; i < mNumArcs; i++) { + OarcManager::GetInstance()->loadObjectArcFromDisk(*ptr, heap); + ptr++; + } + + return true; +} + +bool ObjectArcControl::release() { + if (mObjectArcs == nullptr) { + return true; + } + + const char *const *ptr = mObjectArcs; + for (int i = 0; i < mNumArcs; i++) { + dArcResult_e res = OarcManager::GetInstance()->ensureLoaded2(*ptr); + if (res != D_ARC_RESULT_ERROR_NOT_FOUND && res != D_ARC_RESULT_OK) { + return false; + } + ptr++; + } + + ptr = mObjectArcs; + for (int i = 0; i < mNumArcs; i++) { + OarcManager::GetInstance()->decrement(*ptr); + ptr++; + } + mObjectArcs = nullptr; + + return true; +} -- cgit v1.2.3