mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-15 08:06:10 +00:00
Modified all editor file formats to use the serialization system; changed dependency caching so all resource cache data is in one file
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
#include "CGameProject.h"
|
||||
#include "Core/Resource/Script/CMasterTemplate.h"
|
||||
#include <tinyxml2.h>
|
||||
#include <Common/Serialization/XML.h>
|
||||
|
||||
using namespace tinyxml2;
|
||||
CGameProject *CGameProject::mspActiveProject = nullptr;
|
||||
|
||||
CGameProject::~CGameProject()
|
||||
@@ -16,107 +15,56 @@ CGameProject::~CGameProject()
|
||||
|
||||
bool CGameProject::Load(const TWideString& rkPath)
|
||||
{
|
||||
TString ProjPath = rkPath.ToUTF8();
|
||||
XMLDocument Doc;
|
||||
Doc.LoadFile(*ProjPath);
|
||||
|
||||
if (Doc.Error())
|
||||
{
|
||||
Log::Error("Unable to open game project at " + ProjPath);
|
||||
return false;
|
||||
}
|
||||
|
||||
XMLElement *pRoot = Doc.FirstChildElement("GameProject");
|
||||
//EProjectVersion Version = (EProjectVersion) TString(pRoot->Attribute("Version")).ToInt32(10);
|
||||
|
||||
// Verify all elements are present
|
||||
XMLElement *pProjName = pRoot->FirstChildElement("Name");
|
||||
XMLElement *pGame = pRoot->FirstChildElement("Game");
|
||||
XMLElement *pResDB = pRoot->FirstChildElement("ResourceDB");
|
||||
XMLElement *pPackages = pRoot->FirstChildElement("Packages");
|
||||
|
||||
if (!pProjName || !pGame || !pResDB || !pPackages)
|
||||
{
|
||||
TString MissingElem = pProjName ? (pGame ? (pResDB ? "Packages" : "ResourceDB") : "Game") : "Name";
|
||||
Log::Error("Unable to load game project at " + ProjPath + "; " + MissingElem + " element is missing");
|
||||
return false;
|
||||
}
|
||||
|
||||
mProjectName = pProjName->GetText();
|
||||
mGame = CMasterTemplate::FindGameForName( pGame->GetText() );
|
||||
mResourceDBPath = pResDB->GetText();
|
||||
|
||||
mProjectRoot = rkPath.GetFileDirectory();
|
||||
mProjectRoot.Replace(L"/", L"\\");
|
||||
|
||||
// Load packages
|
||||
XMLElement *pPkgElem = pPackages->FirstChildElement("Package");
|
||||
|
||||
while (pPkgElem)
|
||||
{
|
||||
TString Path = pPkgElem->Attribute("Path");
|
||||
|
||||
if (Path.IsEmpty())
|
||||
Log::Error("Failed to load package in game project " + ProjPath + "; Path attribute is missing or empty");
|
||||
|
||||
else
|
||||
{
|
||||
CPackage *pPackage = new CPackage(this, Path.GetFileName(false), TString(Path.GetFileDirectory()).ToUTF16());
|
||||
pPackage->Load();
|
||||
mPackages.push_back(pPackage);
|
||||
}
|
||||
|
||||
pPkgElem = pPkgElem->NextSiblingElement("Package");
|
||||
}
|
||||
|
||||
// All loaded!
|
||||
TString ProjPath = rkPath.ToUTF8();
|
||||
CXMLReader Reader(ProjPath);
|
||||
Serialize(Reader);
|
||||
return true;
|
||||
}
|
||||
|
||||
void CGameProject::Save()
|
||||
{
|
||||
XMLDocument Doc;
|
||||
TString ProjPath = ProjectPath().ToUTF8();
|
||||
CXMLWriter Writer(ProjPath, "GameProject", eVer_Current, mGame);
|
||||
Serialize(Writer);
|
||||
}
|
||||
|
||||
XMLDeclaration *pDecl = Doc.NewDeclaration();
|
||||
Doc.LinkEndChild(pDecl);
|
||||
void CGameProject::Serialize(IArchive& rArc)
|
||||
{
|
||||
rArc << SERIAL("Name", mProjectName)
|
||||
<< SERIAL("Game", mGame)
|
||||
<< SERIAL("ResourceDB", mResourceDBPath);
|
||||
|
||||
XMLElement *pRoot = Doc.NewElement("GameProject");
|
||||
pRoot->SetAttribute("Version", eVer_Current);
|
||||
Doc.LinkEndChild(pRoot);
|
||||
// Packages
|
||||
std::vector<TString> PackageList;
|
||||
|
||||
XMLElement *pProjName = Doc.NewElement("Name");
|
||||
pProjName->SetText(*mProjectName);
|
||||
pRoot->LinkEndChild(pProjName);
|
||||
|
||||
XMLElement *pGame = Doc.NewElement("Game");
|
||||
pGame->SetText(*CMasterTemplate::FindGameName(mGame));
|
||||
pRoot->LinkEndChild(pGame);
|
||||
|
||||
XMLElement *pResDB = Doc.NewElement("ResourceDB");
|
||||
pResDB->SetText(*mResourceDBPath.ToUTF8());
|
||||
pRoot->LinkEndChild(pResDB);
|
||||
|
||||
XMLElement *pPackages = Doc.NewElement("Packages");
|
||||
pRoot->LinkEndChild(pPackages);
|
||||
|
||||
for (u32 iPkg = 0; iPkg < mPackages.size(); iPkg++)
|
||||
if (!rArc.IsReader())
|
||||
{
|
||||
CPackage *pPackage = mPackages[iPkg];
|
||||
TWideString FullDefPath = pPackage->DefinitionPath(false);
|
||||
TWideString RelDefPath = FileUtil::MakeRelative(FullDefPath.GetFileDirectory(), PackagesDir(false));
|
||||
TString DefPath = TWideString(RelDefPath + FullDefPath.GetFileName()).ToUTF8();
|
||||
|
||||
XMLElement *pPakElem = Doc.NewElement("Package");
|
||||
pPakElem->SetAttribute("Path", *DefPath);
|
||||
pPackages->LinkEndChild(pPakElem);
|
||||
for (u32 iPkg = 0; iPkg < mPackages.size(); iPkg++)
|
||||
PackageList.push_back( mPackages[iPkg]->DefinitionPath(true).ToUTF8() );
|
||||
}
|
||||
|
||||
// Save Project
|
||||
TString ProjPath = ProjectPath().ToUTF8();
|
||||
XMLError Result = Doc.SaveFile(*ProjPath);
|
||||
rArc << SERIAL_CONTAINER("Packages", PackageList, "Package");
|
||||
|
||||
if (Result != XML_SUCCESS)
|
||||
Log::Error("Failed to save game project at: " + ProjPath);
|
||||
if (rArc.IsReader())
|
||||
{
|
||||
for (u32 iPkg = 0; iPkg < mPackages.size(); iPkg++)
|
||||
delete mPackages[iPkg];
|
||||
mPackages.clear();
|
||||
|
||||
for (u32 iPkg = 0; iPkg < PackageList.size(); iPkg++)
|
||||
{
|
||||
const TWideString& rkPackagePath = PackageList[iPkg];
|
||||
TString PackageName = TWideString(rkPackagePath.GetFileName(false)).ToUTF8();
|
||||
TWideString PackageDir = rkPackagePath.GetFileDirectory();
|
||||
|
||||
CPackage *pPackage = new CPackage(this, PackageName, PackageDir);
|
||||
pPackage->Load();
|
||||
mPackages.push_back(pPackage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CGameProject::SetActive()
|
||||
|
||||
Reference in New Issue
Block a user