OdysseyDecomp/lib/al/Library/Resource/ActorResourceHolder.cpp

65 lines
1.9 KiB
C++

#include "Library/Resource/ActorResourceHolder.h"
#include "Library/Resource/ActorResource.h"
namespace al {
ActorResourceHolder::ActorResourceHolder(s32 capacity) {
mTreeMap.allocBuffer(capacity, nullptr);
mActorResource.allocBuffer(capacity, nullptr);
mErasedActorResource.allocBuffer(capacity, nullptr);
}
ActorResource* ActorResourceHolder::tryFindActorResource(const sead::SafeString& name) {
return findActorResourceImpl(name);
}
ActorResource* ActorResourceHolder::findActorResourceImpl(const sead::SafeString& name) {
auto* node = mTreeMap.find(name);
if (!node)
return nullptr;
return node->value();
}
ActorResource* ActorResourceHolder::createActorResource(const sead::SafeString& name,
Resource* modelResource,
Resource* animResource) {
ActorResource* resource = new ActorResource(name, modelResource, animResource);
mTreeMap.insert(resource->getName(), resource);
mActorResource.pushBack(resource);
return resource;
}
void ActorResourceHolder::removeAll() {
mTreeMap.clear();
mActorResource.clear();
}
void ActorResourceHolder::eraseResourceUser(Resource* resource) {
for (ActorResource& res : mActorResource) {
if (res.getModelRes() != resource)
continue;
mActorResource.erase(mActorResource.indexOf(&res));
mErasedActorResource.pushBack(&res);
if (mTreeMap.find(res.getName()))
mTreeMap.erase(res.getName());
}
}
void ActorResourceHolder::freeErasedActorResource() {
for (ActorResource& it : mErasedActorResource) {
ActorResource* res = ⁢
// compiler must forget about being a reference above,
// otherwise it assumes that res is not null
__asm("" : "=r"(res) : "0"(res));
if (!res)
continue;
delete res;
}
mErasedActorResource.clear();
}
} // namespace al