mirror of https://github.com/zeldaret/botw.git
ksys/res: Implement AS
This commit is contained in:
parent
49a96d9e62
commit
6e08ff5029
|
|
@ -91478,28 +91478,28 @@
|
|||
0x00000071011aac00,ResourceAiprog::m1,92,_ZThn632_NK4ksys3res9AIProgram18getRuntimeTypeInfoEv
|
||||
0x00000071011aac5c,ResourceAiprog::needsParse,8,_ZThn632_NK4ksys3res9AIProgram10needsParseEv
|
||||
0x00000071011aac64,sub_71011AAC64,372,_ZN4ksys3res9AIProgram33checkDerivedRuntimeTypeInfoStaticEPKN4sead15RuntimeTypeInfo9InterfaceE
|
||||
0x00000071011aadd8,sub_71011AADD8,364,
|
||||
0x00000071011aaf44,sub_71011AAF44,140,
|
||||
0x00000071011aafd0,sub_71011AAFD0,136,
|
||||
0x00000071011ab058,sub_71011AB058,144,
|
||||
0x00000071011ab0e8,sub_71011AB0E8,140,
|
||||
0x00000071011ab174,sub_71011AB174,136,
|
||||
0x00000071011ab1fc,sub_71011AB1FC,144,
|
||||
0x00000071011ab28c,nullsub_4620,4,
|
||||
0x00000071011ab290,nullsub_4621,4,
|
||||
0x00000071011ab294,sub_71011AB294,1992,
|
||||
0x00000071011aba5c,_ZN3agl3g3d15MaterialAnimObj13GetResTextureEPN2nn3g3d15MaterialAnimObjEi,28,
|
||||
0x00000071011aba78,sub_71011ABA78,8,
|
||||
0x00000071011aba80,sub_71011ABA80,104,
|
||||
0x00000071011abae8,sub_71011ABAE8,104,
|
||||
0x00000071011abb50,sub_71011ABB50,92,
|
||||
0x00000071011abbac,sub_71011ABBAC,8,
|
||||
0x00000071011abbb4,sub_71011ABBB4,92,
|
||||
0x00000071011abc10,sub_71011ABC10,8,
|
||||
0x00000071011abc18,sub_71011ABC18,8,
|
||||
0x00000071011abc20,sub_71011ABC20,92,
|
||||
0x00000071011abc7c,sub_71011ABC7C,8,
|
||||
0x00000071011abc84,sub_71011ABC84,372,
|
||||
0x00000071011aadd8,sub_71011AADD8,364,_ZN4ksys3res2ASC1Ev
|
||||
0x00000071011aaf44,sub_71011AAF44,140,_ZN4ksys3res2ASD1Ev
|
||||
0x00000071011aafd0,sub_71011AAFD0,136,_ZThn632_N4ksys3res2ASD1Ev
|
||||
0x00000071011ab058,sub_71011AB058,144,_ZThn664_N4ksys3res2ASD1Ev
|
||||
0x00000071011ab0e8,sub_71011AB0E8,140,_ZN4ksys3res2ASD0Ev
|
||||
0x00000071011ab174,sub_71011AB174,136,_ZThn632_N4ksys3res2ASD0Ev
|
||||
0x00000071011ab1fc,sub_71011AB1FC,144,_ZThn664_N4ksys3res2ASD0Ev
|
||||
0x00000071011ab28c,nullsub_4620,4,_ZN4ksys3res2AS9doCreate_EPhjPN4sead4HeapE
|
||||
0x00000071011ab290,nullsub_4621,4,_ZThn632_N4ksys3res2AS9doCreate_EPhjPN4sead4HeapE
|
||||
0x00000071011ab294,sub_71011AB294,1992,_ZN4ksys3res2AS6parse_EPhmPN4sead4HeapE?
|
||||
0x00000071011aba5c,xxx,28,_ZNK4ksys3res2AS16getFirstResourceEv
|
||||
0x00000071011aba78,sub_71011ABA78,8,_ZThn632_N4ksys3res2AS6parse_EPhmPN4sead4HeapE
|
||||
0x00000071011aba80,sub_71011ABA80,104,_ZN4ksys3res2AS9finalize_Ev
|
||||
0x00000071011abae8,sub_71011ABAE8,104,_ZThn632_N4ksys3res2AS9finalize_Ev
|
||||
0x00000071011abb50,sub_71011ABB50,92,_ZNK4ksys3res2AS13getRandomRateEv
|
||||
0x00000071011abbac,sub_71011ABBAC,8,_ZNK4ksys3res2AS27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
|
||||
0x00000071011abbb4,sub_71011ABBB4,92,_ZNK4ksys3res2AS18getRuntimeTypeInfoEv
|
||||
0x00000071011abc10,sub_71011ABC10,8,_ZNK4ksys3res2AS10needsParseEv
|
||||
0x00000071011abc18,sub_71011ABC18,8,_ZThn632_NK4ksys3res2AS27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
|
||||
0x00000071011abc20,sub_71011ABC20,92,_ZThn632_NK4ksys3res2AS18getRuntimeTypeInfoEv
|
||||
0x00000071011abc7c,sub_71011ABC7C,8,_ZThn632_NK4ksys3res2AS10needsParseEv
|
||||
0x00000071011abc84,sub_71011ABC84,372,_ZN4ksys3res2AS33checkDerivedRuntimeTypeInfoStaticEPKN4sead15RuntimeTypeInfo9InterfaceE
|
||||
0x00000071011abdf8,nullsub_4622,4,
|
||||
0x00000071011abdfc,sub_71011ABDFC,372,_ZN4ksys3res6ASListC1Ev
|
||||
0x00000071011abf70,sub_71011ABF70,668,_ZN4ksys3res6ASListD1Ev
|
||||
|
|
@ -96502,7 +96502,7 @@
|
|||
0x00000071012ee050,sub_71012EE050,340,_ZN4ksys3res17ASBlenderResource15callOnChildren_EMNS0_10ASResourceEFivE
|
||||
0x00000071012ee1a4,sub_71012EE1A4,168,_ZN4ksys3res15ASAssetResource7doParseERKNS0_10ASResource9ParseArgsE
|
||||
0x00000071012ee24c,sub_71012EE24C,356,_ZN4ksys3res22ASSkeltalAssetResource7doParseERKNS0_10ASResource9ParseArgsE
|
||||
0x00000071012ee3b0,sub_71012EE3B0,236,_ZN4ksys3res10ASResource4makeERKNS1_16MakeResourceArgsE
|
||||
0x00000071012ee3b0,sub_71012EE3B0,236,_ZN4ksys3res10ASResource4makeERKNS1_9ParseArgsE
|
||||
0x00000071012ee49c,sub_71012EE49C,204,_ZNK4ksys3res22ASResourceWithChildren27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
|
||||
0x00000071012ee568,sub_71012EE568,92,_ZNK4ksys3res22ASResourceWithChildren18getRuntimeTypeInfoEv
|
||||
0x00000071012ee5c4,sub_71012EE5C4,20,_ZN4ksys3res22ASResourceWithChildren2m4Ev
|
||||
|
|
@ -96532,17 +96532,17 @@
|
|||
0x00000071012ef0c8,sub_71012EF0C8,112,_ZN4ksys3res22ASSkeltalAssetResourceD2Ev
|
||||
0x00000071012ef138,sub_71012EF138,100,_ZN4ksys3res22ASSkeltalAssetResourceD0Ev
|
||||
0x00000071012ef19c,sub_71012EF19C,8,
|
||||
0x00000071012ef1a4,sub_71012EF1A4,244,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_17ASBlenderResourceEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE
|
||||
0x00000071012ef1a4,sub_71012EF1A4,244,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_17ASBlenderResourceEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE
|
||||
0x00000071012ef298,sub_71012EF298,84,
|
||||
0x00000071012ef2ec,sub_71012EF2EC,220,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_18ASSelectorResourceEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE
|
||||
0x00000071012ef2ec,sub_71012EF2EC,220,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_18ASSelectorResourceEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE
|
||||
0x00000071012ef3c8,sub_71012EF3C8,84,
|
||||
0x00000071012ef41c,sub_71012EF41C,84,
|
||||
0x00000071012ef470,sub_71012EF470,84,
|
||||
0x00000071012ef4c4,sub_71012EF4C4,240,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_17ASAssetExResourceEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE
|
||||
0x00000071012ef4c4,sub_71012EF4C4,240,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_17ASAssetExResourceEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE
|
||||
0x00000071012ef5b4,sub_71012EF5B4,84,
|
||||
0x00000071012ef608,sub_71012EF608,84,
|
||||
0x00000071012ef65c,sub_71012EF65C,84,
|
||||
0x00000071012ef6b0,sub_71012EF6B0,136,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_10ASResourceEEEPS3_iRKNS3_16MakeResourceArgsE
|
||||
0x00000071012ef6b0,sub_71012EF6B0,136,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_10ASResourceEEEPS3_iRKNS3_9ParseArgsE
|
||||
0x00000071012ef738,sub_71012EF738,84,
|
||||
0x00000071012ef78c,sub_71012EF78C,84,
|
||||
0x00000071012ef7e0,sub_71012EF7E0,84,
|
||||
|
|
@ -96558,13 +96558,13 @@
|
|||
0x00000071012efb28,sub_71012EFB28,84,
|
||||
0x00000071012efb7c,sub_71012EFB7C,84,
|
||||
0x00000071012efbd0,sub_71012EFBD0,84,
|
||||
0x00000071012efc24,sub_71012EFC24,208,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_31ASSequencePlayContainerResourceEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE
|
||||
0x00000071012efc24,sub_71012EFC24,208,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_31ASSequencePlayContainerResourceEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE
|
||||
0x00000071012efcf4,sub_71012EFCF4,84,
|
||||
0x00000071012efd48,sub_71012EFD48,300,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_22ASSkeltalAssetResourceEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE
|
||||
0x00000071012efd48,sub_71012EFD48,300,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_22ASSkeltalAssetResourceEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE
|
||||
0x00000071012efe74,sub_71012EFE74,84,
|
||||
0x00000071012efec8,sub_71012EFEC8,84,
|
||||
0x00000071012eff1c,sub_71012EFF1C,84,
|
||||
0x00000071012eff70,sub_71012EFF70,160,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_22ASResourceWithChildrenEEEPNS0_10ASResourceEiRKNS4_16MakeResourceArgsE
|
||||
0x00000071012eff70,sub_71012EFF70,160,_ZN4ksys3res12_GLOBAL__N_115resFactoryImpl_INS0_22ASResourceWithChildrenEEEPNS0_10ASResourceEiRKNS4_9ParseArgsE
|
||||
0x00000071012f0010,sub_71012F0010,84,
|
||||
0x00000071012f0064,sub_71012F0064,84,
|
||||
0x00000071012f00b8,sub_71012F00B8,84,
|
||||
|
|
|
|||
|
Can't render this file because it is too large.
|
|
|
@ -1 +1,170 @@
|
|||
#include "KingSystem/Resource/resResourceAS.h"
|
||||
#include <memory>
|
||||
#include <random/seadGlobalRandom.h>
|
||||
#include "KingSystem/Resource/resResourceASResource.h"
|
||||
#include "KingSystem/Utils/HeapUtil.h"
|
||||
#include "KingSystem/Utils/SafeDelete.h"
|
||||
|
||||
namespace ksys::res {
|
||||
|
||||
namespace {
|
||||
sead::SafeString str_Elements = "Elements";
|
||||
sead::SafeString str_CommonParams = "CommonParams";
|
||||
} // namespace
|
||||
|
||||
AS::AS() : ParamIO("as", 0) {}
|
||||
|
||||
AS::~AS() = default;
|
||||
|
||||
void AS::doCreate_(u8*, u32, sead::Heap*) {}
|
||||
|
||||
// NON_MATCHING: SafeString vtable load is reordered
|
||||
bool AS::parse_(u8* data, size_t size, sead::Heap* parent_heap) {
|
||||
mHeap = util::tryCreateDualHeap(parent_heap);
|
||||
if (!mHeap)
|
||||
return false;
|
||||
|
||||
mHeap->enableWarning(false);
|
||||
auto* heap = mHeap;
|
||||
|
||||
agl::utl::ResParameterArchive archive{data};
|
||||
const auto root = archive.getRootList();
|
||||
|
||||
const auto Elements = agl::utl::getResParameterList(root, str_Elements);
|
||||
if (!Elements) {
|
||||
mHeap->adjust();
|
||||
return true;
|
||||
}
|
||||
|
||||
const int num_elements = Elements.getResParameterListNum();
|
||||
if (num_elements == 0) {
|
||||
mHeap->adjust();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!mElementResources.tryAllocBuffer(num_elements, heap)) {
|
||||
mHeap->adjust();
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0, n = mElementResources.size(); i < n; ++i)
|
||||
mElementResources(i) = nullptr;
|
||||
|
||||
ASResource::ParseArgs args;
|
||||
args.list = {};
|
||||
args.heap = heap;
|
||||
args.as = this;
|
||||
args.index = 0;
|
||||
|
||||
auto res_it = Elements.listBegin();
|
||||
const auto res_end = Elements.listEnd();
|
||||
|
||||
sead::FixedSafeString<16> name{"Element"};
|
||||
const auto name_prefix_len = name.calcLength();
|
||||
|
||||
for (auto it = mElementResources.begin(), end = mElementResources.end();
|
||||
it != end && res_it != res_end; ++it, ++res_it) {
|
||||
args.list = res_it.getList();
|
||||
*it = ASResource::make(args);
|
||||
if (*it == nullptr) {
|
||||
mHeap->adjust();
|
||||
return false;
|
||||
}
|
||||
|
||||
name.trim(name_prefix_len);
|
||||
name.appendWithFormat("%d", args.index);
|
||||
mElementsList.addList(&(*it)->getList(), name);
|
||||
++args.index;
|
||||
}
|
||||
|
||||
addList(&mElementsList, str_Elements);
|
||||
|
||||
mRandomRateMin.init(1.0, "RandomRateMin", "ランダム再生率小", "Min=0.f,Max=10.f",
|
||||
&mCommonParams);
|
||||
mRandomRateMax.init(1.0, "RandomRateMax", "ランダム再生率大", "Min=0.f,Max=10.f",
|
||||
&mCommonParams);
|
||||
mForbidPartialDemoAS.init(false, "ForbidPartialDemoAS", "一括再生する", "", &mCommonParams);
|
||||
mUseIK.init(true, "UseIK", "IKする", "", &mCommonParams);
|
||||
|
||||
addObj(&mCommonParams, str_CommonParams);
|
||||
|
||||
_3bb = 0;
|
||||
|
||||
res_it = Elements.listBegin();
|
||||
args.index = 0;
|
||||
for (auto it = mElementResources.begin(), end = mElementResources.end();
|
||||
it != end && res_it != res_end; ++it, ++res_it) {
|
||||
args.list = res_it.getList();
|
||||
if (!(*it)->parse(args)) {
|
||||
mHeap->adjust();
|
||||
return false;
|
||||
}
|
||||
|
||||
_3ba |= (*it)->m7() & 1;
|
||||
|
||||
switch ((*it)->getTypeIndex()) {
|
||||
case 62:
|
||||
_3bb |= 1 << 0;
|
||||
break;
|
||||
case 63:
|
||||
_3bb |= 1 << 1;
|
||||
break;
|
||||
case 64:
|
||||
_3bb |= 1 << 2;
|
||||
break;
|
||||
case 83:
|
||||
_3bb |= 1 << 3;
|
||||
break;
|
||||
case 6:
|
||||
_3bb |= 1 << 4;
|
||||
break;
|
||||
case 39:
|
||||
_3bb |= 1 << 5;
|
||||
break;
|
||||
}
|
||||
++args.index;
|
||||
}
|
||||
|
||||
applyResParameterArchive(archive);
|
||||
|
||||
if (auto* first = getFirstResource()) {
|
||||
u32 x = first->m4();
|
||||
x = x >= 0xff ? 0xff : x;
|
||||
u32 y = first->m5();
|
||||
y = y >= 0xff ? 0xff : y;
|
||||
|
||||
_3b8 = x;
|
||||
_3b9 = y;
|
||||
} else {
|
||||
_3b8 = 0;
|
||||
_3b9 = 0;
|
||||
}
|
||||
|
||||
mHeap->adjust();
|
||||
return true;
|
||||
}
|
||||
|
||||
ASResource* AS::getFirstResource() const {
|
||||
if (mElementResources.size() == 0)
|
||||
return nullptr;
|
||||
return mElementResources[0];
|
||||
}
|
||||
|
||||
void AS::finalize_() {
|
||||
for (auto* ptr : mElementResources) {
|
||||
if (ptr)
|
||||
std::destroy_at(ptr);
|
||||
}
|
||||
|
||||
util::safeDeleteHeap(mHeap);
|
||||
}
|
||||
|
||||
float AS::getRandomRate() const {
|
||||
const auto max = getRandomRateMax();
|
||||
const auto min = getRandomRateMin();
|
||||
if (max - min > 0.0)
|
||||
return sead::GlobalRandom::instance()->getF32Range(min, max);
|
||||
return min;
|
||||
}
|
||||
|
||||
} // namespace ksys::res
|
||||
|
|
|
|||
|
|
@ -16,8 +16,11 @@ class AS : public ParamIO, public Resource {
|
|||
SEAD_RTTI_OVERRIDE(AS, Resource)
|
||||
public:
|
||||
AS();
|
||||
~AS() override;
|
||||
AS(const AS&) = delete;
|
||||
auto operator=(const AS&) = delete;
|
||||
|
||||
void doCreate_(u8*, u32, sead::Heap*) override {}
|
||||
void doCreate_(u8*, u32, sead::Heap*) override;
|
||||
bool needsParse() const override { return true; }
|
||||
bool parse_(u8* data, size_t size, sead::Heap* heap) override;
|
||||
void finalize_() override;
|
||||
|
|
@ -28,6 +31,9 @@ public:
|
|||
const auto& getForbidPartialDemoAs() const { return *mForbidPartialDemoAS; }
|
||||
const auto& getUseIk() const { return *mUseIK; }
|
||||
|
||||
ASResource* getFirstResource() const;
|
||||
float getRandomRate() const;
|
||||
|
||||
private:
|
||||
friend class ASList;
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ namespace {
|
|||
|
||||
struct ASElementFactory {
|
||||
const char* name;
|
||||
ASResource* (*make_res)(int type_index, const ASResource::MakeResourceArgs& args);
|
||||
ASResource* (*make_res)(int type_index, const ASResource::ParseArgs& args);
|
||||
// FIXME: signature
|
||||
as::Element* (*make)();
|
||||
/// Arbitrary value that is passed to the Element class
|
||||
|
|
@ -23,7 +23,7 @@ struct ASElementFactory {
|
|||
sead::SafeString sStr_default = "default";
|
||||
|
||||
template <typename T>
|
||||
ASResource* resFactoryImpl_(int type_index, const ASResource::MakeResourceArgs& arg) {
|
||||
ASResource* resFactoryImpl_(int type_index, const ASResource::ParseArgs& arg) {
|
||||
return new (arg.heap) T(type_index, arg.index);
|
||||
}
|
||||
|
||||
|
|
@ -358,7 +358,7 @@ bool ASSkeltalAssetResource::doParse(const ASResource::ParseArgs& args) {
|
|||
return true;
|
||||
}
|
||||
|
||||
ASResource* ASResource::make(const ASResource::MakeResourceArgs& args) {
|
||||
ASResource* ASResource::make(const ASResource::ParseArgs& args) {
|
||||
const auto Parameters = agl::utl::getResParameterObj(args.list, "Parameters");
|
||||
|
||||
const auto TypeIndex = agl::utl::getResParameter(Parameters, "TypeIndex");
|
||||
|
|
|
|||
|
|
@ -17,12 +17,6 @@ public:
|
|||
agl::utl::ResParameterList list;
|
||||
sead::Heap* heap;
|
||||
AS* as;
|
||||
};
|
||||
|
||||
struct MakeResourceArgs {
|
||||
agl::utl::ResParameterList list;
|
||||
sead::Heap* heap;
|
||||
void* x;
|
||||
int index;
|
||||
};
|
||||
|
||||
|
|
@ -37,18 +31,20 @@ public:
|
|||
virtual int m7() { return 0; }
|
||||
|
||||
static const sead::SafeString& getDefaultStr();
|
||||
static ASResource* make(const MakeResourceArgs& args);
|
||||
static ASResource* make(const ParseArgs& args);
|
||||
|
||||
s16 getTypeIndex() const { return mTypeIndex; }
|
||||
s16 getIndex() const { return mIndex; }
|
||||
u16 getTypeIndex() const { return mTypeIndex; }
|
||||
u16 getIndex() const { return mIndex; }
|
||||
int findStringIndex(const sead::SafeString& value) const;
|
||||
int findIntIndex(int value) const;
|
||||
|
||||
agl::utl::ParameterList& getList() { return mList; }
|
||||
|
||||
protected:
|
||||
virtual bool doParse(const ParseArgs& args) { return true; }
|
||||
|
||||
s16 mTypeIndex{};
|
||||
s16 mIndex{};
|
||||
u16 mTypeIndex{};
|
||||
u16 mIndex{};
|
||||
agl::utl::ParameterList mList;
|
||||
ASExtensions mExtensions;
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue