various implementation

This commit is contained in:
Jack Andersen 2015-08-22 20:42:29 -10:00
parent 6577d4ca13
commit f3b5b9f49a
45 changed files with 580 additions and 84 deletions

View File

@ -18,15 +18,15 @@ typedef Athena::io::DNA<Athena::BigEndian> BigDNA;
typedef Athena::io::DNAYaml<Athena::BigEndian> BigYAML; typedef Athena::io::DNAYaml<Athena::BigEndian> BigYAML;
/* FourCC with DNA read/write */ /* FourCC with DNA read/write */
class FourCC final : public BigYAML, public HECL::FourCC class DNAFourCC final : public BigYAML, public HECL::FourCC
{ {
public: public:
FourCC() : HECL::FourCC() {} DNAFourCC() : HECL::FourCC() {}
FourCC(const HECL::FourCC& other) DNAFourCC(const HECL::FourCC& other)
: HECL::FourCC() {num = other.toUint32();} : HECL::FourCC() {num = other.toUint32();}
FourCC(const char* name) DNAFourCC(const char* name)
: HECL::FourCC(name) {} : HECL::FourCC(name) {}
FourCC(uint32_t n) DNAFourCC(uint32_t n)
: HECL::FourCC(n) {} : HECL::FourCC(n) {}
Delete expl; Delete expl;
@ -40,6 +40,8 @@ public:
{writer.writeString(nullptr, std::string(fcc, 4));} {writer.writeString(nullptr, std::string(fcc, 4));}
}; };
using FourCC = HECL::FourCC;
/* PAK 32-bit Unique ID */ /* PAK 32-bit Unique ID */
class UniqueID32 : public BigYAML class UniqueID32 : public BigYAML
{ {
@ -243,9 +245,9 @@ typedef std::function<bool(const HECL::ProjectPath&, const HECL::ProjectPath&)>
namespace std namespace std
{ {
template<> template<>
struct hash<Retro::FourCC> struct hash<Retro::DNAFourCC>
{ {
inline size_t operator()(const Retro::FourCC& fcc) const inline size_t operator()(const Retro::DNAFourCC& fcc) const
{return fcc.toUint32();} {return fcc.toUint32();}
}; };

View File

@ -130,7 +130,7 @@ struct ANCS : BigYAML
{ {
DECL_YAML DECL_YAML
String<-1> name; String<-1> name;
FourCC type; DNAFourCC type;
UniqueID32 id; UniqueID32 id;
String<-1> name2; String<-1> name2;
Value<float> unk1; Value<float> unk1;

View File

@ -23,7 +23,7 @@ PAKBridge::PAKBridge(HECL::Database::Project& project, const NOD::DiscBase::IPar
/* Append Level String */ /* Append Level String */
for (const PAK::Entry& entry : m_pak.m_entries) for (const PAK::Entry& entry : m_pak.m_entries)
{ {
if (entry.type == SBIG('MLVL')) if (entry.type == FOURCC('MLVL'))
{ {
PAKEntryReadStream rs = entry.beginReadStream(m_node); PAKEntryReadStream rs = entry.beginReadStream(m_node);
MLVL mlvl; MLVL mlvl;
@ -119,7 +119,7 @@ void PAKBridge::build()
/* First pass: build per-area/per-layer dependency map */ /* First pass: build per-area/per-layer dependency map */
for (const PAK::Entry& entry : m_pak.m_entries) for (const PAK::Entry& entry : m_pak.m_entries)
{ {
if (entry.type == SBIG('MLVL')) if (entry.type == FOURCC('MLVL'))
{ {
PAKEntryReadStream rs = entry.beginReadStream(m_node); PAKEntryReadStream rs = entry.beginReadStream(m_node);
MLVL mlvl; MLVL mlvl;

View File

@ -48,7 +48,7 @@ struct EVNT : BigYAML
{ {
DECL_YAML DECL_YAML
Value<atUint32> frameCount; Value<atUint32> frameCount;
FourCC effectType; DNAFourCC effectType;
UniqueID32 effectId; UniqueID32 effectId;
String<-1> boneName; String<-1> boneName;
Value<float> scale; Value<float> scale;

View File

@ -48,7 +48,7 @@ struct MLVL : BigYAML
{ {
DECL_YAML DECL_YAML
UniqueID32 id; UniqueID32 id;
FourCC type; DNAFourCC type;
}; };
Vector<Dependency, DNA_COUNT(depCount)> deps; Vector<Dependency, DNA_COUNT(depCount)> deps;

View File

@ -20,7 +20,7 @@ struct PAK : BigDNA
struct NameEntry : BigDNA struct NameEntry : BigDNA
{ {
DECL_DNA DECL_DNA
FourCC type; DNAFourCC type;
UniqueID32 id; UniqueID32 id;
Value<atUint32> nameLen; Value<atUint32> nameLen;
String<DNA_COUNT(nameLen)> name; String<DNA_COUNT(nameLen)> name;
@ -30,7 +30,7 @@ struct PAK : BigDNA
{ {
DECL_DNA DECL_DNA
Value<atUint32> compressed; Value<atUint32> compressed;
FourCC type; DNAFourCC type;
UniqueID32 id; UniqueID32 id;
Value<atUint32> size; Value<atUint32> size;
Value<atUint32> offset; Value<atUint32> offset;

View File

@ -15,7 +15,7 @@ void STRG::_read(Athena::io::IStreamReader& reader)
readLangs.reserve(langCount); readLangs.reserve(langCount);
for (atUint32 l=0 ; l<langCount ; ++l) for (atUint32 l=0 ; l<langCount ; ++l)
{ {
FourCC lang; DNAFourCC lang;
lang.read(reader); lang.read(reader);
readLangs.emplace_back(lang); readLangs.emplace_back(lang);
reader.seek(4); reader.seek(4);
@ -62,7 +62,7 @@ void STRG::write(Athena::io::IStreamWriter& writer) const
atUint32 offset = 0; atUint32 offset = 0;
for (const std::pair<FourCC, std::vector<std::wstring>>& lang : langs) for (const std::pair<FourCC, std::vector<std::wstring>>& lang : langs)
{ {
lang.first.write(writer); DNAFourCC(lang.first).write(writer);
writer.writeUint32Big(offset); writer.writeUint32Big(offset);
offset += strCount * 4 + 4; offset += strCount * 4 + 4;
atUint32 langStrCount = lang.second.size(); atUint32 langStrCount = lang.second.size();

View File

@ -74,7 +74,7 @@ struct ANCS : BigYAML
{ {
DECL_YAML DECL_YAML
String<-1> name; String<-1> name;
FourCC type; DNAFourCC type;
UniqueID32 id; UniqueID32 id;
Value<atUint32> unkMP2; Value<atUint32> unkMP2;
Value<float> unk1; Value<float> unk1;
@ -162,7 +162,7 @@ struct ANCS : BigYAML
{ {
DECL_YAML DECL_YAML
Value<atUint32> frameCount; Value<atUint32> frameCount;
FourCC effectType; DNAFourCC effectType;
UniqueID32 effectId; UniqueID32 effectId;
Value<atUint32> boneId; Value<atUint32> boneId;
Value<float> scale; Value<float> scale;

View File

@ -22,7 +22,7 @@ PAKBridge::PAKBridge(HECL::Database::Project& project, const NOD::DiscBase::IPar
/* Append Level String */ /* Append Level String */
for (const DNAMP1::PAK::Entry& entry : m_pak.m_entries) for (const DNAMP1::PAK::Entry& entry : m_pak.m_entries)
{ {
if (entry.type == SBIG('MLVL')) if (entry.type == FOURCC('MLVL'))
{ {
PAKEntryReadStream rs = entry.beginReadStream(m_node); PAKEntryReadStream rs = entry.beginReadStream(m_node);
MLVL mlvl; MLVL mlvl;
@ -118,7 +118,7 @@ void PAKBridge::build()
/* First pass: build per-area/per-layer dependency map */ /* First pass: build per-area/per-layer dependency map */
for (const DNAMP1::PAK::Entry& entry : m_pak.m_entries) for (const DNAMP1::PAK::Entry& entry : m_pak.m_entries)
{ {
if (entry.type == SBIG('MLVL')) if (entry.type == FOURCC('MLVL'))
{ {
PAKEntryReadStream rs = entry.beginReadStream(m_node); PAKEntryReadStream rs = entry.beginReadStream(m_node);
MLVL mlvl; MLVL mlvl;

View File

@ -38,7 +38,7 @@ struct MLVL : BigDNA
{ {
DECL_DNA DECL_DNA
UniqueID32 id; UniqueID32 id;
FourCC type; DNAFourCC type;
}; };
Vector<Dependency, DNA_COUNT(depCount)> deps; Vector<Dependency, DNA_COUNT(depCount)> deps;

View File

@ -15,7 +15,7 @@ void STRG::_read(Athena::io::IStreamReader& reader)
readLangs.reserve(langCount); readLangs.reserve(langCount);
for (atUint32 l=0 ; l<langCount ; ++l) for (atUint32 l=0 ; l<langCount ; ++l)
{ {
FourCC lang; DNAFourCC lang;
lang.read(reader); lang.read(reader);
readLangs.emplace_back(lang); readLangs.emplace_back(lang);
reader.seek(8); reader.seek(8);
@ -75,7 +75,7 @@ void STRG::write(Athena::io::IStreamWriter& writer) const
writer.writeUint32Big(strCount); writer.writeUint32Big(strCount);
atUint32 offset = 0; atUint32 offset = 0;
for (const std::pair<FourCC, std::vector<std::wstring>>& lang : langs) for (const std::pair<DNAFourCC, std::vector<std::wstring>>& lang : langs)
{ {
lang.first.write(writer); lang.first.write(writer);
writer.writeUint32Big(offset); writer.writeUint32Big(offset);
@ -114,7 +114,7 @@ void STRG::write(Athena::io::IStreamWriter& writer) const
for (const std::pair<std::string, int32_t>& name : names) for (const std::pair<std::string, int32_t>& name : names)
writer.writeString(name.first); writer.writeString(name.first);
for (const std::pair<FourCC, std::vector<std::wstring>>& lang : langs) for (const std::pair<DNAFourCC, std::vector<std::wstring>>& lang : langs)
{ {
offset = strCount * 4; offset = strCount * 4;
atUint32 langStrCount = lang.second.size(); atUint32 langStrCount = lang.second.size();

View File

@ -79,7 +79,7 @@ struct MaterialSet : BigDNA
XRAY = SBIG('XRAY'), XRAY = SBIG('XRAY'),
TOON = SBIG('TOON') TOON = SBIG('TOON')
}; };
FourCC subtype; DNAFourCC subtype;
struct Flags : BigDNA struct Flags : BigDNA
{ {
DECL_DNA DECL_DNA
@ -106,7 +106,7 @@ struct MaterialSet : BigDNA
CLR = SBIG('CLR '), CLR = SBIG('CLR '),
DIFB = SBIG('DIFB') DIFB = SBIG('DIFB')
}; };
FourCC subtype; DNAFourCC subtype;
GX::Color color; GX::Color color;
}; };
struct SectionINT : ISection struct SectionINT : ISection
@ -121,7 +121,7 @@ struct MaterialSet : BigDNA
BNIF = SBIG('BNIF'), BNIF = SBIG('BNIF'),
XRBR = SBIG('XRBR') XRBR = SBIG('XRBR')
}; };
FourCC subtype; DNAFourCC subtype;
Value<atUint32> value; Value<atUint32> value;
}; };
struct SectionFactory : BigDNA struct SectionFactory : BigDNA
@ -130,7 +130,7 @@ struct MaterialSet : BigDNA
std::unique_ptr<ISection> section; std::unique_ptr<ISection> section;
void read(Athena::io::IStreamReader& reader) void read(Athena::io::IStreamReader& reader)
{ {
FourCC type; DNAFourCC type;
type.read(reader); type.read(reader);
switch (type) switch (type)
{ {

View File

@ -24,7 +24,7 @@ PAKBridge::PAKBridge(HECL::Database::Project& project, const NOD::DiscBase::IPar
std::set<HECL::SystemString, CaseInsensitiveCompare> uniq; std::set<HECL::SystemString, CaseInsensitiveCompare> uniq;
for (const PAK::Entry& entry : m_pak.m_entries) for (const PAK::Entry& entry : m_pak.m_entries)
{ {
if (entry.type == SBIG('MLVL')) if (entry.type == FOURCC('MLVL'))
{ {
PAKEntryReadStream rs = entry.beginReadStream(m_node); PAKEntryReadStream rs = entry.beginReadStream(m_node);
MLVL mlvl; MLVL mlvl;

View File

@ -62,7 +62,7 @@ void PAK::write(Athena::io::IStreamWriter& writer) const
{ {
m_header.write(writer); m_header.write(writer);
FourCC("STRG").write(writer); DNAFourCC("STRG").write(writer);
atUint32 strgSz = 4; atUint32 strgSz = 4;
for (const NameEntry& entry : m_nameEntries) for (const NameEntry& entry : m_nameEntries)
strgSz += (atUint32)entry.name.size() + 13; strgSz += (atUint32)entry.name.size() + 13;
@ -70,14 +70,14 @@ void PAK::write(Athena::io::IStreamWriter& writer) const
strgSz += strgPad; strgSz += strgPad;
writer.writeUint32Big(strgSz); writer.writeUint32Big(strgSz);
FourCC("RSHD").write(writer); DNAFourCC("RSHD").write(writer);
atUint32 rshdSz = 4 + 24 * m_entries.size(); atUint32 rshdSz = 4 + 24 * m_entries.size();
atUint32 rshdPad = ((rshdSz + 63) & ~63) - rshdSz; atUint32 rshdPad = ((rshdSz + 63) & ~63) - rshdSz;
rshdSz += rshdPad; rshdSz += rshdPad;
writer.writeUint32Big(rshdSz); writer.writeUint32Big(rshdSz);
atUint32 dataOffset = 128 + strgSz + rshdSz; atUint32 dataOffset = 128 + strgSz + rshdSz;
FourCC("DATA").write(writer); DNAFourCC("DATA").write(writer);
atUint32 dataSz = 0; atUint32 dataSz = 0;
for (const Entry& entry : m_entries) for (const Entry& entry : m_entries)
dataSz += (entry.size + 63) & ~63; dataSz += (entry.size + 63) & ~63;

View File

@ -29,7 +29,7 @@ struct PAK : BigDNA
{ {
DECL_DNA DECL_DNA
String<-1> name; String<-1> name;
FourCC type; DNAFourCC type;
UniqueID64 id; UniqueID64 id;
}; };
@ -37,7 +37,7 @@ struct PAK : BigDNA
{ {
DECL_DNA DECL_DNA
Value<atUint32> compressed; Value<atUint32> compressed;
FourCC type; DNAFourCC type;
UniqueID64 id; UniqueID64 id;
Value<atUint32> size; Value<atUint32> size;
Value<atUint32> offset; Value<atUint32> offset;

View File

@ -29,11 +29,11 @@ void STRG::_read(Athena::io::IStreamReader& reader)
} }
} }
std::vector<FourCC> readLangs; std::vector<DNAFourCC> readLangs;
readLangs.reserve(langCount); readLangs.reserve(langCount);
for (atUint32 l=0 ; l<langCount ; ++l) for (atUint32 l=0 ; l<langCount ; ++l)
{ {
FourCC lang; DNAFourCC lang;
lang.read(reader); lang.read(reader);
readLangs.emplace_back(lang); readLangs.emplace_back(lang);
} }
@ -62,7 +62,7 @@ void STRG::_read(Athena::io::IStreamReader& reader)
langMap.clear(); langMap.clear();
langMap.reserve(langCount); langMap.reserve(langCount);
for (std::pair<FourCC, std::vector<std::string>>& item : langs) for (std::pair<DNAFourCC, std::vector<std::string>>& item : langs)
langMap.emplace(item.first, &item.second); langMap.emplace(item.first, &item.second);
} }
@ -142,12 +142,12 @@ void STRG::fromYAML(Athena::io::YAMLDocReader& reader)
for (const auto& node : item.second->m_seqChildren) for (const auto& node : item.second->m_seqChildren)
if (node->m_type == YAML_SCALAR_NODE) if (node->m_type == YAML_SCALAR_NODE)
strs.emplace_back(node->m_scalarString); strs.emplace_back(node->m_scalarString);
langs.emplace_back(std::make_pair(FourCC(item.first.c_str()), std::move(strs))); langs.emplace_back(std::make_pair(DNAFourCC(item.first.c_str()), std::move(strs)));
} }
langMap.clear(); langMap.clear();
langMap.reserve(langs.size()); langMap.reserve(langs.size());
for (std::pair<FourCC, std::vector<std::string>>& item : langs) for (std::pair<DNAFourCC, std::vector<std::string>>& item : langs)
langMap.emplace(item.first, &item.second); langMap.emplace(item.first, &item.second);
} }

View File

@ -15,8 +15,8 @@ struct STRG : ISTRG
DECL_YAML DECL_YAML
Delete expl; Delete expl;
void _read(Athena::io::IStreamReader& reader); void _read(Athena::io::IStreamReader& reader);
std::vector<std::pair<FourCC, std::vector<std::string>>> langs; std::vector<std::pair<DNAFourCC, std::vector<std::string>>> langs;
std::unordered_map<FourCC, std::vector<std::string>*> langMap; std::unordered_map<DNAFourCC, std::vector<std::string>*> langMap;
std::map<std::string, int32_t> names; std::map<std::string, int32_t> names;
inline int32_t lookupIdx(const std::string& name) const inline int32_t lookupIdx(const std::string& name) const

48
Runtime/CDvdFile.hpp Normal file
View File

@ -0,0 +1,48 @@
#ifndef __RETRO_CDVDFILE_HPP__
#define __RETRO_CDVDFILE_HPP__
#include "RetroTypes.hpp"
namespace Retro
{
const char* DecodeARAMFile(const char* name);
enum ESeekOrigin
{
OriginBegin = 0,
OriginCur = 1,
OriginEnd = 2
};
struct DVDFileInfo;
class CDvdRequest;
class CDvdFile
{
public:
CDvdFile(const char*);
void UpdateFilePos(int);
void CalcFileOffset(int, ESeekOrigin);
static void internalCallback(s32, DVDFileInfo*);
bool FileExists(const char*);
void CloseFile();
CDvdRequest* AsyncSeekRead(void*, u32, ESeekOrigin, int);
void SyncSeekRead(void*, u32, ESeekOrigin, int);
CDvdRequest* AsyncRead(void*, u32);
void SyncRead(void*, u32);
void StallForARAMFile();
void StartARAMFileLoad();
void PopARAMFileLoad();
void PushARAMFileLoad();
void TryARAMFile();
void PingARAMTransfer();
void HandleDVDInterrupt();
void HandleARAMInterrupt();
static void ARAMARAMXferCallback(u32);
static void DVDARAMXferCallback(s32, DVDFileInfo*);
};
}
#endif // __RETRO_CDVDFILE_HPP__

34
Runtime/CDvdRequest.hpp Normal file
View File

@ -0,0 +1,34 @@
#ifndef __RETRO_CDVDREQUEST_HPP__
#define __RETRO_CDVDREQUEST_HPP__
namespace Retro
{
class CDvdRequest
{
public:
virtual void WaitUntilComplete()=0;
virtual bool IsComplete()=0;
virtual void PostCancelRequest()=0;
enum EMediaType
{
MediaARAM = 0,
MediaReal = 1,
MediaNOD = 2
};
virtual EMediaType GetMediaType() const=0;
};
class CNODDvdRequest : public CDvdRequest
{
public:
void WaitUntilComplete();
bool IsComplete();
void PostCancelRequest();
EMediaType GetMediaType() const {return MediaNOD;}
};
}
#endif // __RETRO_CDVDREQUEST_HPP__

0
Runtime/CFactoryMgr.cpp Normal file
View File

28
Runtime/CFactoryMgr.hpp Normal file
View File

@ -0,0 +1,28 @@
#ifndef __RETRO_CFACTORYMGR_HPP__
#define __RETRO_CFACTORYMGR_HPP__
#include <unordered_map>
#include "RetroTypes.hpp"
namespace Retro
{
class SObjectTag;
class CVParamTransfer;
class CInputStream;
typedef void(*CFactoryFnReturn)(const SObjectTag&, CInputStream&, const CVParamTransfer&);
class CFactoryMgr
{
std::unordered_map<u32, CFactoryFnReturn> m_factories;
public:
MakeObjectFromMemory(const SObjectTag&, void*, int, bool, const CVParamTransfer&);
void AddFactory(FourCC key, CFactoryFnReturn func)
{
m_factories[key] = func;
}
};
}
#endif // __RETRO_CFACTORYMGR_HPP__

View File

@ -7,11 +7,19 @@ add_subdirectory(GuiSys)
add_subdirectory(Input) add_subdirectory(Input)
add_subdirectory(Particle) add_subdirectory(Particle)
if(WIN32)
list(APPEND PLAT_SRCS CMemoryCardSysWin.cpp)
elseif(APPLE)
list(APPEND PLAT_SRCS CMemoryCardSysMac.cpp)
else()
list(APPEND PLAT_SRCS CMemoryCardSysNix.cpp)
endif()
add_library(RuntimeCommon add_library(RuntimeCommon
COsContext.hpp COsContextBoo.cpp COsContext.hpp COsContextBoo.cpp
CMainFlow.hpp CMainFlow.cpp CMainFlow.hpp CMainFlow.cpp
CMemory.hpp CMemory.cpp CMemory.hpp CMemory.cpp
CMemoryCardSys.hpp CMemoryCardSysPC.cpp CMemoryCardSys.hpp
IAllocator.hpp IAllocator.cpp IAllocator.hpp IAllocator.cpp
CGameAllocator.hpp CGameAllocator.cpp CGameAllocator.hpp CGameAllocator.cpp
CBasics.hpp CBasicsPC.cpp CBasics.hpp CBasicsPC.cpp
@ -25,6 +33,9 @@ add_library(RuntimeCommon
CWorldTransManager.hpp CWorldTransManager.cpp CWorldTransManager.hpp CWorldTransManager.cpp
CRandom16.hpp CRandom16.cpp CRandom16.hpp CRandom16.cpp
CResFactory.hpp CResFactory.cpp CResFactory.hpp CResFactory.cpp
CResLoader.hpp CResLoader.cpp
CDvdRequest.hpp CNODDvdRequest.cpp
CDvdFile.hpp CNODDvdFile.cpp
IObjectStore.hpp IObjectStore.hpp
CSimplePool.hpp CSimplePool.cpp CSimplePool.hpp CSimplePool.cpp
CAi.hpp CAi.cpp CAi.hpp CAi.cpp
@ -45,10 +56,14 @@ add_library(RuntimeCommon
CAreaOctTree.hpp CAreaOctTree.cpp CAreaOctTree.hpp CAreaOctTree.cpp
CActor.hpp CActor.cpp CActor.hpp CActor.cpp
CPhysicsActor.hpp CPhysicsActor.cpp CPhysicsActor.hpp CPhysicsActor.cpp
CFactoryMgr.hpp CFactoryMgr.cpp
CPakFile.hpp CPakFile.cpp
CStringExtras.hpp
rstl.hpp rstl.cpp rstl.hpp rstl.cpp
GameGlobalObjects.hpp GameGlobalObjects.hpp
RetroTypes.hpp RetroTypes.hpp
GCNTypes.hpp) GCNTypes.hpp
${PLAT_SRCS})
add_subdirectory(MP1) add_subdirectory(MP1)
add_subdirectory(MP2) add_subdirectory(MP2)

View File

View File

0
Runtime/CNODDvdFile.cpp Normal file
View File

View File

@ -0,0 +1,16 @@
#include "CDvdRequest.hpp"
namespace Retro
{
void CNODDvdRequest::WaitUntilComplete()
{
}
bool CNODDvdRequest::IsComplete()
{
}
void CNODDvdRequest::PostCancelRequest()
{
}
}

0
Runtime/CPakFile.cpp Normal file
View File

76
Runtime/CPakFile.hpp Normal file
View File

@ -0,0 +1,76 @@
#ifndef __RETRO_CPAKFILE_HPP__
#define __RETRO_CPAKFILE_HPP__
#include <vector>
#include "RetroTypes.hpp"
#include "CStringExtras.hpp"
#include "CDvdFile.hpp"
#include "CDvdRequest.hpp"
namespace Retro
{
class CPakFile : public CDvdFile
{
friend class CResLoader;
public:
struct SResInfo
{
u32 compressed;
SObjectTag tag;
u32 size;
u32 offset;
};
private:
enum EAsyncPhase
{
PakAsyncWarmup = 0,
PakAsyncInitialHeader = 1,
PakAsyncDataLoad = 2,
PakAsyncLoaded = 3
} x2c_asyncLoadPhase;
CDvdRequest* x34_dvdReq;
std::vector<std::pair<std::string, SObjectTag>> x4c_nameList;
std::vector<u32> x5c_depList;
std::vector<std::pair<u32, SResInfo>> x6c_resList;
public:
CPakFile(const std::string& filename);
const std::vector<u32>& GetDepList() const {return x5c_depList;}
u32 GetResIdByName(const char* name) const
{
for (const std::pair<std::string, SObjectTag>& p : x4c_nameList)
if (!CStringExtras::CompareCaseInsensitive(p.first.c_str(), name))
return p.second.id;
return 0;
}
const SResInfo* GetResInfoForLoad(u32 id);
const SResInfo* GetResInfo(u32 id) const;
u32 GetFakeStaticSize() const;
void DataLoad();
void InitialHeaderLoad();
void Warmup();
void AsyncIdle()
{
if (x2c_asyncLoadPhase == PakAsyncLoaded)
return;
if (x34_dvdReq && x34_dvdReq->IsComplete())
return;
switch (x2c_asyncLoadPhase)
{
case PakAsyncWarmup:
Warmup();
break;
case PakAsyncInitialHeader:
InitialHeaderLoad();
break;
case PakAsyncDataLoad:
DataLoad();
break;
default: break;
}
}
};
}
#endif // __RETRO_CPAKFILE_HPP__

View File

@ -3,7 +3,7 @@
namespace Retro namespace Retro
{ {
void CResFactory::Build(const SObjectTag&, const CVParamTransfer&) std::unique_ptr<IObj> CResFactory::Build(const SObjectTag&, const CVParamTransfer&)
{ {
} }
void CResFactory::BuildAsync(const SObjectTag&, const CVParamTransfer&, IObj**) void CResFactory::BuildAsync(const SObjectTag&, const CVParamTransfer&, IObj**)
@ -12,11 +12,5 @@ void CResFactory::BuildAsync(const SObjectTag&, const CVParamTransfer&, IObj**)
void CResFactory::CancelBuild(const SObjectTag&) void CResFactory::CancelBuild(const SObjectTag&)
{ {
} }
bool CResFactory::CanBuild(const SObjectTag&)
{
}
const SObjectTag& CResFactory::GetResourceIdByName(const char*) const
{
}
} }

View File

@ -1,19 +1,41 @@
#ifndef __RETRO_CRESFACTORY_HPP__ #ifndef __RETRO_CRESFACTORY_HPP__
#define __RETRO_CRESFACTORY_HPP__ #define __RETRO_CRESFACTORY_HPP__
#include <unordered_map>
#include "IFactory.hpp" #include "IFactory.hpp"
#include "CResLoader.hpp"
namespace Retro namespace Retro
{ {
class CDvdRequest;
class CResFactory : public IFactory class CResFactory : public IFactory
{ {
CResLoader x4_loader;
public: public:
void Build(const SObjectTag&, const CVParamTransfer&); struct SLoadingData
{
SObjectTag tag;
CDvdRequest* dvdReq;
IObj** targetPtr;
void* loadBuffer;
u32 resSize;
};
private:
std::unordered_map<SObjectTag, SLoadingData> m_loadList;
void AddToLoadList(const SLoadingData& data) {m_loadList[data.tag] = data;}
public:
std::unique_ptr<IObj> Build(const SObjectTag&, const CVParamTransfer&);
void BuildAsync(const SObjectTag&, const CVParamTransfer&, IObj**); void BuildAsync(const SObjectTag&, const CVParamTransfer&, IObj**);
void CancelBuild(const SObjectTag&); void CancelBuild(const SObjectTag&);
bool CanBuild(const SObjectTag&); bool CanBuild(const SObjectTag& tag) {return x4_loader.ResourceExists(tag);}
const SObjectTag& GetResourceIdByName(const char*) const; u32 GetResourceIdByName(const char* name) const {return x4_loader.GetResourceIdByName(name);}
std::vector<std::pair<std::string, SObjectTag>> GetResourceIdToNameList() const
{
std::vector<std::pair<std::string, SObjectTag>> retval;
return retval;
}
}; };
} }

0
Runtime/CResLoader.cpp Normal file
View File

155
Runtime/CResLoader.hpp Normal file
View File

@ -0,0 +1,155 @@
#ifndef __RETRO_CRESLOADER_HPP__
#define __RETRO_CRESLOADER_HPP__
#include <memory>
#include <string>
#include "RetroTypes.hpp"
#include "CPakFile.hpp"
#include "CBasics.hpp"
namespace Retro
{
class SObjectTag;
class CDvdRequest;
class CResLoader
{
//std::list<std::unique_ptr<CPakFile>> x4_unusedList;
std::list<std::unique_ptr<CPakFile>> x1c_pakLoadedList;
std::list<std::unique_ptr<CPakFile>> x34_pakLoadingList;
u32 x44_pakLoadingCount = 0;
u32 x4c_cachedResId = -1;
const CPakFile::SResInfo* x50_cachedResInfo = nullptr;
public:
const std::vector<u32>& GetTagListForFile(const std::string&) const;
void AddPakFileAsync(const std::string&, bool);
void AddPakFile(const std::string&, bool);
CInputStream* LoadNewResourcePartSync(const SObjectTag&, int, int, char*);
void LoadMemResourceSync(const SObjectTag&, char*, int*);
CInputStream* LoadResourceFromMemorySync(const SObjectTag&, const void*);
CInputStream* LoadNewResourceSync(const SObjectTag&, char*);
CDvdRequest* LoadResourcePartAsync(const SObjectTag& tag, int offset, int length, void* buf)
{
return FindResourceForLoad(tag.id)->AsyncSeekRead(buf, length,
OriginBegin, x50_cachedResInfo->offset + offset);
}
CDvdRequest* LoadResourceAsync(const SObjectTag& tag, void* buf)
{
return FindResourceForLoad(tag.id)->AsyncSeekRead(buf, ROUND_UP_32(x50_cachedResInfo->size),
OriginBegin, x50_cachedResInfo->offset);
}
bool GetResourceCompression(const SObjectTag& tag)
{
if (FindResource(tag.id))
return x50_cachedResInfo->compressed;
return false;
}
u32 ResourceSize(const SObjectTag& tag)
{
if (FindResource(tag.id))
return x50_cachedResInfo->size;
return false;
}
bool ResourceExists(const SObjectTag& tag)
{
return FindResource(tag.id);
}
FourCC GetResourceTypeById(u32 id)
{
if (FindResource(id))
return x50_cachedResInfo->tag.type;
return false;
}
u32 GetResourceIdByName(const char* name) const
{
for (const std::unique_ptr<CPakFile>& file : x1c_pakLoadedList)
{
u32 id = file->GetResIdByName(name);
if (id)
return id;
}
return 0;
}
bool AreAllPaksLoaded() const
{
return x44_pakLoadingCount == 0;
}
void AsyncIdlePakLoading()
{
for (auto it=x34_pakLoadingList.begin();
it != x34_pakLoadingList.end();
++it)
{
(*it)->AsyncIdle();
if ((*it)->x2c_asyncLoadPhase == CPakFile::PakAsyncLoaded)
{
MoveToCorrectLoadedList(std::move(*it));
it = x34_pakLoadingList.erase(it);
--x44_pakLoadingCount;
}
}
}
bool FindResource(u32 id)
{
for (const std::unique_ptr<CPakFile>& file : x1c_pakLoadedList)
if (CacheFromPak(*file, id))
return true;
return false;
}
CPakFile* FindResourceForLoad(u32 id)
{
for (std::unique_ptr<CPakFile>& file : x1c_pakLoadedList)
if (CacheFromPakForLoad(*file, id))
return file.get();
return nullptr;
}
CPakFile* FindResourceForLoad(const SObjectTag& tag)
{
return FindResourceForLoad(tag.id);
}
bool CacheFromPakForLoad(CPakFile& file, u32 id)
{
const CPakFile::SResInfo* info = file.GetResInfoForLoad(id);
if (info)
{
x4c_cachedResId = id;
x50_cachedResInfo = info;
return true;
}
return false;
}
bool CacheFromPak(const CPakFile& file, u32 id)
{
const CPakFile::SResInfo* info = file.GetResInfo(id);
if (info)
{
x4c_cachedResId = id;
x50_cachedResInfo = info;
return true;
}
return false;
}
void MoveToCorrectLoadedList(std::unique_ptr<CPakFile>&& file)
{
x1c_pakLoadedList.push_back(std::move(file));
}
};
}
#endif // __RETRO_CRESLOADER_HPP__

29
Runtime/CStringExtras.hpp Normal file
View File

@ -0,0 +1,29 @@
#ifndef __RETRO_CSTRINGEXTRAS_HPP__
#define __RETRO_CSTRINGEXTRAS_HPP__
#include <string>
#include <string.h>
namespace Retro
{
class CStringExtras
{
public:
static int CompareCaseInsensitive(const char* a, const char* b)
{
#if _WIN32
return _stricmp(a, b);
#else
return strcasecmp(a, b);
#endif
}
static int CompareCaseInsensitive(const std::string& a, const std::string& b)
{
return CompareCaseInsensitive(a.c_str(), b.c_str());
}
};
}
#endif // __RETRO_CSTRINGEXTRAS_HPP__

View File

@ -2,9 +2,11 @@
#define __RETRO_CTOKEN_HPP__ #define __RETRO_CTOKEN_HPP__
#include <memory> #include <memory>
#include "IObj.hpp"
#include "RetroTypes.hpp" #include "RetroTypes.hpp"
#include "CVParamTransfer.hpp" #include "IVParamObj.hpp"
#include "IObjectStore.hpp" #include "IObjectStore.hpp"
#include "IFactory.hpp"
namespace Retro namespace Retro
{ {
@ -28,23 +30,72 @@ public:
bool IsLoading() const {return x3_loading;} bool IsLoading() const {return x3_loading;}
void Unlock() {} void Unlock() {}
void RemoveReference() {} void Lock() {}
u32 RemoveReference()
{
--x0_refCount;
if (x0_refCount == 0)
{
if (x10_object)
Unload();
if (IsLoading())
CancelLoad();
xC_objectStore->ObjectUnreferenced(x4_objTag);
}
}
void CancelLoad() {} void CancelLoad() {}
void Unload() {} void Unload()
void GetObject() {} {
x10_object.reset(nullptr);
x3_loading = false;
}
IObj& GetObject()
{
IFactory& factory = xC_objectStore->GetFactory();
factory.Build(x4_objTag, x14_params);
}
}; };
class CToken class CToken
{ {
CObjectReference* x0_objRef; CObjectReference& x0_objRef;
bool x4_lockHeld = false; bool x4_lockHeld = false;
public: public:
~CToken() void Unlock()
{ {
if (x4_lockHeld) if (x4_lockHeld)
{
x0_objRef.Unlock();
x4_lockHeld = false;
}
}
void Lock()
{
if (!x4_lockHeld)
{
x0_objRef.Lock();
x4_lockHeld = true;
}
}
void RemoveRef()
{
} }
IObj& GetObj()
{
Lock();
return x0_objRef.GetObject();
}
CToken& operator=(CToken&& other)
{
}
~CToken()
{
if (x0_objRef && x4_lockHeld)
x0_objRef->Unlock();
}
}; };
template<class T> template<class T>

View File

@ -5,16 +5,9 @@
namespace Retro namespace Retro
{ {
class CCharacterFactoryBuilder : public IFactory
class CCharacterFactoryBuilder
{ {
public:
CCharacterFactoryBuilder();
class CDummyFactory : public IFactory
{
};
}; };
} }
#endif // __RETRO_CASSETFACTORY_HPP__ #endif // __RETRO_CASSETFACTORY_HPP__

View File

View File

View File

@ -0,0 +1,13 @@
#ifndef __RETRO_CHIERARCHYPOSEBUILDER_HPP__
#define __RETRO_CHIERARCHYPOSEBUILDER_HPP__
namespace Retro
{
class CHierarchyPoseBuilder
{
};
}
#endif // __RETRO_CHIERARCHYPOSEBUILDER_HPP__

View File

@ -8,4 +8,5 @@ add_library(RuntimeCommonCharacter
CAnimationDatabase.hpp CAnimationDatabase.hpp
CAnimationDatabaseGame.hpp CAnimationDatabaseGame.hpp
CTransitionDatabase.hpp CTransitionDatabase.hpp
CTransitionDatabaseGame.hpp) CTransitionDatabaseGame.hpp
CHierarchyPoseBuilder.hpp CHierarchyPoseBuilder.cpp)

View File

@ -1,6 +1,7 @@
#ifndef __RETRO_IFACTORY_HPP__ #ifndef __RETRO_IFACTORY_HPP__
#define __RETRO_IFACTORY_HPP__ #define __RETRO_IFACTORY_HPP__
#include <memory>
#include "RetroTypes.hpp" #include "RetroTypes.hpp"
namespace Retro namespace Retro
@ -12,11 +13,11 @@ class IFactory
{ {
public: public:
virtual ~IFactory() {} virtual ~IFactory() {}
virtual void Build(const SObjectTag&, const CVParamTransfer&)=0; virtual std::unique_ptr<IObj> Build(const SObjectTag&, const CVParamTransfer&)=0;
virtual void BuildAsync(const SObjectTag&, const CVParamTransfer&, IObj**)=0; virtual void BuildAsync(const SObjectTag&, const CVParamTransfer&, IObj**)=0;
virtual void CancelBuild(const SObjectTag&)=0; virtual void CancelBuild(const SObjectTag&)=0;
virtual bool CanBuild(const SObjectTag&)=0; virtual bool CanBuild(const SObjectTag&)=0;
virtual const SObjectTag& GetResourceIdByName(const char*) const=0; virtual u32 GetResourceIdByName(const char*) const=0;
}; };
} }

View File

@ -8,13 +8,15 @@ namespace Retro
class IObj class IObj
{ {
public:
virtual ~IObj() {}
}; };
class TObjOwnerDerivedFromIObjUntyped : public IObj class TObjOwnerDerivedFromIObjUntyped : public IObj
{ {
protected: protected:
void* m_objPtr; IObj* m_objPtr;
TObjOwnerDerivedFromIObjUntyped(void* objPtr) : m_objPtr(objPtr) {} TObjOwnerDerivedFromIObjUntyped(IObj* objPtr) : m_objPtr(objPtr) {}
}; };
template<class T> template<class T>

View File

@ -3,21 +3,23 @@
namespace Retro namespace Retro
{ {
class SObjectTag;
class CVParamTransfer;
class IFactory;
class IObj;
class IObjectStore class IObjectStore
{ {
public: public:
/* virtual IObj& GetObj(const SObjectTag&, const CVParamTransfer&)=0;
GetObj((SObjectTag const &,CVParamTransfer const &)) virtual IObj& GetObj(const SObjectTag&)=0;
GetObj((SObjectTag const &)) virtual IObj& GetObj(char const*)=0;
GetObj((char const *)) virtual IObj& GetObj(char const*, const CVParamTransfer&)=0;
GetObj((char const *,CVParamTransfer const &)) virtual void HasObject(const SObjectTag&) const=0;
HasObject(const(SObjectTag const &)) virtual void ObjectIsLive(const SObjectTag&) const=0;
.data6:80352C6C .long CSimplePool::ObjectIsLive(const(SObjectTag const &)) virtual IFactory& GetFactory() const=0;
.data6:80352C70 .long CSimplePool::GetFactory(const(void)) virtual void Flush()=0;
.data6:80352C74 .long CSimplePool::Flush((void)) virtual void ObjectUnreferenced(const SObjectTag&)=0;
.data6:80352C78 .long CSimplePool::ObjectUnreferenced((SObjectTag const &))
*/
}; };
} }

View File

@ -11,10 +11,14 @@
namespace Retro namespace Retro
{ {
using FourCC = HECL::FourCC;
struct SObjectTag struct SObjectTag
{ {
FourCC type; FourCC type;
UniqueID32 id; u32 id;
bool operator!=(const SObjectTag& other) const {return id != other.id;}
bool operator==(const SObjectTag& other) const {return id == other.id;}
}; };
/** /**
@ -62,4 +66,14 @@ using TAreaId = u32;
} }
namespace std
{
template<>
struct hash<Retro::SObjectTag>
{
inline size_t operator()(const Retro::SObjectTag& tag) const
{return tag.id;}
};
}
#endif // __RETRO_TYPES_HPP__ #endif // __RETRO_TYPES_HPP__