mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-27 02:54:08 +00:00
167 lines
4.5 KiB
C++
167 lines
4.5 KiB
C++
#include "Library/Resource/Resource.h"
|
|
|
|
#include <filedevice/seadArchiveFileDevice.h>
|
|
#include <g3d/aglNW4FToNN.h>
|
|
#include <heap/seadHeapMgr.h>
|
|
#include <nn/g3d/ResFile.h>
|
|
#include <resource/seadArchiveRes.h>
|
|
|
|
#include "Library/Base/HashCodeUtil.h"
|
|
#include "Library/Base/StringUtil.h"
|
|
#include "Library/File/FileUtil.h"
|
|
|
|
// NON_MATCHING __cxx_global_array_dtor and _GLOBAL__sub_I_Resource.cpp are misplaced.
|
|
static sead::DirectoryEntry sEntries[0x1000];
|
|
|
|
namespace al {
|
|
Resource::Resource(const sead::SafeString& path)
|
|
: mPath(path), mHeap(sead::HeapMgr::instance()->getCurrentHeap()) {
|
|
mArchive = loadArchive(path);
|
|
mDevice = new sead::ArchiveFileDevice(mArchive);
|
|
}
|
|
|
|
Resource::Resource(const sead::SafeString& path, sead::ArchiveRes* archive)
|
|
: mPath(path), mHeap(sead::HeapMgr::instance()->getCurrentHeap()) {
|
|
mArchive = archive;
|
|
mDevice = new sead::ArchiveFileDevice(mArchive);
|
|
}
|
|
|
|
bool Resource::isExistFile(const sead::SafeString& filePath) const {
|
|
bool exists = false;
|
|
mDevice->tryIsExistFile(&exists, filePath);
|
|
|
|
return exists;
|
|
}
|
|
|
|
bool Resource::isExistByml(const char* filePath) const {
|
|
StringTmp<0x80> filePathExt;
|
|
filePathExt.copy(filePath);
|
|
filePathExt.append(".byml");
|
|
|
|
return isExistFile(filePathExt.cstr());
|
|
}
|
|
|
|
u32 Resource::getSize() const {
|
|
return mArchive->getRawSize();
|
|
}
|
|
|
|
u32 Resource::getEntryNum(const sead::SafeString& directoryPath) const {
|
|
sead::DirectoryHandle handle;
|
|
|
|
if (!mDevice->tryOpenDirectory(&handle, directoryPath))
|
|
return 0;
|
|
|
|
u32 entriesRead = mDevice->readDirectory(&handle, sEntries, 0x1000);
|
|
mDevice->tryCloseDirectory(&handle);
|
|
|
|
return entriesRead;
|
|
}
|
|
|
|
void Resource::getEntryName(sead::BufferedSafeString* outName,
|
|
const sead::SafeString& directoryPath, u32 entryNum) const {
|
|
sead::DirectoryHandle handle;
|
|
|
|
mDevice->tryOpenDirectory(&handle, directoryPath);
|
|
mDevice->readDirectory(&handle, sEntries, 0x1000);
|
|
mDevice->tryCloseDirectory(&handle);
|
|
|
|
outName->format("%s", sEntries[entryNum].name.cstr());
|
|
}
|
|
|
|
u32 Resource::getFileSize(const sead::SafeString& filePath) const {
|
|
return mDevice->getFileSize(filePath);
|
|
}
|
|
|
|
const u8* Resource::getByml(const sead::SafeString& filePath) const {
|
|
StringTmp<0x80> filePathExt;
|
|
filePathExt.copy(filePath);
|
|
filePathExt.append(".byml");
|
|
|
|
return (const u8*)getFile(filePathExt);
|
|
}
|
|
|
|
const void* Resource::getFile(const sead::SafeString& filePath) const {
|
|
return mArchive->getFile(filePath);
|
|
}
|
|
|
|
const u8* Resource::tryGetByml(const sead::SafeString& filePath) const {
|
|
StringTmp<0x80> filePathExt;
|
|
filePathExt.copy(filePath);
|
|
filePathExt.append(".byml");
|
|
|
|
if (!isExistFile(filePathExt.cstr()))
|
|
return nullptr;
|
|
|
|
return (const u8*)getFile(filePathExt);
|
|
}
|
|
|
|
const void* Resource::getKcl(const sead::SafeString& filePath) const {
|
|
StringTmp<0x80> filePathExt;
|
|
filePathExt.copy(filePath);
|
|
filePathExt.append(".kcl");
|
|
|
|
return getFile(filePathExt);
|
|
}
|
|
|
|
const void* Resource::tryGetKcl(const sead::SafeString& filePath) const {
|
|
StringTmp<0x80> filePathExt;
|
|
filePathExt.copy(filePath);
|
|
filePathExt.append(".kcl");
|
|
|
|
if (!isExistFile(filePathExt.cstr()))
|
|
return nullptr;
|
|
|
|
return getFile(filePathExt);
|
|
}
|
|
|
|
const void* Resource::getPa(const sead::SafeString& filePath) const {
|
|
StringTmp<0x80> filePathExt = {"%s.pa", filePath.cstr()};
|
|
|
|
return getFile(filePathExt);
|
|
}
|
|
|
|
const void* Resource::tryGetPa(const sead::SafeString& filePath) const {
|
|
StringTmp<0x80> filePathExt;
|
|
filePathExt.copy(filePath);
|
|
filePathExt.append(".pa");
|
|
|
|
if (!isExistFile(filePathExt.cstr()))
|
|
return nullptr;
|
|
|
|
return getFile(filePathExt);
|
|
}
|
|
|
|
const void* Resource::getOtherFile(const sead::SafeString& filePath) const {
|
|
return getFile(filePath);
|
|
}
|
|
|
|
const char* Resource::getArchiveName() const {
|
|
return getBaseName(mPath.cstr());
|
|
}
|
|
|
|
bool Resource::tryCreateResGraphicsFile(const sead::SafeString& filePath,
|
|
nn::g3d::ResFile* resFile) {
|
|
if (mResFile)
|
|
return false;
|
|
|
|
mResFile = nn::g3d::ResFile::ResCast((void*)getFile(filePath));
|
|
if (resFile)
|
|
agl::g3d::ResFile::BindTexture(mResFile, resFile);
|
|
agl::g3d::ResFile::Setup(mResFile);
|
|
agl::g3d::ResFile::BindTexture(mResFile, mResFile);
|
|
|
|
return true;
|
|
}
|
|
|
|
void Resource::cleanupResGraphicsFile() {
|
|
if (!mResFile)
|
|
return;
|
|
|
|
mResFile->ReleaseTexture();
|
|
mResFile->Reset();
|
|
agl::g3d::ResFile::Cleanup(mResFile);
|
|
|
|
mResFile = nullptr;
|
|
}
|
|
} // namespace al
|