Files
FC1/Editor/GameResourcesExporter.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

169 lines
4.9 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2001-2004.
// -------------------------------------------------------------------------
// File name: GameResourcesExporter.cpp
// Version: v1.00
// Created: 31/10/2003 by Timur.
// Compilers: Visual Studio.NET 2003
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "GameResourcesExporter.h"
#include "GameEngine.h"
#include "Objects\ObjectManager.h"
#include "Objects\Entity.h"
#include "Material\MaterialManager.h"
#include "Particles\ParticleManager.h"
#include "Music\MusicManager.h"
#include <XTToolkit.h>
//////////////////////////////////////////////////////////////////////////
// Static data.
//////////////////////////////////////////////////////////////////////////
CGameResourcesExporter::Files CGameResourcesExporter::m_files;
//////////////////////////////////////////////////////////////////////////
void CGameResourcesExporter::ChooseDirectoryAndSave()
{
CString path;
{
CXTBrowseDialog dlg;
dlg.SetTitle( "Choose Target Folder" );
dlg.SetOptions( BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN );
if (dlg.DoModal() == IDOK)
{
path = dlg.GetSelPath();
}
}
if (!path.IsEmpty())
Save( path );
}
//////////////////////////////////////////////////////////////////////////
void CGameResourcesExporter::EnumRecordedFiles( const char *filename )
{
m_files.push_back( filename );
}
//////////////////////////////////////////////////////////////////////////
void CGameResourcesExporter::Save( const CString &outputDirectory )
{
m_files.clear();
m_files.reserve( 100000 );
GetISystem()->GetIPak()->EnumerateRecordedFiles( &EnumRecordedFiles );
GetFilesFromObjects();
GetFilesFromMaterials();
GetFilesFromParticles();
GetFilesFromMusic();
CMemoryBlock data;
int numFiles = m_files.size();
CLogFile::WriteLine( "===========================================================================" );
CLogFile::FormatLine( "Exporting Level %s resources, %d files",(const char*)GetIEditor()->GetGameEngine()->GetLevelName(),numFiles );
CLogFile::WriteLine( "===========================================================================" );
// Needed files.
CWaitProgress wait( "Exporting Resources" );
for (int i = 0; i < numFiles; i++)
{
CString srcFilename = m_files[i];
if (!wait.Step( (i*100)/numFiles ))
break;
wait.SetText( srcFilename );
CLogFile::WriteLine( srcFilename );
CCryFile file;
if (file.Open( srcFilename,"rb" ))
{
// Save this file in target folder.
CString trgFilename = Path::Make( outputDirectory,srcFilename );
int fsize = file.GetLength();
if (fsize > data.GetSize())
{
data.Allocate( fsize + 16 );
}
// Read data.
file.Read( data.GetBuffer(),fsize );
// Save this data to target file.
CString trgFileDir = Path::GetPath(trgFilename);
CFileUtil::CreateDirectory( trgFileDir );
// Create a file.
FILE *trgFile = fopen( trgFilename,"wb" );
if (trgFile)
{
// Save data to new file.
fwrite(data.GetBuffer(),fsize,1,trgFile);
fclose(trgFile);
}
}
}
CLogFile::WriteLine( "===========================================================================" );
m_files.clear();
}
#ifdef WIN64
template <class Container1, class Container2>
void Append(Container1& a, const Container2& b)
{
a.reserve (a.size() + b.size());
for (Container2::const_iterator it = b.begin(); it != b.end(); ++it)
a.insert(a.end(),*it);
}
#else
template <class Container1, class Container2>
void Append(Container1& a, const Container2& b)
{
a.insert (a.end(), b.begin(), b.end());
}
#endif
//////////////////////////////////////////////////////////////////////////
//
// Go through all editor objects and gathers files from thier properties.
//
//////////////////////////////////////////////////////////////////////////
void CGameResourcesExporter::GetFilesFromObjects()
{
CUsedResources rs;
GetIEditor()->GetObjectManager()->GatherUsedResources( rs );
Append(m_files,rs.files);
}
//////////////////////////////////////////////////////////////////////////
void CGameResourcesExporter::GetFilesFromMaterials()
{
CUsedResources rs;
GetIEditor()->GetMaterialManager()->GatherUsedResources( rs );
Append(m_files,rs.files);
}
//////////////////////////////////////////////////////////////////////////
void CGameResourcesExporter::GetFilesFromParticles()
{
CUsedResources rs;
GetIEditor()->GetParticleManager()->GatherUsedResources( rs );
Append(m_files, rs.files);
}
//////////////////////////////////////////////////////////////////////////
void CGameResourcesExporter::GetFilesFromMusic()
{
CUsedResources rs;
GetIEditor()->GetMusicManager()->GatherUsedResources( rs );
Append(m_files,rs.files);
}