ksys/res: Start adding AnimInfo

not going to do parse() for now, it's a major pain
This commit is contained in:
Léo Lam 2021-03-23 19:28:26 +01:00
parent 5752f1b676
commit 69fcdfbed7
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
3 changed files with 191 additions and 18 deletions

View File

@ -96462,26 +96462,26 @@
0x00000071012ec0d4,sub_71012EC0D4,52,
0x00000071012ec108,sub_71012EC108,40,
0x00000071012ec130,sub_71012EC130,372,
0x00000071012ec2a4,sub_71012EC2A4,240,
0x00000071012ec394,sub_71012EC394,316,
0x00000071012ec4d0,sub_71012EC4D0,8,
0x00000071012ec4d8,sub_71012EC4D8,8,
0x00000071012ec4e0,sub_71012EC4E0,36,
0x00000071012ec504,sub_71012EC504,40,
0x00000071012ec52c,sub_71012EC52C,40,
0x00000071012ec554,nullsub_4829,4,
0x00000071012ec558,nullsub_4830,4,
0x00000071012ec2a4,sub_71012EC2A4,240,_ZN4ksys3res8AnimInfoC1Ev
0x00000071012ec394,sub_71012EC394,316,_ZN4ksys3res8AnimInfoD1Ev
0x00000071012ec4d0,sub_71012EC4D0,8,_ZThn632_N4ksys3res8AnimInfoD1Ev
0x00000071012ec4d8,sub_71012EC4D8,8,_ZThn664_N4ksys3res8AnimInfoD1Ev
0x00000071012ec4e0,sub_71012EC4E0,36,_ZN4ksys3res8AnimInfoD0Ev
0x00000071012ec504,sub_71012EC504,40,_ZThn632_N4ksys3res8AnimInfoD0Ev
0x00000071012ec52c,sub_71012EC52C,40,_ZThn664_N4ksys3res8AnimInfoD0Ev
0x00000071012ec554,nullsub_4829,4,_ZN4ksys3res8AnimInfo9doCreate_EPhjPN4sead4HeapE
0x00000071012ec558,nullsub_4830,4,_ZThn632_N4ksys3res8AnimInfo9doCreate_EPhjPN4sead4HeapE
0x00000071012ec55c,sub_71012EC55C,2428,
0x00000071012eced8,sub_71012ECED8,8,
0x00000071012ecee0,sub_71012ECEE0,68,
0x00000071012ecf24,sub_71012ECF24,400,
0x00000071012ed0b4,sub_71012ED0B4,8,
0x00000071012ed0bc,sub_71012ED0BC,92,
0x00000071012ed118,sub_71012ED118,8,
0x00000071012ed120,sub_71012ED120,8,
0x00000071012ed128,sub_71012ED128,92,
0x00000071012ed184,sub_71012ED184,8,
0x00000071012ed18c,sub_71012ED18C,372,
0x00000071012ecee0,sub_71012ECEE0,68,_ZNK4ksys3res8AnimInfo7getAnimERKN4sead14SafeStringBaseIcEE
0x00000071012ecf24,sub_71012ECF24,400,_ZNK4ksys3res8AnimInfo13findAnimIndexERKN4sead14SafeStringBaseIcEE
0x00000071012ed0b4,sub_71012ED0B4,8,_ZNK4ksys3res8AnimInfo27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071012ed0bc,sub_71012ED0BC,92,_ZNK4ksys3res8AnimInfo18getRuntimeTypeInfoEv
0x00000071012ed118,sub_71012ED118,8,_ZNK4ksys3res8AnimInfo10needsParseEv
0x00000071012ed120,sub_71012ED120,8,_ZThn632_NK4ksys3res8AnimInfo27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071012ed128,sub_71012ED128,92,_ZThn632_NK4ksys3res8AnimInfo18getRuntimeTypeInfoEv
0x00000071012ed184,sub_71012ED184,8,_ZThn632_NK4ksys3res8AnimInfo10needsParseEv
0x00000071012ed18c,sub_71012ED18C,372,_ZN4ksys3res8AnimInfo33checkDerivedRuntimeTypeInfoStaticEPKN4sead15RuntimeTypeInfo9InterfaceE
0x00000071012ed300,sub_71012ED300,104,
0x00000071012ed368,sub_71012ED368,32,
0x00000071012ed388,sub_71012ED388,32,

Can't render this file because it is too large.

View File

@ -1 +1,128 @@
#include "KingSystem/Resource/resResourceAnimInfo.h"
#include "KingSystem/Utils/Byaml/Byaml.h"
#include "KingSystem/Utils/SafeDelete.h"
namespace ksys::res {
AnimInfo::AnimInfo() : ParamIO("animinfo", 0) {}
AnimInfo::~AnimInfo() {
mAnims.freeBuffer();
if (mSwordBlurInfo) {
mSwordBlurInfo->finalize();
util::safeDelete(mSwordBlurInfo);
}
}
void AnimInfo::SwordBlurInfo::finalize() {
if (!entries)
return;
for (int i = 0; i < num_entries; ++i) {
SwordBlur& entry = entries[i];
auto* h = heap;
if (entry.frames) {
h->free(entry.frames);
entry.frames = nullptr;
}
if (entry._18) {
h->free(entry._18);
entry._18 = nullptr;
}
}
heap->free(entries);
entries = nullptr;
}
void AnimInfo::doCreate_(u8* buffer, u32 buffer_size, sead::Heap* heap) {}
bool AnimInfo::parse_(u8* data, size_t size, sead::Heap* heap) {
al::ByamlIter root_iter{data};
const int num_entries = root_iter.getSize();
int num_anims = num_entries - 1;
if (num_entries < 1)
return true;
al::ByamlIter iter;
int double_attack_anm_num = 0;
int num = 0;
bool allocate_anims = false;
if (root_iter.isExistKey("_sword_blur")) {
iter = root_iter.getIterByKey("_sword_blur");
const int num_sword_blurs = iter.getSize();
iter.tryGetIntByKey(&double_attack_anm_num, "double_attack_anm_num");
num = num_sword_blurs - 1;
if (num_entries > 1)
allocate_anims = true;
} else {
num = 0;
num_anims = num_entries;
allocate_anims = true;
}
if (allocate_anims) {
if (!mAnims.tryAllocBuffer(num_anims, heap))
return false;
for (int i = 0; i < num_anims; ++i) {
auto& anim = mAnims[i];
anim.scale.e.fill(0.0);
al::ByamlIter entry_iter;
if (root_iter.tryGetIterByIndex(&entry_iter, i)) {
const char* name_c;
if (root_iter.getKeyName(&name_c, i)) {
if (std::strcmp(name_c, "_sword_blur") == 0)
continue;
anim.name = name_c;
} else {
anim.name = "";
}
entry_iter.tryGetFloatByKey(&anim.scale.x, "scaleX");
entry_iter.tryGetFloatByKey(&anim.scale.y, "scaleY");
entry_iter.tryGetFloatByKey(&anim.scale.z, "scaleZ");
} else {
anim.name = "";
}
}
}
if (num >= 1) {
if (!mSwordBlurInfo) {
auto* info = new (heap) SwordBlurInfo;
info->entries = nullptr;
mSwordBlurInfo = info;
info->heap = heap;
info->num_entries = double_attack_anm_num;
/// @bug SwordBlur is not trivially constructible and not trivially copyable.
/// The only reason using SwordBlur::name doesn't crash is that Clang and GHS
/// are smart enough to devirtualize sead::SafeString virtual function calls,
/// which removes the need to go through the vtable.
info->entries = static_cast<SwordBlur*>(
heap->tryAlloc(sizeof(SwordBlur) * info->num_entries, alignof(SwordBlur)));
std::memset(info->entries, 0, sizeof(SwordBlur) * info->num_entries);
}
// TODO / FIXME: finish this
}
return true;
}
const AnimInfo::Anim* AnimInfo::getAnim(const sead::SafeString& name) const {
const auto idx = findAnimIndex(name);
if (idx < 0)
return nullptr;
return &mAnims[idx];
}
int AnimInfo::findAnimIndex(const sead::SafeString& name) const {
return mAnims.binarySearch(
name,
+[](const Anim& anim, const sead::SafeString& key) { return anim.name.compare(key); });
}
} // namespace ksys::res

View File

@ -1,13 +1,59 @@
#pragma once
#include <container/seadBuffer.h>
#include <math/seadMatrix.h>
#include <math/seadVector.h>
#include <prim/seadSafeString.h>
#include "KingSystem/Resource/resResource.h"
#include "KingSystem/Utils/ParamIO.h"
#include "KingSystem/Utils/Types.h"
namespace ksys::res {
// TODO
class AnimInfo : public ParamIO, public Resource {
SEAD_RTTI_OVERRIDE(AnimInfo, Resource)
public:
struct Anim {
sead::SafeString name;
sead::Vector3f scale;
};
KSYS_CHECK_SIZE_NX150(Anim, 0x20);
struct SwordBlur {
int frame_num;
int start;
int end;
sead::Matrix34f* frames;
float* _18;
sead::SafeString name;
};
KSYS_CHECK_SIZE_NX150(SwordBlur, 0x30);
AnimInfo();
~AnimInfo() override;
bool needsParse() const override { return true; }
void doCreate_(u8* buffer, u32 buffer_size, sead::Heap* heap) override;
bool parse_(u8* data, size_t size, sead::Heap* heap) override;
const sead::Buffer<Anim>& getAnims() const { return mAnims; }
const Anim* getAnim(const sead::SafeString& name) const;
int findAnimIndex(const sead::SafeString& name) const;
private:
struct SwordBlurInfo {
void finalize();
sead::Heap* heap;
int num_entries;
SwordBlur* entries;
};
KSYS_CHECK_SIZE_NX150(SwordBlurInfo, 0x18);
sead::Buffer<Anim> mAnims;
SwordBlurInfo* mSwordBlurInfo = nullptr;
};
} // namespace ksys::res