Concat all found shaderlist.txt files to build the shader list

This commit is contained in:
Jānis Rūcis 2010-05-29 20:43:37 +03:00
parent b566370748
commit f86f8d9e29
3 changed files with 47 additions and 33 deletions

View File

@ -98,8 +98,8 @@ public:
/// \brief Detach an \p observer previously-attached by calling \c attach.
virtual void detach(ModuleObserver& observer) = 0;
virtual Archive* getArchive(const char* archiveName) = 0;
virtual void forEachArchive(const ArchiveNameCallback& callback) = 0;
virtual Archive* getArchive(const char* archiveName, bool pakonly=true) = 0;
virtual void forEachArchive(const ArchiveNameCallback& callback, bool pakonly=true, bool reverse=false) = 0;
};
#include "modulesystem.h"

View File

@ -1768,9 +1768,9 @@ void IfFound_dumpUnreferencedShader(bool& bFound, const char* filename)
if(!bFound)
{
bFound = true;
globalOutputStream() << "Following shader files are not referenced in shaderlist.txt:\n";
globalOutputStream() << "Following shader files are not referenced in any shaderlist.txt:\n";
}
globalOutputStream() << filename << "\n";
globalOutputStream() << "\t" << filename << "\n";
}
}
typedef ReferenceCaller1<bool, const char*, IfFound_dumpUnreferencedShader> IfFoundDumpUnreferencedShaderCaller;
@ -1840,6 +1840,30 @@ void FreeShaderList()
}
}
void ShaderList_addFromArchive(const char *archivename)
{
const char *shaderpath = GlobalRadiant().getGameDescriptionKeyValue("shaderpath");
if (string_empty(shaderpath))
return;
StringOutputStream shaderlist(256);
shaderlist << DirectoryCleaned(shaderpath) << "shaderlist.txt";
Archive *archive = GlobalFileSystem().getArchive(archivename, false);
if (archive)
{
ArchiveTextFile *file = archive->openTextFile(shaderlist.c_str());
if (file)
{
globalOutputStream() << "Found shaderlist.txt in " << archivename << "\n";
BuildShaderList(file->getInputStream());
file->release();
}
}
}
typedef FreeCaller1<const char *, ShaderList_addFromArchive> AddShaderListFromArchiveCaller;
#include "stream/filestream.h"
bool shaderlist_findOrInstall(const char* enginePath, const char* toolsPath, const char* shaderPath, const char* gamename)
@ -1898,22 +1922,8 @@ void Shaders_Load()
shaderlist_findOrInstall(enginePath, toolsPath, path.c_str(), gamename);
}
StringOutputStream absShaderList(256);
absShaderList << enginePath << gamename << '/' << path.c_str() << "shaderlist.txt";
{
globalOutputStream() << "Parsing shader files from " << absShaderList.c_str() << "\n";
TextFileInputStream shaderlistFile(absShaderList.c_str());
if(shaderlistFile.failed())
{
globalErrorStream() << "Couldn't find '" << absShaderList.c_str() << "'\n";
}
else
{
BuildShaderList(shaderlistFile);
DumpUnreferencedShaders();
}
}
GlobalFileSystem().forEachArchive(AddShaderListFromArchiveCaller(), false, true);
DumpUnreferencedShaders();
}
else
{

View File

@ -661,29 +661,33 @@ public:
g_observers.detach(observer);
}
Archive* getArchive(const char* archiveName)
Archive* getArchive(const char* archiveName, bool pakonly)
{
for(archives_t::iterator i = g_archives.begin(); i != g_archives.end(); ++i)
{
if((*i).is_pakfile)
{
if(path_equal((*i).name.c_str(), archiveName))
{
return (*i).archive;
}
}
if(pakonly && !(*i).is_pakfile)
continue;
if(path_equal((*i).name.c_str(), archiveName))
return (*i).archive;
}
return 0;
}
void forEachArchive(const ArchiveNameCallback& callback)
void forEachArchive(const ArchiveNameCallback& callback, bool pakonly, bool reverse)
{
if (reverse)
g_archives.reverse();
for(archives_t::iterator i = g_archives.begin(); i != g_archives.end(); ++i)
{
if((*i).is_pakfile)
{
callback((*i).name.c_str());
}
if(pakonly && !(*i).is_pakfile)
continue;
callback((*i).name.c_str());
}
if (reverse)
g_archives.reverse();
}
};