/// \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"
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;
}
}
+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)
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
{
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();
}
};