mirror of https://github.com/AxioDL/metaforce.git
Lots of CResFactory fixes
This commit is contained in:
parent
8346f56595
commit
2f4cddd3d2
|
@ -512,7 +512,6 @@ bool MREA::PCCook(const hecl::ProjectPath& outPath,
|
||||||
if (!visiGood)
|
if (!visiGood)
|
||||||
{
|
{
|
||||||
hecl::ProjectPath visiIntOut = outPath.getWithExtension(_S(".visiint"));
|
hecl::ProjectPath visiIntOut = outPath.getWithExtension(_S(".visiint"));
|
||||||
hecl::ProjectPath visiIn = inPath.getWithExtension(_S(".visi"));
|
|
||||||
athena::io::FileWriter w(visiIntOut.getAbsolutePath());
|
athena::io::FileWriter w(visiIntOut.getAbsolutePath());
|
||||||
w.writeUint32Big(meshes.size());
|
w.writeUint32Big(meshes.size());
|
||||||
for (const DNACMDL::Mesh& mesh : meshes)
|
for (const DNACMDL::Mesh& mesh : meshes)
|
||||||
|
@ -568,15 +567,19 @@ bool MREA::PCCook(const hecl::ProjectPath& outPath,
|
||||||
#endif
|
#endif
|
||||||
const hecl::SystemChar* args[] = {VisiGenPath.c_str(),
|
const hecl::SystemChar* args[] = {VisiGenPath.c_str(),
|
||||||
visiIntOut.getAbsolutePath().c_str(),
|
visiIntOut.getAbsolutePath().c_str(),
|
||||||
visiIn.getAbsolutePath().c_str(),
|
preVisiPath.getAbsolutePath().c_str(),
|
||||||
thrIdx, parPid, nullptr};
|
thrIdx, parPid, nullptr};
|
||||||
if (0 == hecl::RunProcess(VisiGenPath.c_str(), args))
|
if (0 == hecl::RunProcess(VisiGenPath.c_str(), args))
|
||||||
{
|
{
|
||||||
athena::io::FileReader r(visiIn.getAbsolutePath());
|
athena::io::FileReader r(preVisiPath.getAbsolutePath());
|
||||||
size_t length = r.length();
|
size_t length = r.length();
|
||||||
secs.emplace_back(length, 0);
|
secs.emplace_back(length, 0);
|
||||||
r.readBytesToBuf(secs.back().data(), length);
|
r.readBytesToBuf(secs.back().data(), length);
|
||||||
visiGood = true;
|
visiGood = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.report(logvisor::Fatal, _S("Unable to launch %s"), VisiGenPath.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -441,14 +441,7 @@ bool SpecBase::canPackage(const hecl::ProjectPath& path)
|
||||||
auto components = path.getPathComponents();
|
auto components = path.getPathComponents();
|
||||||
if (components.size() <= 1)
|
if (components.size() <= 1)
|
||||||
return false;
|
return false;
|
||||||
hecl::ProjectPath outDir(m_project.getProjectWorkingPath(), _S("out"));
|
return path.isFile() || path.isDirectory();
|
||||||
|
|
||||||
if (path.getPathType() == hecl::ProjectPath::Type::File &&
|
|
||||||
!hecl::StrCmp(path.getLastComponent(), _S("!world.blend")))
|
|
||||||
return true;
|
|
||||||
else if (path.getPathType() == hecl::ProjectPath::Type::Directory)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpecBase::recursiveBuildResourceList(std::vector<urde::SObjectTag>& listOut,
|
void SpecBase::recursiveBuildResourceList(std::vector<urde::SObjectTag>& listOut,
|
||||||
|
@ -537,7 +530,7 @@ void SpecBase::doPackage(const hecl::ProjectPath& path, const hecl::Database::Da
|
||||||
waitForIndexComplete();
|
waitForIndexComplete();
|
||||||
|
|
||||||
/* Name pak based on root-relative components */
|
/* Name pak based on root-relative components */
|
||||||
auto components = path.getPathComponents();
|
auto components = path.getWithExtension(_S(""), true).getPathComponents();
|
||||||
if (components.size() <= 1)
|
if (components.size() <= 1)
|
||||||
return;
|
return;
|
||||||
hecl::ProjectPath outPath(m_project.getProjectWorkingPath(),
|
hecl::ProjectPath outPath(m_project.getProjectWorkingPath(),
|
||||||
|
@ -582,6 +575,38 @@ void SpecBase::doPackage(const hecl::ProjectPath& path, const hecl::Database::Da
|
||||||
for (int64_t i=0 ; i<32-rem ; ++i)
|
for (int64_t i=0 ; i<32-rem ; ++i)
|
||||||
pakOut.writeUByte(0xff);
|
pakOut.writeUByte(0xff);
|
||||||
}
|
}
|
||||||
|
else if (path.getPathType() == hecl::ProjectPath::Type::File) /* One-file General PAK */
|
||||||
|
{
|
||||||
|
/* Build resource list */
|
||||||
|
std::vector<hecl::ProjectPath> subPaths;
|
||||||
|
flattenDependencies(path, subPaths, btok);
|
||||||
|
std::unordered_set<urde::SObjectTag> addedTags;
|
||||||
|
std::vector<std::pair<urde::SObjectTag, std::string>> nameList;
|
||||||
|
for (const auto& subPath : subPaths)
|
||||||
|
{
|
||||||
|
if (urde::SObjectTag tag = tagFromPath(subPath, btok))
|
||||||
|
{
|
||||||
|
if (addedTags.find(tag) != addedTags.end())
|
||||||
|
continue;
|
||||||
|
addedTags.insert(tag);
|
||||||
|
buildList.push_back(tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Build name list */
|
||||||
|
for (const auto& item : buildList)
|
||||||
|
{
|
||||||
|
auto search = m_catalogTagToName.find(item);
|
||||||
|
if (search != m_catalogTagToName.end())
|
||||||
|
nameList.emplace_back(item, search->second);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write resource list structure */
|
||||||
|
buildPakList(btok, pakOut, buildList, nameList, resTableOffset);
|
||||||
|
if (int64_t rem = pakOut.position() % 32)
|
||||||
|
for (int64_t i=0 ; i<32-rem ; ++i)
|
||||||
|
pakOut.writeUByte(0xff);
|
||||||
|
}
|
||||||
|
|
||||||
/* Async cook resource list if using ClientProcess */
|
/* Async cook resource list if using ClientProcess */
|
||||||
if (cp)
|
if (cp)
|
||||||
|
|
|
@ -1165,8 +1165,6 @@ struct SpecMP1 : SpecBase
|
||||||
nameEnt.name = parentDir.getLastComponent();
|
nameEnt.name = parentDir.getLastComponent();
|
||||||
nameEnt.write(w);
|
nameEnt.write(w);
|
||||||
|
|
||||||
w.writeUint32Big(atUint32(count));
|
|
||||||
resTableOffset = w.position();
|
|
||||||
for (const auto& area : mlvl.areas)
|
for (const auto& area : mlvl.areas)
|
||||||
for (const auto& dep : area.deps)
|
for (const auto& dep : area.deps)
|
||||||
listOut.push_back({dep.type, dep.id.toUint32()});
|
listOut.push_back({dep.type, dep.id.toUint32()});
|
||||||
|
@ -1231,6 +1229,8 @@ struct SpecMP1 : SpecBase
|
||||||
|
|
||||||
listOut.push_back(worldTag);
|
listOut.push_back(worldTag);
|
||||||
|
|
||||||
|
w.writeUint32Big(atUint32(listOut.size()));
|
||||||
|
resTableOffset = w.position();
|
||||||
for (const auto& item : listOut)
|
for (const auto& item : listOut)
|
||||||
{
|
{
|
||||||
DNAMP1::PAK::Entry ent;
|
DNAMP1::PAK::Entry ent;
|
||||||
|
|
|
@ -55,5 +55,7 @@ add_dependencies(urde visigen hecl)
|
||||||
|
|
||||||
add_custom_command(TARGET urde POST_BUILD
|
add_custom_command(TARGET urde POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:visigen> $<TARGET_FILE_DIR:urde>)
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:visigen> $<TARGET_FILE_DIR:urde>)
|
||||||
|
add_custom_command(TARGET urde POST_BUILD
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:visigen> $<TARGET_FILE_DIR:hecl>)
|
||||||
add_custom_command(TARGET urde POST_BUILD
|
add_custom_command(TARGET urde POST_BUILD
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:hecl> $<TARGET_FILE_DIR:urde>)
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:hecl> $<TARGET_FILE_DIR:urde>)
|
|
@ -160,7 +160,7 @@ bool ProjectResourceFactoryBase::AsyncTask::AsyncPump()
|
||||||
return m_failed;
|
return m_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectResourceFactoryBase::AsyncTask::WaitForComplete()
|
void ProjectResourceFactoryBase::AsyncTask::WaitUntilComplete()
|
||||||
{
|
{
|
||||||
using ItType = std::unordered_map<SObjectTag,
|
using ItType = std::unordered_map<SObjectTag,
|
||||||
std::list<std::shared_ptr<AsyncTask>>::iterator>::iterator;
|
std::list<std::shared_ptr<AsyncTask>>::iterator>::iterator;
|
||||||
|
@ -365,37 +365,25 @@ u32 ProjectResourceFactoryBase::ResourceSize(const SObjectTag& tag)
|
||||||
return fr->length();
|
return fr->length();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<AsyncTask>
|
std::shared_ptr<urde::IDvdRequest>
|
||||||
ProjectResourceFactoryBase::LoadResourceAsync(const urde::SObjectTag& tag,
|
ProjectResourceFactoryBase::LoadResourceAsync(const urde::SObjectTag& tag, void* target)
|
||||||
std::unique_ptr<u8[]>& target)
|
|
||||||
{
|
{
|
||||||
if (!tag.id.IsValid())
|
if (!tag.id.IsValid())
|
||||||
Log.report(logvisor::Fatal, "attempted to access null id");
|
Log.report(logvisor::Fatal, "attempted to access null id");
|
||||||
if (m_asyncLoadMap.find(tag) != m_asyncLoadMap.end())
|
if (m_asyncLoadMap.find(tag) != m_asyncLoadMap.end())
|
||||||
return {};
|
return {};
|
||||||
return _AddTask(std::make_shared<AsyncTask>(*this, tag, target));
|
return std::static_pointer_cast<urde::IDvdRequest>(_AddTask(std::make_shared<AsyncTask>(*this, tag, reinterpret_cast<u8*>(target))));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<AsyncTask>
|
std::shared_ptr<urde::IDvdRequest>
|
||||||
ProjectResourceFactoryBase::LoadResourcePartAsync(const urde::SObjectTag& tag,
|
ProjectResourceFactoryBase::LoadResourcePartAsync(const urde::SObjectTag& tag,
|
||||||
u32 size, u32 off,
|
u32 size, u32 off, void* target)
|
||||||
std::unique_ptr<u8[]>& target)
|
|
||||||
{
|
{
|
||||||
if (!tag.id.IsValid())
|
if (!tag.id.IsValid())
|
||||||
Log.report(logvisor::Fatal, "attempted to access null id");
|
Log.report(logvisor::Fatal, "attempted to access null id");
|
||||||
if (m_asyncLoadMap.find(tag) != m_asyncLoadMap.end())
|
if (m_asyncLoadMap.find(tag) != m_asyncLoadMap.end())
|
||||||
return {};
|
return {};
|
||||||
return _AddTask(std::make_shared<AsyncTask>(*this, tag, target, size, off));
|
return std::static_pointer_cast<urde::IDvdRequest>(_AddTask(std::make_shared<AsyncTask>(*this, tag, reinterpret_cast<u8*>(target), size, off)));
|
||||||
}
|
|
||||||
|
|
||||||
std::shared_ptr<AsyncTask>
|
|
||||||
ProjectResourceFactoryBase::LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, u8* target)
|
|
||||||
{
|
|
||||||
if (!tag.id.IsValid())
|
|
||||||
Log.report(logvisor::Fatal, "attempted to access null id");
|
|
||||||
if (m_asyncLoadMap.find(tag) != m_asyncLoadMap.end())
|
|
||||||
return {};
|
|
||||||
return _AddTask(std::make_shared<AsyncTask>(*this, tag, target, size, off));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<u8[]> ProjectResourceFactoryBase::LoadResourceSync(const urde::SObjectTag& tag)
|
std::unique_ptr<u8[]> ProjectResourceFactoryBase::LoadResourceSync(const urde::SObjectTag& tag)
|
||||||
|
|
|
@ -21,7 +21,7 @@ class ProjectResourceFactoryBase : public IFactory
|
||||||
hecl::ClientProcess& m_clientProc;
|
hecl::ClientProcess& m_clientProc;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
struct AsyncTask
|
struct AsyncTask : urde::IDvdRequest
|
||||||
{
|
{
|
||||||
ProjectResourceFactoryBase& m_parent;
|
ProjectResourceFactoryBase& m_parent;
|
||||||
|
|
||||||
|
@ -52,6 +52,10 @@ public:
|
||||||
: m_parent(parent), x0_tag(tag), xc_targetDataPtr(&ptr), x14_resSize(size),
|
: m_parent(parent), x0_tag(tag), xc_targetDataPtr(&ptr), x14_resSize(size),
|
||||||
x14_resOffset(off) {}
|
x14_resOffset(off) {}
|
||||||
|
|
||||||
|
AsyncTask(ProjectResourceFactoryBase& parent, const SObjectTag& tag,
|
||||||
|
u8* ptr)
|
||||||
|
: m_parent(parent), x0_tag(tag), xc_targetDataRawPtr(ptr) {}
|
||||||
|
|
||||||
AsyncTask(ProjectResourceFactoryBase& parent, const SObjectTag& tag,
|
AsyncTask(ProjectResourceFactoryBase& parent, const SObjectTag& tag,
|
||||||
u8* ptr, u32 size, u32 off)
|
u8* ptr, u32 size, u32 off)
|
||||||
: m_parent(parent), x0_tag(tag), xc_targetDataRawPtr(ptr), x14_resSize(size),
|
: m_parent(parent), x0_tag(tag), xc_targetDataRawPtr(ptr), x14_resSize(size),
|
||||||
|
@ -69,7 +73,10 @@ public:
|
||||||
const hecl::ProjectPath& path);
|
const hecl::ProjectPath& path);
|
||||||
void CookComplete();
|
void CookComplete();
|
||||||
bool AsyncPump();
|
bool AsyncPump();
|
||||||
void WaitForComplete();
|
void WaitUntilComplete();
|
||||||
|
bool IsComplete() { return m_complete; }
|
||||||
|
void PostCancelRequest() {}
|
||||||
|
EMediaType GetMediaType() const { return EMediaType::Real; }
|
||||||
};
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -154,9 +161,8 @@ public:
|
||||||
void EnumerateNamedResources(const std::function<bool(const std::string&, const SObjectTag&)>& lambda) const;
|
void EnumerateNamedResources(const std::function<bool(const std::string&, const SObjectTag&)>& lambda) const;
|
||||||
|
|
||||||
u32 ResourceSize(const SObjectTag& tag);
|
u32 ResourceSize(const SObjectTag& tag);
|
||||||
std::shared_ptr<AsyncTask> LoadResourceAsync(const urde::SObjectTag& tag, std::unique_ptr<u8[]>& target);
|
std::shared_ptr<urde::IDvdRequest> LoadResourceAsync(const urde::SObjectTag& tag, void* target);
|
||||||
std::shared_ptr<AsyncTask> LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, std::unique_ptr<u8[]>& target);
|
std::shared_ptr<urde::IDvdRequest> LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, void* target);
|
||||||
std::shared_ptr<AsyncTask> LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, u8* target);
|
|
||||||
std::unique_ptr<u8[]> LoadResourceSync(const urde::SObjectTag& tag);
|
std::unique_ptr<u8[]> LoadResourceSync(const urde::SObjectTag& tag);
|
||||||
std::unique_ptr<u8[]> LoadResourcePartSync(const urde::SObjectTag& tag, u32 size, u32 off);
|
std::unique_ptr<u8[]> LoadResourcePartSync(const urde::SObjectTag& tag, u32 size, u32 off);
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ static const FourCC TypeTable[] =
|
||||||
FOURCC('WPSC'), FOURCC('SWHC'), FOURCC('DPSC'), FOURCC('ELSC'), FOURCC('CRSC'), FOURCC('AFSM'),
|
FOURCC('WPSC'), FOURCC('SWHC'), FOURCC('DPSC'), FOURCC('ELSC'), FOURCC('CRSC'), FOURCC('AFSM'),
|
||||||
FOURCC('DCLN'), FOURCC('AGSC'), FOURCC('ATBL'), FOURCC('CSNG'), FOURCC('STRG'), FOURCC('SCAN'),
|
FOURCC('DCLN'), FOURCC('AGSC'), FOURCC('ATBL'), FOURCC('CSNG'), FOURCC('STRG'), FOURCC('SCAN'),
|
||||||
FOURCC('PATH'), FOURCC('DGRP'), FOURCC('HMAP'), FOURCC('CTWK'), FOURCC('FRME'), FOURCC('HINT'),
|
FOURCC('PATH'), FOURCC('DGRP'), FOURCC('HMAP'), FOURCC('CTWK'), FOURCC('FRME'), FOURCC('HINT'),
|
||||||
FOURCC('MAPU'), FOURCC('DUMB')
|
FOURCC('MAPU'), FOURCC('DUMB'), FOURCC('OIDS')
|
||||||
};
|
};
|
||||||
|
|
||||||
CFactoryMgr::ETypeTable CFactoryMgr::FourCCToTypeIdx(FourCC fcc)
|
CFactoryMgr::ETypeTable CFactoryMgr::FourCCToTypeIdx(FourCC fcc)
|
||||||
|
|
|
@ -30,14 +30,14 @@ public:
|
||||||
|
|
||||||
enum class ETypeTable : s8
|
enum class ETypeTable : s8
|
||||||
{
|
{
|
||||||
Invalid = -1,
|
|
||||||
CLSN, CMDL, CSKR, ANIM, CINF, TXTR,
|
CLSN, CMDL, CSKR, ANIM, CINF, TXTR,
|
||||||
PLTT, FONT, ANCS, EVNT, MADF, MLVL,
|
PLTT, FONT, ANCS, EVNT, MADF, MLVL,
|
||||||
MREA, MAPW, MAPA, SAVW, SAVA, PART,
|
MREA, MAPW, MAPA, SAVW, SAVA, PART,
|
||||||
WPSC, SWHC, DPSC, ELSC, CRSC, AFSM,
|
WPSC, SWHC, DPSC, ELSC, CRSC, AFSM,
|
||||||
DCLN, AGSC, ATBL, CSNG, STRG, SCAN,
|
DCLN, AGSC, ATBL, CSNG, STRG, SCAN,
|
||||||
PATH, DGRP, HMAP, CTWK, FRME, HINT,
|
PATH, DGRP, HMAP, CTWK, FRME, HINT,
|
||||||
MAPU, DUMB
|
MAPU, DUMB, OIDS,
|
||||||
|
Invalid = 127
|
||||||
};
|
};
|
||||||
|
|
||||||
static ETypeTable FourCCToTypeIdx(FourCC fcc);
|
static ETypeTable FourCCToTypeIdx(FourCC fcc);
|
||||||
|
|
|
@ -7,8 +7,12 @@ static logvisor::Module Log("urde::CPakFile");
|
||||||
CPakFile::CPakFile(const std::string& filename, bool buildDepList, bool worldPak)
|
CPakFile::CPakFile(const std::string& filename, bool buildDepList, bool worldPak)
|
||||||
: CDvdFile(filename.c_str())
|
: CDvdFile(filename.c_str())
|
||||||
{
|
{
|
||||||
|
if (!CDvdFile::operator bool())
|
||||||
|
Log.report(logvisor::Fatal, "%s: Unable to open", GetPath().c_str());
|
||||||
x28_24_buildDepList = buildDepList;
|
x28_24_buildDepList = buildDepList;
|
||||||
|
x28_24_buildDepList = true; // Always do this so URDE can rapidly pre-warm shaders
|
||||||
x28_26_worldPak = worldPak;
|
x28_26_worldPak = worldPak;
|
||||||
|
x28_27_stashedInARAM = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SObjectTag* CPakFile::GetResIdByName(const char* name) const
|
const SObjectTag* CPakFile::GetResIdByName(const char* name) const
|
||||||
|
@ -79,7 +83,7 @@ void CPakFile::InitialHeaderLoad()
|
||||||
x4c_resTableCount = r.readUint32Big();
|
x4c_resTableCount = r.readUint32Big();
|
||||||
x48_resTableOffset = u32(r.position());
|
x48_resTableOffset = u32(r.position());
|
||||||
x2c_asyncLoadPhase = EAsyncPhase::DataLoad;
|
x2c_asyncLoadPhase = EAsyncPhase::DataLoad;
|
||||||
u32 newSize = ROUND_UP_32(x4c_resTableCount * 16 + x48_resTableOffset);
|
u32 newSize = ROUND_UP_32(x4c_resTableCount * 20 + x48_resTableOffset);
|
||||||
u32 origSize = u32(x38_headerData.size());
|
u32 origSize = u32(x38_headerData.size());
|
||||||
if (newSize > origSize)
|
if (newSize > origSize)
|
||||||
{
|
{
|
||||||
|
@ -103,10 +107,10 @@ void CPakFile::Warmup()
|
||||||
|
|
||||||
const CPakFile::SResInfo* CPakFile::GetResInfoForLoadPreferForward(CAssetId id) const
|
const CPakFile::SResInfo* CPakFile::GetResInfoForLoadPreferForward(CAssetId id) const
|
||||||
{
|
{
|
||||||
if (!x28_27_worldPakInitialized)
|
if (x28_27_stashedInARAM)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
auto search = std::lower_bound(x74_resList.begin(), x74_resList.end(), id,
|
auto search = rstl::binary_find(x74_resList.begin(), x74_resList.end(), id,
|
||||||
[](const SResInfo& left, const CAssetId& right) { return left.x0_id < right; });
|
[](const SResInfo& test) { return test.x0_id; });
|
||||||
if (search == x74_resList.end())
|
if (search == x74_resList.end())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
const SResInfo* bestInfo = &*search;
|
const SResInfo* bestInfo = &*search;
|
||||||
|
@ -130,10 +134,10 @@ const CPakFile::SResInfo* CPakFile::GetResInfoForLoadPreferForward(CAssetId id)
|
||||||
|
|
||||||
const CPakFile::SResInfo* CPakFile::GetResInfoForLoadDirectionless(CAssetId id) const
|
const CPakFile::SResInfo* CPakFile::GetResInfoForLoadDirectionless(CAssetId id) const
|
||||||
{
|
{
|
||||||
if (!x28_27_worldPakInitialized)
|
if (x28_27_stashedInARAM)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
auto search = std::lower_bound(x74_resList.begin(), x74_resList.end(), id,
|
auto search = rstl::binary_find(x74_resList.begin(), x74_resList.end(), id,
|
||||||
[](const SResInfo& left, const CAssetId& right) { return left.x0_id < right; });
|
[](const SResInfo& test) { return test.x0_id; });
|
||||||
if (search == x74_resList.end())
|
if (search == x74_resList.end())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
const SResInfo* bestInfo = &*search;
|
const SResInfo* bestInfo = &*search;
|
||||||
|
@ -158,7 +162,7 @@ const CPakFile::SResInfo* CPakFile::GetResInfo(CAssetId id) const
|
||||||
{
|
{
|
||||||
if (x2c_asyncLoadPhase != EAsyncPhase::Loaded)
|
if (x2c_asyncLoadPhase != EAsyncPhase::Loaded)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
if (!x28_27_worldPakInitialized)
|
if (x28_27_stashedInARAM)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
auto search = rstl::binary_find(x74_resList.begin(), x74_resList.end(), id,
|
auto search = rstl::binary_find(x74_resList.begin(), x74_resList.end(), id,
|
||||||
[](const SResInfo& i) { return i.x0_id; });
|
[](const SResInfo& i) { return i.x0_id; });
|
||||||
|
@ -171,7 +175,7 @@ void CPakFile::AsyncIdle()
|
||||||
{
|
{
|
||||||
if (x2c_asyncLoadPhase == EAsyncPhase::Loaded)
|
if (x2c_asyncLoadPhase == EAsyncPhase::Loaded)
|
||||||
return;
|
return;
|
||||||
if (x30_dvdReq && x30_dvdReq->IsComplete())
|
if (x30_dvdReq && !x30_dvdReq->IsComplete())
|
||||||
return;
|
return;
|
||||||
switch (x2c_asyncLoadPhase)
|
switch (x2c_asyncLoadPhase)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,7 +44,7 @@ private:
|
||||||
bool x28_24_buildDepList;
|
bool x28_24_buildDepList;
|
||||||
bool x28_25_aramFile;
|
bool x28_25_aramFile;
|
||||||
bool x28_26_worldPak;
|
bool x28_26_worldPak;
|
||||||
bool x28_27_worldPakInitialized;
|
bool x28_27_stashedInARAM;
|
||||||
};
|
};
|
||||||
u32 _dummy = 0;
|
u32 _dummy = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
static logvisor::Module Log("CResFactory");
|
||||||
|
|
||||||
void CResFactory::AddToLoadList(SLoadingData&& data)
|
void CResFactory::AddToLoadList(SLoadingData&& data)
|
||||||
{
|
{
|
||||||
|
@ -11,19 +12,22 @@ void CResFactory::AddToLoadList(SLoadingData&& data)
|
||||||
|
|
||||||
CFactoryFnReturn CResFactory::BuildSync(const SObjectTag& tag, const CVParamTransfer& xfer, CObjectReference* selfRef)
|
CFactoryFnReturn CResFactory::BuildSync(const SObjectTag& tag, const CVParamTransfer& xfer, CObjectReference* selfRef)
|
||||||
{
|
{
|
||||||
|
CFactoryFnReturn ret;
|
||||||
if (x5c_factoryMgr.CanMakeMemory(tag))
|
if (x5c_factoryMgr.CanMakeMemory(tag))
|
||||||
{
|
{
|
||||||
std::unique_ptr<uint8_t[]> data;
|
std::unique_ptr<uint8_t[]> data;
|
||||||
int size;
|
int size;
|
||||||
x4_loader.LoadMemResourceSync(tag, data, &size);
|
x4_loader.LoadMemResourceSync(tag, data, &size);
|
||||||
return x5c_factoryMgr.MakeObjectFromMemory(tag, std::move(data), size,
|
ret = x5c_factoryMgr.MakeObjectFromMemory(tag, std::move(data), size,
|
||||||
x4_loader.GetResourceCompression(tag), xfer, selfRef);
|
x4_loader.GetResourceCompression(tag), xfer, selfRef);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto rp = x4_loader.LoadNewResourceSync(tag, nullptr);
|
auto rp = x4_loader.LoadNewResourceSync(tag, nullptr);
|
||||||
return x5c_factoryMgr.MakeObject(tag, *rp, xfer, selfRef);
|
ret = x5c_factoryMgr.MakeObject(tag, *rp, xfer, selfRef);
|
||||||
}
|
}
|
||||||
|
Log.report(logvisor::Warning, "sync-built %.4s %08X", tag.type.getChars(), tag.id.Value());
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CResFactory::PumpResource(SLoadingData& data)
|
bool CResFactory::PumpResource(SLoadingData& data)
|
||||||
|
@ -34,6 +38,7 @@ bool CResFactory::PumpResource(SLoadingData& data)
|
||||||
x5c_factoryMgr.MakeObjectFromMemory(data.x0_tag, std::move(data.x10_loadBuffer),
|
x5c_factoryMgr.MakeObjectFromMemory(data.x0_tag, std::move(data.x10_loadBuffer),
|
||||||
data.x14_resSize, data.m_compressed, data.x18_cvXfer,
|
data.x14_resSize, data.m_compressed, data.x18_cvXfer,
|
||||||
data.m_selfRef);
|
data.m_selfRef);
|
||||||
|
Log.report(logvisor::Info, "async-built %.4s %08X", data.x0_tag.type.getChars(), data.x0_tag.id.Value());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -60,13 +65,15 @@ void CResFactory::BuildAsync(const SObjectTag& tag, const CVParamTransfer& xfer,
|
||||||
{
|
{
|
||||||
SLoadingData data(tag, target, xfer, x4_loader.GetResourceCompression(tag), selfRef);
|
SLoadingData data(tag, target, xfer, x4_loader.GetResourceCompression(tag), selfRef);
|
||||||
data.x10_loadBuffer = std::unique_ptr<u8[]>(new u8[x4_loader.ResourceSize(tag)]);
|
data.x10_loadBuffer = std::unique_ptr<u8[]>(new u8[x4_loader.ResourceSize(tag)]);
|
||||||
x4_loader.LoadResourceAsync(tag, data.x10_loadBuffer.get());
|
data.x8_dvdReq = x4_loader.LoadResourceAsync(tag, data.x10_loadBuffer.get());
|
||||||
AddToLoadList(std::move(data));
|
AddToLoadList(std::move(data));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CResFactory::AsyncIdle()
|
void CResFactory::AsyncIdle()
|
||||||
{
|
{
|
||||||
|
if (m_loadList.empty())
|
||||||
|
return;
|
||||||
auto startTime = std::chrono::steady_clock::now();
|
auto startTime = std::chrono::steady_clock::now();
|
||||||
while (std::chrono::duration_cast<std::chrono::milliseconds>(
|
while (std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
std::chrono::steady_clock::now() - startTime).count() < 2)
|
std::chrono::steady_clock::now() - startTime).count() < 2)
|
||||||
|
|
|
@ -69,6 +69,16 @@ public:
|
||||||
return x4_loader.LoadResourcePartSync(tag, size, off);
|
return x4_loader.LoadResourcePartSync(tag, size, off);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<IDvdRequest> LoadResourceAsync(const urde::SObjectTag& tag, void* target)
|
||||||
|
{
|
||||||
|
return x4_loader.LoadResourceAsync(tag, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<IDvdRequest> LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, void* target)
|
||||||
|
{
|
||||||
|
return x4_loader.LoadResourcePartAsync(tag, size, off, target);
|
||||||
|
}
|
||||||
|
|
||||||
const SObjectTag* GetResourceIdByName(const char* name) const
|
const SObjectTag* GetResourceIdByName(const char* name) const
|
||||||
{
|
{
|
||||||
return x4_loader.GetResourceIdByName(name);
|
return x4_loader.GetResourceIdByName(name);
|
||||||
|
@ -97,6 +107,9 @@ public:
|
||||||
void LoadOriginalIDs(CSimplePool& sp);
|
void LoadOriginalIDs(CSimplePool& sp);
|
||||||
CAssetId TranslateOriginalToNew(CAssetId id) const;
|
CAssetId TranslateOriginalToNew(CAssetId id) const;
|
||||||
CAssetId TranslateNewToOriginal(CAssetId id) const;
|
CAssetId TranslateNewToOriginal(CAssetId id) const;
|
||||||
|
|
||||||
|
CResLoader* GetResLoader() { return &x4_loader; }
|
||||||
|
CFactoryMgr* GetFactoryMgr() { return &x5c_factoryMgr; }
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
namespace urde
|
namespace urde
|
||||||
{
|
{
|
||||||
|
static logvisor::Module Log("CResLoader");
|
||||||
|
|
||||||
CResLoader::CResLoader()
|
CResLoader::CResLoader()
|
||||||
{
|
{
|
||||||
|
@ -18,12 +19,12 @@ const std::vector<CAssetId>* CResLoader::GetTagListForFile(const std::string& na
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CResLoader::AddPakFileAsync(const std::string& name, bool samusPak, bool worldPak)
|
void CResLoader::AddPakFileAsync(const std::string& name, bool buildDepList, bool worldPak)
|
||||||
{
|
{
|
||||||
std::string namePak = name + ".upak";
|
std::string namePak = name + ".upak";
|
||||||
if (CDvdFile::FileExists(namePak.c_str()))
|
if (CDvdFile::FileExists(namePak.c_str()))
|
||||||
{
|
{
|
||||||
x30_pakLoadingList.emplace_back(new CPakFile(namePak, samusPak, worldPak));
|
x30_pakLoadingList.emplace_back(new CPakFile(namePak, buildDepList, worldPak));
|
||||||
++x44_pakLoadingCount;
|
++x44_pakLoadingCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,11 +32,16 @@ void CResLoader::AddPakFileAsync(const std::string& name, bool samusPak, bool wo
|
||||||
void CResLoader::AddPakFile(const std::string& name, bool samusPak, bool worldPak)
|
void CResLoader::AddPakFile(const std::string& name, bool samusPak, bool worldPak)
|
||||||
{
|
{
|
||||||
AddPakFileAsync(name, samusPak, worldPak);
|
AddPakFileAsync(name, samusPak, worldPak);
|
||||||
|
WaitForPakFileLoadingComplete();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CResLoader::WaitForPakFileLoadingComplete()
|
||||||
|
{
|
||||||
while (x44_pakLoadingCount)
|
while (x44_pakLoadingCount)
|
||||||
AsyncIdlePakLoading();
|
AsyncIdlePakLoading();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<CInputStream> CResLoader::LoadNewResourcePartSync(const SObjectTag& tag, int offset, int length, void* extBuf)
|
std::unique_ptr<CInputStream> CResLoader::LoadNewResourcePartSync(const SObjectTag& tag, u32 length, u32 offset, void* extBuf)
|
||||||
{
|
{
|
||||||
void* buf = extBuf;
|
void* buf = extBuf;
|
||||||
CPakFile* file = FindResourceForLoad(tag);
|
CPakFile* file = FindResourceForLoad(tag);
|
||||||
|
@ -83,7 +89,7 @@ std::unique_ptr<CInputStream> CResLoader::LoadNewResourceSync(const SObjectTag&
|
||||||
return std::unique_ptr<CInputStream>(newStrm);
|
return std::unique_ptr<CInputStream>(newStrm);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<IDvdRequest> CResLoader::LoadResourcePartAsync(const SObjectTag& tag, int offset, int length, void* buf)
|
std::shared_ptr<IDvdRequest> CResLoader::LoadResourcePartAsync(const SObjectTag& tag, u32 length, u32 offset, void* buf)
|
||||||
{
|
{
|
||||||
return FindResourceForLoad(tag.id)->AsyncSeekRead(buf, length,
|
return FindResourceForLoad(tag.id)->AsyncSeekRead(buf, length,
|
||||||
ESeekOrigin::Begin, x50_cachedResInfo->GetOffset() + offset);
|
ESeekOrigin::Begin, x50_cachedResInfo->GetOffset() + offset);
|
||||||
|
@ -187,6 +193,7 @@ bool CResLoader::FindResource(CAssetId id) const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log.report(logvisor::Fatal, "Unable to find asset %08X", id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,6 +214,7 @@ CPakFile* CResLoader::FindResourceForLoad(CAssetId id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log.report(logvisor::Fatal, "Unable to find asset %08X", id);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,13 +26,14 @@ class CResLoader
|
||||||
public:
|
public:
|
||||||
CResLoader();
|
CResLoader();
|
||||||
const std::vector<CAssetId>* GetTagListForFile(const std::string& name) const;
|
const std::vector<CAssetId>* GetTagListForFile(const std::string& name) const;
|
||||||
void AddPakFileAsync(const std::string& name, bool samusPak, bool worldPak);
|
void AddPakFileAsync(const std::string& name, bool buildDepList, bool worldPak);
|
||||||
void AddPakFile(const std::string& name, bool samusPak, bool worldPak);
|
void AddPakFile(const std::string& name, bool samusPak, bool worldPak);
|
||||||
std::unique_ptr<CInputStream> LoadNewResourcePartSync(const SObjectTag& tag, int offset, int length, void* extBuf);
|
void WaitForPakFileLoadingComplete();
|
||||||
|
std::unique_ptr<CInputStream> LoadNewResourcePartSync(const SObjectTag& tag, u32 length, u32 offset, void* extBuf);
|
||||||
void LoadMemResourceSync(const SObjectTag& tag, std::unique_ptr<u8[]>& bufOut, int* sizeOut);
|
void LoadMemResourceSync(const SObjectTag& tag, std::unique_ptr<u8[]>& bufOut, int* sizeOut);
|
||||||
std::unique_ptr<CInputStream> LoadResourceFromMemorySync(const SObjectTag& tag, const void* buf);
|
std::unique_ptr<CInputStream> LoadResourceFromMemorySync(const SObjectTag& tag, const void* buf);
|
||||||
std::unique_ptr<CInputStream> LoadNewResourceSync(const SObjectTag& tag, void* extBuf=nullptr);
|
std::unique_ptr<CInputStream> LoadNewResourceSync(const SObjectTag& tag, void* extBuf=nullptr);
|
||||||
std::shared_ptr<IDvdRequest> LoadResourcePartAsync(const SObjectTag& tag, int offset, int length, void* buf);
|
std::shared_ptr<IDvdRequest> LoadResourcePartAsync(const SObjectTag& tag, u32 length, u32 offset, void* buf);
|
||||||
std::shared_ptr<IDvdRequest> LoadResourceAsync(const SObjectTag& tag, void* buf);
|
std::shared_ptr<IDvdRequest> LoadResourceAsync(const SObjectTag& tag, void* buf);
|
||||||
std::unique_ptr<u8[]> LoadResourceSync(const urde::SObjectTag& tag);
|
std::unique_ptr<u8[]> LoadResourceSync(const urde::SObjectTag& tag);
|
||||||
std::unique_ptr<u8[]> LoadResourcePartSync(const urde::SObjectTag& tag, u32 size, u32 off);
|
std::unique_ptr<u8[]> LoadResourcePartSync(const urde::SObjectTag& tag, u32 size, u32 off);
|
||||||
|
|
|
@ -60,17 +60,17 @@ u32 CCharacterFactoryBuilder::CDummyFactory::ResourceSize(const urde::SObjectTag
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCharacterFactoryBuilder::CDummyFactory::LoadResourceAsync(const urde::SObjectTag& tag,
|
std::shared_ptr<IDvdRequest> CCharacterFactoryBuilder::CDummyFactory::LoadResourceAsync(const urde::SObjectTag& tag,
|
||||||
std::unique_ptr<u8[]>& target)
|
void* target)
|
||||||
{
|
{
|
||||||
return false;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCharacterFactoryBuilder::CDummyFactory::LoadResourcePartAsync(const urde::SObjectTag& tag,
|
std::shared_ptr<IDvdRequest> CCharacterFactoryBuilder::CDummyFactory::LoadResourcePartAsync(const urde::SObjectTag& tag,
|
||||||
u32 size, u32 off,
|
u32 size, u32 off,
|
||||||
std::unique_ptr<u8[]>& target)
|
void* target)
|
||||||
{
|
{
|
||||||
return false;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<u8[]> CCharacterFactoryBuilder::CDummyFactory::LoadResourceSync(const urde::SObjectTag& tag)
|
std::unique_ptr<u8[]> CCharacterFactoryBuilder::CDummyFactory::LoadResourceSync(const urde::SObjectTag& tag)
|
||||||
|
|
|
@ -28,8 +28,8 @@ public:
|
||||||
void EnumerateNamedResources(const std::function<bool(const std::string&, const SObjectTag&)>& lambda) const;
|
void EnumerateNamedResources(const std::function<bool(const std::string&, const SObjectTag&)>& lambda) const;
|
||||||
|
|
||||||
u32 ResourceSize(const urde::SObjectTag& tag);
|
u32 ResourceSize(const urde::SObjectTag& tag);
|
||||||
bool LoadResourceAsync(const urde::SObjectTag& tag, std::unique_ptr<u8[]>& target);
|
std::shared_ptr<IDvdRequest> LoadResourceAsync(const urde::SObjectTag& tag, void* target);
|
||||||
bool LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, std::unique_ptr<u8[]>& target);
|
std::shared_ptr<IDvdRequest> LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, void* target);
|
||||||
std::unique_ptr<u8[]> LoadResourceSync(const urde::SObjectTag& tag);
|
std::unique_ptr<u8[]> LoadResourceSync(const urde::SObjectTag& tag);
|
||||||
std::unique_ptr<u8[]> LoadResourcePartSync(const urde::SObjectTag& tag, u32 size, u32 off);
|
std::unique_ptr<u8[]> LoadResourcePartSync(const urde::SObjectTag& tag, u32 size, u32 off);
|
||||||
};
|
};
|
||||||
|
|
|
@ -88,17 +88,17 @@ u32 CCharacterFactory::CDummyFactory::ResourceSize(const urde::SObjectTag& tag)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCharacterFactory::CDummyFactory::LoadResourceAsync(const urde::SObjectTag& tag,
|
std::shared_ptr<IDvdRequest> CCharacterFactory::CDummyFactory::LoadResourceAsync(const urde::SObjectTag& tag,
|
||||||
std::unique_ptr<u8[]>& target)
|
void* target)
|
||||||
{
|
{
|
||||||
return false;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCharacterFactory::CDummyFactory::LoadResourcePartAsync(const urde::SObjectTag& tag,
|
std::shared_ptr<IDvdRequest> CCharacterFactory::CDummyFactory::LoadResourcePartAsync(const urde::SObjectTag& tag,
|
||||||
u32 size, u32 off,
|
u32 size, u32 off,
|
||||||
std::unique_ptr<u8[]>& target)
|
void* target)
|
||||||
{
|
{
|
||||||
return false;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<u8[]> CCharacterFactory::CDummyFactory::LoadResourceSync(const urde::SObjectTag& tag)
|
std::unique_ptr<u8[]> CCharacterFactory::CDummyFactory::LoadResourceSync(const urde::SObjectTag& tag)
|
||||||
|
|
|
@ -37,8 +37,8 @@ public:
|
||||||
void EnumerateNamedResources(const std::function<bool(const std::string&, const SObjectTag&)>& lambda) const;
|
void EnumerateNamedResources(const std::function<bool(const std::string&, const SObjectTag&)>& lambda) const;
|
||||||
|
|
||||||
u32 ResourceSize(const urde::SObjectTag& tag);
|
u32 ResourceSize(const urde::SObjectTag& tag);
|
||||||
bool LoadResourceAsync(const urde::SObjectTag& tag, std::unique_ptr<u8[]>& target);
|
std::shared_ptr<IDvdRequest> LoadResourceAsync(const urde::SObjectTag& tag, void* target);
|
||||||
bool LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, std::unique_ptr<u8[]>& target);
|
std::shared_ptr<IDvdRequest> LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, void* target);
|
||||||
std::unique_ptr<u8[]> LoadResourceSync(const urde::SObjectTag& tag);
|
std::unique_ptr<u8[]> LoadResourceSync(const urde::SObjectTag& tag);
|
||||||
std::unique_ptr<u8[]> LoadResourcePartSync(const urde::SObjectTag& tag, u32 size, u32 off);
|
std::unique_ptr<u8[]> LoadResourcePartSync(const urde::SObjectTag& tag, u32 size, u32 off);
|
||||||
};
|
};
|
||||||
|
|
|
@ -13,6 +13,7 @@ class CObjectReference;
|
||||||
class CResLoader;
|
class CResLoader;
|
||||||
class CFactoryMgr;
|
class CFactoryMgr;
|
||||||
class CSimplePool;
|
class CSimplePool;
|
||||||
|
class IDvdRequest;
|
||||||
|
|
||||||
using CFactoryFnReturn = std::unique_ptr<IObj>;
|
using CFactoryFnReturn = std::unique_ptr<IObj>;
|
||||||
using FFactoryFunc = std::function<CFactoryFnReturn(const urde::SObjectTag& tag,
|
using FFactoryFunc = std::function<CFactoryFnReturn(const urde::SObjectTag& tag,
|
||||||
|
@ -36,15 +37,15 @@ public:
|
||||||
virtual FourCC GetResourceTypeById(CAssetId id) const=0;
|
virtual FourCC GetResourceTypeById(CAssetId id) const=0;
|
||||||
virtual void EnumerateResources(const std::function<bool(const SObjectTag&)>& lambda) const=0;
|
virtual void EnumerateResources(const std::function<bool(const SObjectTag&)>& lambda) const=0;
|
||||||
virtual void EnumerateNamedResources(const std::function<bool(const std::string&, const SObjectTag&)>& lambda) const=0;
|
virtual void EnumerateNamedResources(const std::function<bool(const std::string&, const SObjectTag&)>& lambda) const=0;
|
||||||
virtual CResLoader* GetResLoader() const { return nullptr; }
|
virtual CResLoader* GetResLoader() { return nullptr; }
|
||||||
virtual CFactoryMgr* GetFactoryMgr() const { return nullptr; }
|
virtual CFactoryMgr* GetFactoryMgr() { return nullptr; }
|
||||||
virtual void LoadOriginalIDs(CSimplePool& sp) {}
|
virtual void LoadOriginalIDs(CSimplePool& sp) {}
|
||||||
virtual void AsyncIdle() {}
|
virtual void AsyncIdle() {}
|
||||||
|
|
||||||
/* Non-factory versions, replaces CResLoader */
|
/* Non-factory versions, replaces CResLoader */
|
||||||
virtual u32 ResourceSize(const urde::SObjectTag& tag)=0;
|
virtual u32 ResourceSize(const urde::SObjectTag& tag)=0;
|
||||||
//virtual bool LoadResourceAsync(const urde::SObjectTag& tag, std::unique_ptr<u8[]>& target)=0;
|
virtual std::shared_ptr<IDvdRequest> LoadResourceAsync(const urde::SObjectTag& tag, void* target)=0;
|
||||||
//virtual bool LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, std::unique_ptr<u8[]>& target)=0;
|
virtual std::shared_ptr<IDvdRequest> LoadResourcePartAsync(const urde::SObjectTag& tag, u32 size, u32 off, void* target)=0;
|
||||||
virtual std::unique_ptr<u8[]> LoadResourceSync(const urde::SObjectTag& tag)=0;
|
virtual std::unique_ptr<u8[]> LoadResourceSync(const urde::SObjectTag& tag)=0;
|
||||||
virtual std::unique_ptr<u8[]> LoadResourcePartSync(const urde::SObjectTag& tag, u32 size, u32 off)=0;
|
virtual std::unique_ptr<u8[]> LoadResourcePartSync(const urde::SObjectTag& tag, u32 size, u32 off)=0;
|
||||||
|
|
||||||
|
|
|
@ -149,13 +149,14 @@ atUint64 CZipInputStream::readUBytesToBuf(void *buf, atUint64 len)
|
||||||
{
|
{
|
||||||
x30_zstrm.next_out = (Bytef*)buf;
|
x30_zstrm.next_out = (Bytef*)buf;
|
||||||
x30_zstrm.avail_out = len;
|
x30_zstrm.avail_out = len;
|
||||||
if (!x30_zstrm.avail_in)
|
while (x30_zstrm.avail_out != 0)
|
||||||
{
|
{
|
||||||
atUint64 readSz = x28_strm->readUBytesToBuf(x24_compBuf.get(), 4096);
|
atUint64 readSz = x28_strm->readUBytesToBuf(x24_compBuf.get(), 4096);
|
||||||
x30_zstrm.avail_in = readSz;
|
x30_zstrm.avail_in = readSz;
|
||||||
x30_zstrm.next_in = x24_compBuf.get();
|
x30_zstrm.next_in = x24_compBuf.get();
|
||||||
|
if (inflate(&x30_zstrm, Z_NO_FLUSH) != Z_OK)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
inflate(&x30_zstrm, Z_NO_FLUSH);
|
|
||||||
return x30_zstrm.total_out;
|
return x30_zstrm.total_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,8 +25,8 @@ CPauseScreen::CPauseScreen(ESubScreen subscreen,
|
||||||
{
|
{
|
||||||
SObjectTag frmeTag(FOURCC('FRME'), x54_frmePauseScreenId);
|
SObjectTag frmeTag(FOURCC('FRME'), x54_frmePauseScreenId);
|
||||||
x58_frmePauseScreenBufSz = g_ResFactory->ResourceSize(frmeTag);
|
x58_frmePauseScreenBufSz = g_ResFactory->ResourceSize(frmeTag);
|
||||||
ProjectResourceFactoryBase& resFac = static_cast<ProjectResourceFactoryBase&>(*g_ResFactory);
|
x5c_frmePauseScreenBuf.reset(new u8[x58_frmePauseScreenBufSz]);
|
||||||
x60_loadTok = resFac.LoadResourceAsync(frmeTag, x5c_frmePauseScreenBuf);
|
x60_loadTok = g_ResFactory->LoadResourceAsync(frmeTag, x5c_frmePauseScreenBuf.get());
|
||||||
CSfxManager::SfxStart(1435, 1.f, 0.f, false, 0x7f, false, kInvalidAreaId);
|
CSfxManager::SfxStart(1435, 1.f, 0.f, false, 0x7f, false, kInvalidAreaId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ bool CPauseScreen::CheckLoadComplete(const CStateManager& mgr)
|
||||||
}
|
}
|
||||||
if (x60_loadTok)
|
if (x60_loadTok)
|
||||||
{
|
{
|
||||||
if (!x60_loadTok->m_complete)
|
if (!x60_loadTok->IsComplete())
|
||||||
return false;
|
return false;
|
||||||
for (int i=0 ; i<2 ; ++i)
|
for (int i=0 ; i<2 ; ++i)
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,7 +45,7 @@ private:
|
||||||
CAssetId x54_frmePauseScreenId;
|
CAssetId x54_frmePauseScreenId;
|
||||||
u32 x58_frmePauseScreenBufSz;
|
u32 x58_frmePauseScreenBufSz;
|
||||||
std::unique_ptr<u8[]> x5c_frmePauseScreenBuf;
|
std::unique_ptr<u8[]> x5c_frmePauseScreenBuf;
|
||||||
std::shared_ptr<ProjectResourceFactoryBase::AsyncTask> x60_loadTok;
|
std::shared_ptr<IDvdRequest> x60_loadTok;
|
||||||
rstl::reserved_vector<std::unique_ptr<CGuiFrame>, 2> x64_frameInsts;
|
rstl::reserved_vector<std::unique_ptr<CGuiFrame>, 2> x64_frameInsts;
|
||||||
u32 x78_activeIdx = 0;
|
u32 x78_activeIdx = 0;
|
||||||
rstl::reserved_vector<std::unique_ptr<CPauseScreenBase>, 2> x7c_screens;
|
rstl::reserved_vector<std::unique_ptr<CPauseScreenBase>, 2> x7c_screens;
|
||||||
|
|
|
@ -21,7 +21,7 @@ CIOWin::EMessageReturn CPreFrontEnd::OnMessage(const CArchitectureMessage& msg,
|
||||||
|
|
||||||
CMain* m = static_cast<CMain*>(g_Main);
|
CMain* m = static_cast<CMain*>(g_Main);
|
||||||
if (CResLoader* loader = g_ResFactory->GetResLoader())
|
if (CResLoader* loader = g_ResFactory->GetResLoader())
|
||||||
if (loader->AreAllPaksLoaded())
|
if (!loader->AreAllPaksLoaded())
|
||||||
return EMessageReturn::Exit;
|
return EMessageReturn::Exit;
|
||||||
if (!x14_resourceTweaksRegistered)
|
if (!x14_resourceTweaksRegistered)
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,93 +38,91 @@ static const SObjectTag& IDFromFactory(CResFactory& factory, const char* name)
|
||||||
|
|
||||||
void CTweaks::RegisterTweaks()
|
void CTweaks::RegisterTweaks()
|
||||||
{
|
{
|
||||||
ProjectResourceFactoryMP1& factory = ProjectManager::g_SharedManager->resourceFactoryMP1();
|
|
||||||
std::experimental::optional<CMemoryInStream> strm;
|
std::experimental::optional<CMemoryInStream> strm;
|
||||||
const SObjectTag* tag;
|
const SObjectTag* tag;
|
||||||
|
|
||||||
/* Particle */
|
/* Particle */
|
||||||
tag = factory.GetResourceIdByName("Particle");
|
tag = g_ResFactory->GetResourceIdByName("Particle");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakParticle = new DataSpec::DNAMP1::CTweakParticle(*strm);
|
g_tweakParticle = new DataSpec::DNAMP1::CTweakParticle(*strm);
|
||||||
|
|
||||||
/* Player */
|
/* Player */
|
||||||
tag = factory.GetResourceIdByName("Player");
|
tag = g_ResFactory->GetResourceIdByName("Player");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakPlayer = new DataSpec::DNAMP1::CTweakPlayer(*strm);
|
g_tweakPlayer = new DataSpec::DNAMP1::CTweakPlayer(*strm);
|
||||||
|
|
||||||
/* CameraBob */
|
/* CameraBob */
|
||||||
tag = factory.GetResourceIdByName("CameraBob");
|
tag = g_ResFactory->GetResourceIdByName("CameraBob");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
CPlayerCameraBob::ReadTweaks(*strm);
|
CPlayerCameraBob::ReadTweaks(*strm);
|
||||||
|
|
||||||
/* Ball */
|
/* Ball */
|
||||||
tag = factory.GetResourceIdByName("Ball");
|
tag = g_ResFactory->GetResourceIdByName("Ball");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakBall = new DataSpec::DNAMP1::CTweakBall(*strm);
|
g_tweakBall = new DataSpec::DNAMP1::CTweakBall(*strm);
|
||||||
|
|
||||||
/* PlayerGun */
|
/* PlayerGun */
|
||||||
tag = factory.GetResourceIdByName("PlayerGun");
|
tag = g_ResFactory->GetResourceIdByName("PlayerGun");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakPlayerGun = new DataSpec::DNAMP1::CTweakPlayerGun(*strm);
|
g_tweakPlayerGun = new DataSpec::DNAMP1::CTweakPlayerGun(*strm);
|
||||||
|
|
||||||
/* Targeting */
|
/* Targeting */
|
||||||
tag = factory.GetResourceIdByName("Targeting");
|
tag = g_ResFactory->GetResourceIdByName("Targeting");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakTargeting = new DataSpec::DNAMP1::CTweakTargeting(*strm);
|
g_tweakTargeting = new DataSpec::DNAMP1::CTweakTargeting(*strm);
|
||||||
|
|
||||||
/* Game */
|
/* Game */
|
||||||
tag = factory.GetResourceIdByName("Game");
|
tag = g_ResFactory->GetResourceIdByName("Game");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakGame = new DataSpec::DNAMP1::CTweakGame(*strm);
|
g_tweakGame = new DataSpec::DNAMP1::CTweakGame(*strm);
|
||||||
|
|
||||||
/* GuiColors */
|
/* GuiColors */
|
||||||
tag = factory.GetResourceIdByName("GuiColors");
|
tag = g_ResFactory->GetResourceIdByName("GuiColors");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakGuiColors = new DataSpec::DNAMP1::CTweakGuiColors(*strm);
|
g_tweakGuiColors = new DataSpec::DNAMP1::CTweakGuiColors(*strm);
|
||||||
|
|
||||||
/* AutoMapper */
|
/* AutoMapper */
|
||||||
tag = factory.GetResourceIdByName("AutoMapper");
|
tag = g_ResFactory->GetResourceIdByName("AutoMapper");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakAutoMapper = new DataSpec::DNAMP1::CTweakAutoMapper(*strm);
|
g_tweakAutoMapper = new DataSpec::DNAMP1::CTweakAutoMapper(*strm);
|
||||||
CMappableObject::ReadAutoMapperTweaks(*g_tweakAutoMapper);
|
CMappableObject::ReadAutoMapperTweaks(*g_tweakAutoMapper);
|
||||||
|
|
||||||
/* Gui */
|
/* Gui */
|
||||||
tag = factory.GetResourceIdByName("Gui");
|
tag = g_ResFactory->GetResourceIdByName("Gui");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakGui = new DataSpec::DNAMP1::CTweakGui(*strm);
|
g_tweakGui = new DataSpec::DNAMP1::CTweakGui(*strm);
|
||||||
|
|
||||||
/* PlayerControls */
|
/* PlayerControls */
|
||||||
tag = factory.GetResourceIdByName("PlayerControls");
|
tag = g_ResFactory->GetResourceIdByName("PlayerControls");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakPlayerControl = new DataSpec::DNAMP1::CTweakPlayerControl(*strm);
|
g_tweakPlayerControl = new DataSpec::DNAMP1::CTweakPlayerControl(*strm);
|
||||||
|
|
||||||
/* PlayerControls2 */
|
/* PlayerControls2 */
|
||||||
tag = factory.GetResourceIdByName("PlayerControls2");
|
tag = g_ResFactory->GetResourceIdByName("PlayerControls2");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakPlayerControlAlt = new DataSpec::DNAMP1::CTweakPlayerControl(*strm);
|
g_tweakPlayerControlAlt = new DataSpec::DNAMP1::CTweakPlayerControl(*strm);
|
||||||
|
|
||||||
g_currentPlayerControl = g_tweakPlayerControl;
|
g_currentPlayerControl = g_tweakPlayerControl;
|
||||||
|
|
||||||
/* SlideShow */
|
/* SlideShow */
|
||||||
tag = factory.GetResourceIdByName("SlideShow");
|
tag = g_ResFactory->GetResourceIdByName("SlideShow");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakSlideShow = new DataSpec::DNAMP1::CTweakSlideShow(*strm);
|
g_tweakSlideShow = new DataSpec::DNAMP1::CTweakSlideShow(*strm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CTweaks::RegisterResourceTweaks()
|
void CTweaks::RegisterResourceTweaks()
|
||||||
{
|
{
|
||||||
ProjectResourceFactoryMP1& factory = ProjectManager::g_SharedManager->resourceFactoryMP1();
|
|
||||||
std::experimental::optional<CMemoryInStream> strm;
|
std::experimental::optional<CMemoryInStream> strm;
|
||||||
|
|
||||||
const SObjectTag* tag = factory.GetResourceIdByName("GunRes");
|
const SObjectTag* tag = g_ResFactory->GetResourceIdByName("GunRes");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakGunRes = new DataSpec::DNAMP1::CTweakGunRes(*strm);
|
g_tweakGunRes = new DataSpec::DNAMP1::CTweakGunRes(*strm);
|
||||||
g_tweakGunRes->ResolveResources(factory);
|
g_tweakGunRes->ResolveResources(*g_ResFactory);
|
||||||
|
|
||||||
tag = factory.GetResourceIdByName("PlayerRes");
|
tag = g_ResFactory->GetResourceIdByName("PlayerRes");
|
||||||
strm.emplace(factory.LoadResourceSync(*tag).release(), factory.ResourceSize(*tag));
|
strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true);
|
||||||
g_tweakPlayerRes = new DataSpec::DNAMP1::CTweakPlayerRes(*strm);
|
g_tweakPlayerRes = new DataSpec::DNAMP1::CTweakPlayerRes(*strm);
|
||||||
g_tweakPlayerRes->ResolveResources(factory);
|
g_tweakPlayerRes->ResolveResources(*g_ResFactory);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -296,6 +296,8 @@ void CGameGlobalObjects::AddPaksAndFactories()
|
||||||
loader->AddPakFileAsync("SamGunFx", true, false);
|
loader->AddPakFileAsync("SamGunFx", true, false);
|
||||||
loader->AddPakFileAsync("MidiData", false, false);
|
loader->AddPakFileAsync("MidiData", false, false);
|
||||||
loader->AddPakFileAsync("GGuiSys", false, false);
|
loader->AddPakFileAsync("GGuiSys", false, false);
|
||||||
|
loader->AddPakFileAsync("!original_ids", false, false);
|
||||||
|
loader->WaitForPakFileLoadingComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CFactoryMgr* fmgr = g_ResFactory->GetFactoryMgr())
|
if (CFactoryMgr* fmgr = g_ResFactory->GetFactoryMgr())
|
||||||
|
@ -333,16 +335,19 @@ void CGameGlobalObjects::AddPaksAndFactories()
|
||||||
|
|
||||||
void CMain::AddWorldPaks()
|
void CMain::AddWorldPaks()
|
||||||
{
|
{
|
||||||
|
CResLoader* loader = g_ResFactory->GetResLoader();
|
||||||
|
if (!loader)
|
||||||
|
return;
|
||||||
auto& pakPrefix = g_tweakGame->GetWorldPrefix();
|
auto& pakPrefix = g_tweakGame->GetWorldPrefix();
|
||||||
for (int i=0 ; i<9 ; ++i)
|
for (int i=0 ; i<9 ; ++i)
|
||||||
{
|
{
|
||||||
std::string path = pakPrefix;
|
std::string path = pakPrefix;
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
path += '0' + i;
|
path += '0' + i;
|
||||||
if (CDvdFile::FileExists(path.c_str()))
|
if (CDvdFile::FileExists((path + ".upak").c_str()))
|
||||||
if (CResLoader* loader = g_ResFactory->GetResLoader())
|
loader->AddPakFileAsync(path, false, true);
|
||||||
loader->AddPakFileAsync(path, false, true);
|
|
||||||
}
|
}
|
||||||
|
loader->WaitForPakFileLoadingComplete();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMain::ResetGameState()
|
void CMain::ResetGameState()
|
||||||
|
@ -449,16 +454,24 @@ void CMain::WarmupShaders()
|
||||||
});
|
});
|
||||||
m_warmupTags.reserve(modelCount);
|
m_warmupTags.reserve(modelCount);
|
||||||
|
|
||||||
|
std::unordered_set<SObjectTag> addedTags;
|
||||||
|
addedTags.reserve(modelCount);
|
||||||
|
|
||||||
g_ResFactory->EnumerateResources([&](const SObjectTag& tag)
|
g_ResFactory->EnumerateResources([&](const SObjectTag& tag)
|
||||||
{
|
{
|
||||||
if (tag.type == FOURCC('CMDL') || tag.type == FOURCC('MREA'))
|
if (tag.type == FOURCC('CMDL') || tag.type == FOURCC('MREA'))
|
||||||
|
{
|
||||||
|
if (addedTags.find(tag) != addedTags.end())
|
||||||
|
return true;
|
||||||
|
addedTags.insert(tag);
|
||||||
m_warmupTags.push_back(tag);
|
m_warmupTags.push_back(tag);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
m_warmupIt = m_warmupTags.begin();
|
m_warmupIt = m_warmupTags.begin();
|
||||||
|
|
||||||
WarmupLog.report(logvisor::Info, "Began warmup of %" PRISize " objects", modelCount);
|
WarmupLog.report(logvisor::Info, "Began warmup of %" PRISize " objects", m_warmupTags.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMain::Proc()
|
bool CMain::Proc()
|
||||||
|
|
|
@ -416,7 +416,7 @@ CGameArea::CGameArea(CAssetId mreaId)
|
||||||
{
|
{
|
||||||
while (StartStreamingMainArea())
|
while (StartStreamingMainArea())
|
||||||
for (auto& req : xf8_loadTransactions)
|
for (auto& req : xf8_loadTransactions)
|
||||||
req->WaitForComplete();
|
req->WaitUntilComplete();
|
||||||
|
|
||||||
MREAHeader header = VerifyHeader();
|
MREAHeader header = VerifyHeader();
|
||||||
x12c_postConstructed->x4c_insts.resize(header.modelCount);
|
x12c_postConstructed->x4c_insts.resize(header.modelCount);
|
||||||
|
@ -794,8 +794,7 @@ u32 CGameArea::GetNumPartSizes() const
|
||||||
void CGameArea::AllocNewAreaData(int offset, int size)
|
void CGameArea::AllocNewAreaData(int offset, int size)
|
||||||
{
|
{
|
||||||
x110_mreaSecBufs.emplace_back(std::unique_ptr<u8[]>(new u8[size]), size);
|
x110_mreaSecBufs.emplace_back(std::unique_ptr<u8[]>(new u8[size]), size);
|
||||||
xf8_loadTransactions.push_back(
|
xf8_loadTransactions.push_back(g_ResFactory->
|
||||||
static_cast<ProjectResourceFactoryBase*>(g_ResFactory)->
|
|
||||||
LoadResourcePartAsync(SObjectTag{FOURCC('MREA'), x84_mrea}, size, offset,
|
LoadResourcePartAsync(SObjectTag{FOURCC('MREA'), x84_mrea}, size, offset,
|
||||||
x110_mreaSecBufs.back().first.get()));
|
x110_mreaSecBufs.back().first.get()));
|
||||||
}
|
}
|
||||||
|
@ -809,7 +808,7 @@ void CGameArea::CullDeadAreaRequests()
|
||||||
{
|
{
|
||||||
for (auto it = xf8_loadTransactions.begin() ; it != xf8_loadTransactions.end() ;)
|
for (auto it = xf8_loadTransactions.begin() ; it != xf8_loadTransactions.end() ;)
|
||||||
{
|
{
|
||||||
if ((*it)->m_complete)
|
if ((*it)->IsComplete())
|
||||||
{
|
{
|
||||||
it = xf8_loadTransactions.erase(it);
|
it = xf8_loadTransactions.erase(it);
|
||||||
continue;
|
continue;
|
||||||
|
@ -856,7 +855,7 @@ void CGameArea::Validate(CStateManager& mgr)
|
||||||
while (StartStreamingMainArea()) {}
|
while (StartStreamingMainArea()) {}
|
||||||
|
|
||||||
for (auto& req : xf8_loadTransactions)
|
for (auto& req : xf8_loadTransactions)
|
||||||
req->WaitForComplete();
|
req->WaitUntilComplete();
|
||||||
|
|
||||||
if (xdc_tokens.empty())
|
if (xdc_tokens.empty())
|
||||||
{
|
{
|
||||||
|
|
|
@ -123,7 +123,7 @@ class CGameArea : public IGameArea
|
||||||
WaitForFinish
|
WaitForFinish
|
||||||
} xf4_phase = EPhase::LoadHeader;
|
} xf4_phase = EPhase::LoadHeader;
|
||||||
|
|
||||||
std::list<std::shared_ptr<ProjectResourceFactoryBase::AsyncTask>> xf8_loadTransactions;
|
std::list<std::shared_ptr<IDvdRequest>> xf8_loadTransactions;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,8 @@ CWorld::CSoundGroupData::CSoundGroupData(int grpId, CAssetId agsc) : x0_groupId(
|
||||||
CDummyWorld::CDummyWorld(CAssetId mlvlId, bool loadMap) : x4_loadMap(loadMap), xc_mlvlId(mlvlId)
|
CDummyWorld::CDummyWorld(CAssetId mlvlId, bool loadMap) : x4_loadMap(loadMap), xc_mlvlId(mlvlId)
|
||||||
{
|
{
|
||||||
SObjectTag tag{FOURCC('MLVL'), mlvlId};
|
SObjectTag tag{FOURCC('MLVL'), mlvlId};
|
||||||
static_cast<ProjectResourceFactoryBase*>(g_ResFactory)->LoadResourceAsync(tag, x34_loadBuf);
|
x34_loadBuf.reset(new u8[g_ResFactory->ResourceSize(tag)]);
|
||||||
|
g_ResFactory->LoadResourceAsync(tag, x34_loadBuf.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
CAssetId CDummyWorld::IGetWorldAssetId() const { return xc_mlvlId; }
|
CAssetId CDummyWorld::IGetWorldAssetId() const { return xc_mlvlId; }
|
||||||
|
@ -186,7 +187,8 @@ CWorld::CWorld(IObjectStore& objStore, IFactory& resFactory, CAssetId mlvlId)
|
||||||
{
|
{
|
||||||
x70_24_currentAreaNeedsAllocation = true;
|
x70_24_currentAreaNeedsAllocation = true;
|
||||||
SObjectTag tag{FOURCC('MLVL'), mlvlId};
|
SObjectTag tag{FOURCC('MLVL'), mlvlId};
|
||||||
static_cast<ProjectResourceFactoryBase&>(resFactory).LoadResourceAsync(tag, x40_loadBuf);
|
x40_loadBuf.reset(new u8[resFactory.ResourceSize(tag)]);
|
||||||
|
resFactory.LoadResourceAsync(tag, x40_loadBuf.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
CAssetId CWorld::IGetWorldAssetId() const { return x8_mlvlId; }
|
CAssetId CWorld::IGetWorldAssetId() const { return x8_mlvlId; }
|
||||||
|
|
2
hecl
2
hecl
|
@ -1 +1 @@
|
||||||
Subproject commit 038917dc59aaf50efed8925ff5fd53d62fd8cfe8
|
Subproject commit e6f5ea29c23008f5eb4aa353b4adc8a82b4a0332
|
Loading…
Reference in New Issue