From 7ef5197236114f01ec05e5213f958514298292ff Mon Sep 17 00:00:00 2001 From: Narr the Reg <5944268+german77@users.noreply.github.com> Date: Sun, 15 Feb 2026 14:08:05 -0600 Subject: [PATCH 1/7] utility: Remove explicit instances of ParameterBase --- src/utility/aglParameter.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/utility/aglParameter.cpp b/src/utility/aglParameter.cpp index 83fa293..26b36a4 100644 --- a/src/utility/aglParameter.cpp +++ b/src/utility/aglParameter.cpp @@ -414,23 +414,4 @@ bool ParameterBase::makeZero() { return false; } -// TODO: Remove these explicit instantiations once ParameterBase::createByTypeName is implemented. -template class Parameter; -template class Parameter; -template class Parameter; -template class Parameter; -template class Parameter; -template class Parameter; -template class Parameter; -template class Parameter>; -template class Parameter>; -template class Parameter>; -template class Parameter; -template class Parameter; -template class Parameter; -template class ParameterCurve<1>; -template class ParameterCurve<2>; -template class ParameterCurve<3>; -template class ParameterCurve<4>; - } // namespace agl::utl From c662b46b98bcfc047be8e6fb6629d79eca6f7d8a Mon Sep 17 00:00:00 2001 From: Narr the Reg <5944268+german77@users.noreply.github.com> Date: Mon, 16 Feb 2026 11:39:25 -0600 Subject: [PATCH 2/7] utility: Implement ParemeterBase::createByTypeName --- include/utility/aglParameter.h | 14 +++++-- src/utility/aglParameter.cpp | 69 ++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/include/utility/aglParameter.h b/include/utility/aglParameter.h index 58fea02..8f1d4cb 100644 --- a/include/utility/aglParameter.h +++ b/include/utility/aglParameter.h @@ -10,6 +10,7 @@ #include #include #include +#include #include "utility/aglResParameter.h" namespace sead { @@ -102,7 +103,7 @@ class ParameterBase { void applyResource(ResParameter res, f32 t); void applyString(const sead::SafeString& string, bool x); virtual void postApplyResource_(const void*, size_t) {} - void createByTypeName(const sead::SafeString& a, const sead::SafeString& b); + ParameterBase* createByTypeName(const sead::SafeString& name, const sead::SafeString& value); virtual bool isBinary() const { return false; } virtual bool isBinaryInternalBuffer() const { return true; } @@ -302,8 +303,15 @@ class Parameter : public ParameterBase { template class ParameterBuffer : public Parameter { public: - ParameterBuffer(sead::Heap* heap, s32 num) { + ParameterBuffer(sead::Heap* heap, const sead::SafeString& elements) { SEAD_ASSERT(!isBinaryInternalBuffer()); + u32 num = sead::StringUtil::parseS32(elements, sead::StringUtil::CardinalNumber::BaseAuto); + + // TODO: Check if this can be generalized for any type + if constexpr (std::is_same()) { + num = sead::Mathf::ceil(num * 0.25f) * 4; + } + this->mValue = new (heap) T[num]; mBufferSize = num; mBufferAllocated = true; @@ -343,7 +351,7 @@ class ParameterBuffer : public Parameter { void postApplyResource_(const void* data, size_t size) override { if (isBinaryInternalBuffer()) return; - this->mValue = data; + this->mValue = const_cast(static_cast(data)); mBufferSize = size / sizeof(T); } diff --git a/src/utility/aglParameter.cpp b/src/utility/aglParameter.cpp index 26b36a4..5921d2f 100644 --- a/src/utility/aglParameter.cpp +++ b/src/utility/aglParameter.cpp @@ -414,4 +414,73 @@ bool ParameterBase::makeZero() { return false; } +// NON_MATCHING: https://decomp.me/scratch/46nZM +ParameterBase* ParameterBase::createByTypeName(const sead::SafeString& name, + const sead::SafeString& value) { + if (name.isEqual(getParameterTypeName(ParameterType::Bool))) { + return new Parameter; + } + if (name.isEqual(getParameterTypeName(ParameterType::F32))) { + return new Parameter; + } + if (name.isEqual(getParameterTypeName(ParameterType::Int))) { + return new Parameter; + } + if (name.isEqual(getParameterTypeName(ParameterType::U32))) { + return new Parameter; + } + if (name.isEqual(getParameterTypeName(ParameterType::Vec2))) { + return new Parameter; + } + if (name.isEqual(getParameterTypeName(ParameterType::Vec3))) { + return new Parameter; + } + if (name.isEqual(getParameterTypeName(ParameterType::Vec4))) { + return new Parameter; + } + if (name.isEqual(getParameterTypeName(ParameterType::Color))) { + return new Parameter; + } + if (name.isEqual(getParameterTypeName(ParameterType::Quat))) { + return new Parameter; + } + if (name.isEqual(getParameterTypeName(ParameterType::String32))) { + return new Parameter>; + } + if (name.isEqual(getParameterTypeName(ParameterType::String64))) { + return new Parameter>; + } + if (name.isEqual(getParameterTypeName(ParameterType::String256))) { + return new Parameter>; + } + if (name.isEqual(getParameterTypeName(ParameterType::StringRef))) { + return new Parameter; + } + if (name.isEqual(getParameterTypeName(ParameterType::Curve1))) { + return new ParameterCurve<1>("", "", nullptr); + } + if (name.isEqual(getParameterTypeName(ParameterType::Curve2))) { + return new ParameterCurve<2>("", "", nullptr); + } + if (name.isEqual(getParameterTypeName(ParameterType::Curve3))) { + return new ParameterCurve<3>("", "", nullptr); + } + if (name.isEqual(getParameterTypeName(ParameterType::Curve4))) { + return new ParameterCurve<4>("", "", nullptr); + } + if (name.isEqual(getParameterTypeName(ParameterType::BufferInt))) { + return new ParameterBuffer(nullptr, value); + } + if (name.isEqual(getParameterTypeName(ParameterType::BufferF32))) { + return new ParameterBuffer(nullptr, value); + } + if (name.isEqual(getParameterTypeName(ParameterType::BufferU32))) { + return new ParameterBuffer(nullptr, value); + } + if (name.isEqual(getParameterTypeName(ParameterType::BufferBinary))) { + return new ParameterBuffer(nullptr, value); + } + return nullptr; +} + } // namespace agl::utl From ac324919526c676eb4cc912dad468999854032b2 Mon Sep 17 00:00:00 2001 From: Narr the Reg <5944268+german77@users.noreply.github.com> Date: Thu, 19 Feb 2026 13:31:38 -0600 Subject: [PATCH 3/7] Fix parameter buffer initialization --- include/utility/aglParameter.h | 14 ++++---------- src/utility/aglParameter.cpp | 23 ++++++++++++++++++----- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/include/utility/aglParameter.h b/include/utility/aglParameter.h index 8f1d4cb..b95a1fc 100644 --- a/include/utility/aglParameter.h +++ b/include/utility/aglParameter.h @@ -10,7 +10,6 @@ #include #include #include -#include #include "utility/aglResParameter.h" namespace sead { @@ -303,15 +302,12 @@ class Parameter : public ParameterBase { template class ParameterBuffer : public Parameter { public: - ParameterBuffer(sead::Heap* heap, const sead::SafeString& elements) { - SEAD_ASSERT(!isBinaryInternalBuffer()); - u32 num = sead::StringUtil::parseS32(elements, sead::StringUtil::CardinalNumber::BaseAuto); + ParameterBuffer() = default; - // TODO: Check if this can be generalized for any type - if constexpr (std::is_same()) { - num = sead::Mathf::ceil(num * 0.25f) * 4; - } + ~ParameterBuffer() override { freeBuffer(); } + void allocateBuffer(sead::Heap* heap, u32 num) { + SEAD_ASSERT(!isBinaryInternalBuffer()); this->mValue = new (heap) T[num]; mBufferSize = num; mBufferAllocated = true; @@ -320,8 +316,6 @@ class ParameterBuffer : public Parameter { this->mValue[i] = {}; } - ~ParameterBuffer() override { freeBuffer(); } - void freeBuffer() { if (!mBufferAllocated) return; diff --git a/src/utility/aglParameter.cpp b/src/utility/aglParameter.cpp index 5921d2f..a88b761 100644 --- a/src/utility/aglParameter.cpp +++ b/src/utility/aglParameter.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "utility/aglParameterObj.h" #include "utility/aglParameterStringMgr.h" @@ -414,7 +415,7 @@ bool ParameterBase::makeZero() { return false; } -// NON_MATCHING: https://decomp.me/scratch/46nZM +// NON_MATCHING: https://decomp.me/scratch/wBa6H ParameterBase* ParameterBase::createByTypeName(const sead::SafeString& name, const sead::SafeString& value) { if (name.isEqual(getParameterTypeName(ParameterType::Bool))) { @@ -469,16 +470,28 @@ ParameterBase* ParameterBase::createByTypeName(const sead::SafeString& name, return new ParameterCurve<4>("", "", nullptr); } if (name.isEqual(getParameterTypeName(ParameterType::BufferInt))) { - return new ParameterBuffer(nullptr, value); + ParameterBuffer* buffer = new ParameterBuffer; + u32 num = sead::StringUtil::parseS32(value, sead::StringUtil::CardinalNumber::BaseAuto); + buffer->allocateBuffer(nullptr, num); + return buffer; } if (name.isEqual(getParameterTypeName(ParameterType::BufferF32))) { - return new ParameterBuffer(nullptr, value); + ParameterBuffer* buffer = new ParameterBuffer; + u32 num = sead::StringUtil::parseS32(value, sead::StringUtil::CardinalNumber::BaseAuto); + buffer->allocateBuffer(nullptr, num); + return buffer; } if (name.isEqual(getParameterTypeName(ParameterType::BufferU32))) { - return new ParameterBuffer(nullptr, value); + ParameterBuffer* buffer = new ParameterBuffer; + u32 num = sead::StringUtil::parseS32(value, sead::StringUtil::CardinalNumber::BaseAuto); + buffer->allocateBuffer(nullptr, num); + return buffer; } if (name.isEqual(getParameterTypeName(ParameterType::BufferBinary))) { - return new ParameterBuffer(nullptr, value); + ParameterBuffer* buffer = new ParameterBuffer; + u32 num = sead::StringUtil::parseS32(value, sead::StringUtil::CardinalNumber::BaseAuto); + buffer->allocateBuffer(nullptr, sead::Mathf::ceil(num * 0.25f) * 4); + return buffer; } return nullptr; } From f844fafbe2fc37073de7fab12af00fb86a36c438 Mon Sep 17 00:00:00 2001 From: Narr the Reg <5944268+german77@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:27:35 -0600 Subject: [PATCH 4/7] Update link --- src/utility/aglParameter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utility/aglParameter.cpp b/src/utility/aglParameter.cpp index a88b761..b5d5e9a 100644 --- a/src/utility/aglParameter.cpp +++ b/src/utility/aglParameter.cpp @@ -415,7 +415,7 @@ bool ParameterBase::makeZero() { return false; } -// NON_MATCHING: https://decomp.me/scratch/wBa6H +// NON_MATCHING: https://decomp.me/scratch/N8MEk ParameterBase* ParameterBase::createByTypeName(const sead::SafeString& name, const sead::SafeString& value) { if (name.isEqual(getParameterTypeName(ParameterType::Bool))) { From 9a3205a4e04b96f218715e4929baf49157dbe54a Mon Sep 17 00:00:00 2001 From: Narr the Reg <5944268+german77@users.noreply.github.com> Date: Wed, 25 Feb 2026 20:31:31 -0600 Subject: [PATCH 5/7] Match the function --- include/utility/aglParameter.h | 5 ++++- include/utility/aglParameterCurve.hpp | 14 ++++++++++++++ src/utility/aglParameter.cpp | 11 +++++------ 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/include/utility/aglParameter.h b/include/utility/aglParameter.h index b95a1fc..3389ada 100644 --- a/include/utility/aglParameter.h +++ b/include/utility/aglParameter.h @@ -102,7 +102,8 @@ class ParameterBase { void applyResource(ResParameter res, f32 t); void applyString(const sead::SafeString& string, bool x); virtual void postApplyResource_(const void*, size_t) {} - ParameterBase* createByTypeName(const sead::SafeString& name, const sead::SafeString& value); + static ParameterBase* createByTypeName(const sead::SafeString& name, + const sead::SafeString& value); virtual bool isBinary() const { return false; } virtual bool isBinaryInternalBuffer() const { return true; } @@ -371,6 +372,8 @@ class ParameterDirection3f : public Parameter { template class ParameterCurve : public ParameterBase { public: + ParameterCurve() { reset(); } + ParameterCurve(const sead::SafeString& name, const sead::SafeString& label, IParameterObj* param_obj); diff --git a/include/utility/aglParameterCurve.hpp b/include/utility/aglParameterCurve.hpp index de23a22..853812a 100644 --- a/include/utility/aglParameterCurve.hpp +++ b/include/utility/aglParameterCurve.hpp @@ -13,6 +13,20 @@ inline ParameterCurve::ParameterCurve(const sead::SafeString& name, reset(); } +// NOTE: This is a hack to match ParameterBase::createByTypeName. It doesn't inline using the +// general template. +template <> +inline void ParameterCurve<4>::reset() { + static f32 s_initialize[9] = {0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0, 0.5}; + for (s32 i = 0; i < 4; ++i) { + sead::MemUtil::copy(mCurveData[i].f, s_initialize, sizeof(s_initialize)); + for (s32 j = 9; j < cUnitCurveParamNum; ++j) + mCurveData[i].f[j] = 1.0; + mCurves[i].setData(&mCurveData[i], sead::hostio::CurveType::Hermit2D, cUnitCurveParamNum, + 9); + } +} + template inline void ParameterCurve::reset() { static f32 s_initialize[9] = {0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0, 0.5}; diff --git a/src/utility/aglParameter.cpp b/src/utility/aglParameter.cpp index b5d5e9a..87e561f 100644 --- a/src/utility/aglParameter.cpp +++ b/src/utility/aglParameter.cpp @@ -415,7 +415,6 @@ bool ParameterBase::makeZero() { return false; } -// NON_MATCHING: https://decomp.me/scratch/N8MEk ParameterBase* ParameterBase::createByTypeName(const sead::SafeString& name, const sead::SafeString& value) { if (name.isEqual(getParameterTypeName(ParameterType::Bool))) { @@ -458,16 +457,16 @@ ParameterBase* ParameterBase::createByTypeName(const sead::SafeString& name, return new Parameter; } if (name.isEqual(getParameterTypeName(ParameterType::Curve1))) { - return new ParameterCurve<1>("", "", nullptr); + return new ParameterCurve<1>; } if (name.isEqual(getParameterTypeName(ParameterType::Curve2))) { - return new ParameterCurve<2>("", "", nullptr); + return new ParameterCurve<2>; } if (name.isEqual(getParameterTypeName(ParameterType::Curve3))) { - return new ParameterCurve<3>("", "", nullptr); + return new ParameterCurve<3>; } if (name.isEqual(getParameterTypeName(ParameterType::Curve4))) { - return new ParameterCurve<4>("", "", nullptr); + return new ParameterCurve<4>; } if (name.isEqual(getParameterTypeName(ParameterType::BufferInt))) { ParameterBuffer* buffer = new ParameterBuffer; @@ -490,7 +489,7 @@ ParameterBase* ParameterBase::createByTypeName(const sead::SafeString& name, if (name.isEqual(getParameterTypeName(ParameterType::BufferBinary))) { ParameterBuffer* buffer = new ParameterBuffer; u32 num = sead::StringUtil::parseS32(value, sead::StringUtil::CardinalNumber::BaseAuto); - buffer->allocateBuffer(nullptr, sead::Mathf::ceil(num * 0.25f) * 4); + buffer->allocateBuffer(nullptr, (u32)sead::Mathf::ceil(num * 0.25f) * 4); return buffer; } return nullptr; From 541bc5efcab86072adf97dbc66555b0336a9c8e4 Mon Sep 17 00:00:00 2001 From: Narr the Reg <5944268+german77@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:06:13 -0600 Subject: [PATCH 6/7] Solve signed warnings --- include/utility/aglParameter.h | 2 +- include/utility/aglParameterCurve.hpp | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/utility/aglParameter.h b/include/utility/aglParameter.h index 3389ada..9d97dff 100644 --- a/include/utility/aglParameter.h +++ b/include/utility/aglParameter.h @@ -313,7 +313,7 @@ class ParameterBuffer : public Parameter { mBufferSize = num; mBufferAllocated = true; - for (s32 i = 0; i < num; ++i) + for (u32 i = 0; i < num; ++i) this->mValue[i] = {}; } diff --git a/include/utility/aglParameterCurve.hpp b/include/utility/aglParameterCurve.hpp index 853812a..b6a2919 100644 --- a/include/utility/aglParameterCurve.hpp +++ b/include/utility/aglParameterCurve.hpp @@ -18,9 +18,9 @@ inline ParameterCurve::ParameterCurve(const sead::SafeString& name, template <> inline void ParameterCurve<4>::reset() { static f32 s_initialize[9] = {0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0, 0.5}; - for (s32 i = 0; i < 4; ++i) { + for (u32 i = 0; i < 4; ++i) { sead::MemUtil::copy(mCurveData[i].f, s_initialize, sizeof(s_initialize)); - for (s32 j = 9; j < cUnitCurveParamNum; ++j) + for (u32 j = 9; j < cUnitCurveParamNum; ++j) mCurveData[i].f[j] = 1.0; mCurves[i].setData(&mCurveData[i], sead::hostio::CurveType::Hermit2D, cUnitCurveParamNum, 9); @@ -30,9 +30,9 @@ inline void ParameterCurve<4>::reset() { template inline void ParameterCurve::reset() { static f32 s_initialize[9] = {0.0, 0.0, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0, 0.5}; - for (s32 i = 0; i < N; ++i) { + for (u32 i = 0; i < N; ++i) { sead::MemUtil::copy(mCurveData[i].f, s_initialize, sizeof(s_initialize)); - for (s32 j = 9; j < cUnitCurveParamNum; ++j) + for (u32 j = 9; j < cUnitCurveParamNum; ++j) mCurveData[i].f[j] = 1.0; mCurves[i].setData(&mCurveData[i], sead::hostio::CurveType::Hermit2D, cUnitCurveParamNum, 9); @@ -59,7 +59,7 @@ inline void ParameterCurve::copyUnsafe(const ParameterBase& other) { } sead::MemUtil::copy(ptr(), other.ptr(), size()); - for (s32 i = 0; i < N; ++i) { + for (u32 i = 0; i < N; ++i) { auto& curve = mCurves[i]; auto& curve_other = static_cast&>(other).mCurves[i]; curve.setCurveType(curve_other.getCurveType()); @@ -91,14 +91,14 @@ inline ParameterBase* ParameterCurve::clone(sead::Heap* heap, IParameterObj* template inline void ParameterCurve::postApplyResource_(const void*, size_t size) { if (this->size() == size) { - for (s32 i = 0; i < N; ++i) { + for (u32 i = 0; i < N; ++i) { mCurves[i].setCurveType(sead::hostio::CurveType(mCurveData[i].curveType)); mCurves[i].mFloats = mCurveData[i].f; mCurves[i].mInfo.numFloats = cUnitCurveParamNum; mCurves[i].setNumUse(mCurveData[i].numUse); } } else { - for (s32 i = 0; i < N; ++i) { + for (u32 i = 0; i < N; ++i) { mCurves[i].mInfo.numFloats = cUnitCurveParamNum; mCurves[i].mFloats = mCurveData[i].f; } From 132d064419c190c90af22348f006140953a0dc6f Mon Sep 17 00:00:00 2001 From: Narr the Reg <5944268+german77@users.noreply.github.com> Date: Tue, 17 Mar 2026 10:28:32 -0600 Subject: [PATCH 7/7] First review --- include/utility/aglParameter.h | 2 +- src/utility/aglParameter.cpp | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/utility/aglParameter.h b/include/utility/aglParameter.h index 9d97dff..60963e7 100644 --- a/include/utility/aglParameter.h +++ b/include/utility/aglParameter.h @@ -103,7 +103,7 @@ class ParameterBase { void applyString(const sead::SafeString& string, bool x); virtual void postApplyResource_(const void*, size_t) {} static ParameterBase* createByTypeName(const sead::SafeString& name, - const sead::SafeString& value); + const sead::SafeString& bufferSize); virtual bool isBinary() const { return false; } virtual bool isBinaryInternalBuffer() const { return true; } diff --git a/src/utility/aglParameter.cpp b/src/utility/aglParameter.cpp index 87e561f..c933573 100644 --- a/src/utility/aglParameter.cpp +++ b/src/utility/aglParameter.cpp @@ -416,7 +416,7 @@ bool ParameterBase::makeZero() { } ParameterBase* ParameterBase::createByTypeName(const sead::SafeString& name, - const sead::SafeString& value) { + const sead::SafeString& bufferSize) { if (name.isEqual(getParameterTypeName(ParameterType::Bool))) { return new Parameter; } @@ -470,26 +470,30 @@ ParameterBase* ParameterBase::createByTypeName(const sead::SafeString& name, } if (name.isEqual(getParameterTypeName(ParameterType::BufferInt))) { ParameterBuffer* buffer = new ParameterBuffer; - u32 num = sead::StringUtil::parseS32(value, sead::StringUtil::CardinalNumber::BaseAuto); - buffer->allocateBuffer(nullptr, num); + u32 size = + sead::StringUtil::parseS32(bufferSize, sead::StringUtil::CardinalNumber::BaseAuto); + buffer->allocateBuffer(nullptr, size); return buffer; } if (name.isEqual(getParameterTypeName(ParameterType::BufferF32))) { ParameterBuffer* buffer = new ParameterBuffer; - u32 num = sead::StringUtil::parseS32(value, sead::StringUtil::CardinalNumber::BaseAuto); - buffer->allocateBuffer(nullptr, num); + u32 size = + sead::StringUtil::parseS32(bufferSize, sead::StringUtil::CardinalNumber::BaseAuto); + buffer->allocateBuffer(nullptr, size); return buffer; } if (name.isEqual(getParameterTypeName(ParameterType::BufferU32))) { ParameterBuffer* buffer = new ParameterBuffer; - u32 num = sead::StringUtil::parseS32(value, sead::StringUtil::CardinalNumber::BaseAuto); - buffer->allocateBuffer(nullptr, num); + u32 size = + sead::StringUtil::parseS32(bufferSize, sead::StringUtil::CardinalNumber::BaseAuto); + buffer->allocateBuffer(nullptr, size); return buffer; } if (name.isEqual(getParameterTypeName(ParameterType::BufferBinary))) { ParameterBuffer* buffer = new ParameterBuffer; - u32 num = sead::StringUtil::parseS32(value, sead::StringUtil::CardinalNumber::BaseAuto); - buffer->allocateBuffer(nullptr, (u32)sead::Mathf::ceil(num * 0.25f) * 4); + u32 size = + sead::StringUtil::parseS32(bufferSize, sead::StringUtil::CardinalNumber::BaseAuto); + buffer->allocateBuffer(nullptr, (u32)sead::Mathf::ceil(size * 0.25f) * 4); return buffer; } return nullptr;