Added: #1440 More path rewriting rules

--HG--
branch : build_pipeline_v3
hg/feature/build_pipeline_v3
kaetemi 13 years ago
parent 44218214bb
commit 5ef33b6210

@ -89,207 +89,269 @@ CPipelinePluginMax::~CPipelinePluginMax()
namespace { namespace {
std::set<std::string> MissingFiles; std::set<std::string> MissingFiles;
std::map<std::string, std::string> KnownFileCache;
class CMaxRewritePathsCommand : public NLMISC::IRunnable // COPY FROM PIPELINE_SERVICE.CPP WITH BACKSLASHES INSTEAD OF FORWARD SLASHES
std::string standardizePath(const std::string &path, bool addFinalSlash)
{ {
public: // check empty path
NLMISC::CLog *Log; if (path.empty())
std::string SrcDirectoryRecursive; return "";
std::string DatabaseDirectory;
virtual void getName(std::string &result) const std::string newPath;
{ result = "CMaxRewritePathsCommand"; } newPath.resize(path.size() + 1);
// COPY FROM PIPELINE_SERVICE.CPP WITH BACKSLASHES INSTEAD OF FORWARD SLASHES std::string::size_type j = 0;
static std::string standardizePath(const std::string &path, bool addFinalSlash) for (std::string::size_type i = 0; i < path.size(); ++i)
{ {
// check empty path if (path[i] == '\\' || path[i] == '/')
if (path.empty())
return "";
std::string newPath;
newPath.resize(path.size() + 1);
std::string::size_type j = 0;
for (std::string::size_type i = 0; i < path.size(); ++i)
{ {
if (path[i] == '\\' || path[i] == '/') if (j <= 1 && path[i] == '\\')
{ {
if (j <= 1 && path[i] == '\\') // for windows network
{ newPath[j] = '\\';
// for windows network ++j;
newPath[j] = '\\';
++j;
}
else if (j == 0 || newPath[j - 1] != '\\')
{
newPath[j] = '\\';
++j;
}
} }
else else if (j == 0 || newPath[j - 1] != '\\')
{ {
newPath[j] = path[i]; newPath[j] = '\\';
++j; ++j;
} }
} }
newPath[j] = 0; else
newPath.resize(j); {
newPath[j] = path[i];
// add terminal slash ++j;
if (addFinalSlash && newPath[newPath.size()-1] != '\\') }
newPath += '\\';
return newPath;
}
static inline bool isCharacter(char c)
{
return (32 <= c /*&& c <= 127) || (161 <= c*/ && c <= 255);
}
static inline char stripFrenchLocale(char c)
{
if (192 <= c && c <= 197) return 'a';
if (200 <= c && c <= 203) return 'e';
if (204 <= c && c <= 207) return 'i';
if (210 <= c && c <= 214) return 'o';
if (217 <= c && c <= 220) return 'u';
if (c == 221) return 'y';
if (224 <= c && c <= 229) return 'a';
if (232 <= c && c <= 235) return 'e';
if (236 <= c && c <= 239) return 'i';
if (242 <= c && c <= 246) return 'o';
if (249 <= c && c <= 252) return 'u';
if (c == 253 || c == 255) return 'y';
return c;
} }
newPath[j] = 0;
newPath.resize(j);
// maxRewritePaths W:/database/interfaces/anims_max // add terminal slash
if (addFinalSlash && newPath[newPath.size()-1] != '\\')
static std::string rewritePath(const std::string &path, const std::string &databaseDirectory) newPath += '\\';
{
static std::set<std::string> fileNameCache;
std::string stdPath = standardizePath(path, false); return newPath;
for (std::string::size_type i = 0; i < stdPath.size(); ++i) }
stdPath[i] = stripFrenchLocale(stdPath[i]);
stdPath = NLMISC::toLower(stdPath);
// TODO: remove ./stuff/caravan/agents/_textures/actors/trame.png inline bool isCharacter(char c)
{
return (32 <= c /*&& c <= 127) || (161 <= c*/ && c <= 255);
}
NLMISC::strFindReplace(stdPath, "w:\\database\\", databaseDirectory); inline char stripFrenchLocale(char c)
NLMISC::strFindReplace(stdPath, "\\\\amiga\\3d\\database\\", databaseDirectory); {
NLMISC::strFindReplace(stdPath, "tr_hof_underwear_torso", "tr_hof_underwear_torse"); if (192 <= c && c <= 197) return 'a';
NLMISC::strFindReplace(stdPath, "tr_hof_underwear_hand-", "tr_hof_underwear_hand_"); if (200 <= c && c <= 203) return 'e';
NLMISC::strFindReplace(stdPath, "ma_hom_armor_01", "ma_hom_armor01"); if (204 <= c && c <= 207) return 'i';
NLMISC::strFindReplace(stdPath, "spec_yeux", "spec_eye_tryker"); if (210 <= c && c <= 214) return 'o';
NLMISC::strFindReplace(stdPath, "fy_hof_cheveux_shave01", "fy_hof_cheveux_shave"); if (217 <= c && c <= 220) return 'u';
if (c == 221) return 'y';
if (224 <= c && c <= 229) return 'a';
if (232 <= c && c <= 235) return 'e';
if (236 <= c && c <= 239) return 'i';
if (242 <= c && c <= 246) return 'o';
if (249 <= c && c <= 252) return 'u';
if (c == 253 || c == 255) return 'y';
return c;
}
if (stdPath.find("\\trame.") != std::string::npos) // maxRewritePaths W:/database/interfaces/anims_max
stdPath = standardizePath(databaseDirectory + "/stuff/lod_actors/texture_lod/trame.png", false);
if (stdPath.size() > path.size()) std::string rewritePath(const std::string &path, const std::string &databaseDirectory)
{ {
nlwarning("Path size becomes too large: '%s' -> '%s'", path.c_str(), stdPath.c_str()); static std::set<std::string> fileNameCache;
return path;
} std::string stdPath = standardizePath(path, false);
for (std::string::size_type i = 0; i < stdPath.size(); ++i)
stdPath[i] = stripFrenchLocale(stdPath[i]);
stdPath = NLMISC::toLower(stdPath);
// TODO: remove ./stuff/caravan/agents/_textures/actors/trame.png
NLMISC::strFindReplace(stdPath, "w:\\database\\", databaseDirectory);
NLMISC::strFindReplace(stdPath, "\\\\amiga\\3d\\database\\", databaseDirectory);
NLMISC::strFindReplace(stdPath, "ma_hom_armor_01", "ma_hom_armor01");
NLMISC::strFindReplace(stdPath, "ma_hof_armor_01", "ma_hof_armor01");
NLMISC::strFindReplace(stdPath, "ma_hom_armor_00", "ma_hom_armor00");
NLMISC::strFindReplace(stdPath, "ma_hof_armor_00", "ma_hof_armor00");
NLMISC::strFindReplace(stdPath, "zo_hom_armor_00", "zo_hom_armor00");
NLMISC::strFindReplace(stdPath, "zo_hof_armor_00", "zo_hof_armor00");
NLMISC::strFindReplace(stdPath, "fy_hof_cheveux_shave01", "fy_hof_cheveux_shave");
NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hom_underwear_avtbras", "tryker\\agents\\_textures\\actors\\tr_hom_underwear_avtbras");
NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hom_underwear_epaule", "tryker\\agents\\_textures\\actors\\tr_hom_underwear_epaule");
NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hom_underwear_hand-downside", "tryker\\agents\\_textures\\actors\\tr_hom_underwear_hand-downside");
NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hom_underwear_hand-upside", "tryker\\agents\\_textures\\actors\\tr_hom_underwear_hand-upside");
NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hom_underwear_molet", "tryker\\agents\\_textures\\actors\\tr_hom_underwear_molet");
NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hof_underwear_hand-downside", "tryker\\agents\\_textures\\actors\\tr_hof_underwear_hand-downside");
NLMISC::strFindReplace(stdPath, "matis\\agents\\_textures\\actors\\ma_hof_underwear_hand-upside", "tryker\\agents\\_textures\\actors\\tr_hof_underwear_hand-upside");
NLMISC::strFindReplace(stdPath, "tr_hof_underwear_torso", "tr_hof_underwear_torse");
NLMISC::strFindReplace(stdPath, "tr_hof_underwear_hand-", "tr_hof_underwear_hand_");
NLMISC::strFindReplace(stdPath, "fy_hom_armor00_avbras.", "fy_hom_armor00_avbras_c1.");
NLMISC::strFindReplace(stdPath, "fy_hom_armor00_bottes.", "fy_hom_armor00_bottes_c1.");
NLMISC::strFindReplace(stdPath, "fy_hom_armor00_bras.", "fy_hom_armor00_bras_c1.");
NLMISC::strFindReplace(stdPath, "fy_hom_armor00_cuissear.", "fy_hom_armor00_cuissear_c1.");
NLMISC::strFindReplace(stdPath, "fy_hom_armor00_cuisseav.", "fy_hom_armor00_cuisseav_c1.");
NLMISC::strFindReplace(stdPath, "fy_hom_armor00_dos.", "fy_hom_armor00_dos_c1.");
NLMISC::strFindReplace(stdPath, "fy_hom_armor00_hand-downside.", "fy_hom_armor00_hand-downside_c1.");
NLMISC::strFindReplace(stdPath, "fy_hom_armor00_hand-upside.", "fy_hom_armor00_hand-upside_c1.");
NLMISC::strFindReplace(stdPath, "fy_hom_armor00_pieds.", "fy_hom_armor00_pieds_c1.");
NLMISC::strFindReplace(stdPath, "fy_hom_armor00_torse.", "fy_hom_armor00_torse_c1.");
NLMISC::strFindReplace(stdPath, "interfaces_visage", "visage_interface");
if (stdPath.find("\\trame.") != std::string::npos)
stdPath = standardizePath(databaseDirectory + "/stuff/lod_actors/texture_lod/trame.png", false);
if (stdPath.find("\\tr_hof_visage_c1.") != std::string::npos)
stdPath = standardizePath(databaseDirectory + "/stuff/tryker/agents/_textures/actors/tr_hof_visage_c1.png", false);
if (stdPath.find("\\tr_hof_visage_c2.") != std::string::npos)
stdPath = standardizePath(databaseDirectory + "/stuff/tryker/agents/_textures/actors/tr_hof_visage_c2.png", false);
if (stdPath.find("\\tr_hof_visage_c3.") != std::string::npos)
stdPath = standardizePath(databaseDirectory + "/stuff/tryker/agents/_textures/actors/tr_hof_visage_c3.png", false);
if (stdPath.find("\\ma_hof_cheveux_medium02.") != std::string::npos)
stdPath = standardizePath(databaseDirectory + "/stuff/matis/agents/_textures/actors/ma_hof_cheveux_medium02.png", false);
/*if (stdPath.size() > path.size())
{
nlwarning("Path size becomes too large: '%s' -> '%s'", path.c_str(), stdPath.c_str());
return path;
}*/
if (NLMISC::CFile::getFilename(stdPath) == stdPath) if (NLMISC::CFile::getFilename(stdPath) == stdPath)
{
breakable
{ {
breakable if (fileNameCache.find(stdPath) == fileNameCache.end() || KnownFileCache.find(stdPath) == KnownFileCache.end())
{ {
if (fileNameCache.find(stdPath) == fileNameCache.end()) if (stdPath[stdPath.size() - 3] == 't' && stdPath[stdPath.size() - 2] == 'g' && stdPath[stdPath.size() - 1] == 'a')
{ {
if (stdPath[stdPath.size() - 3] == 't' && stdPath[stdPath.size() - 2] == 'g' && stdPath[stdPath.size() - 1] == 'a') stdPath[stdPath.size() - 3] = 'p';
{ stdPath[stdPath.size() - 2] = 'n';
stdPath[stdPath.size() - 3] = 'p'; stdPath[stdPath.size() - 1] = 'g';
stdPath[stdPath.size() - 2] = 'n'; if (fileNameCache.find(stdPath) != fileNameCache.end())
stdPath[stdPath.size() - 1] = 'g'; break;
if (fileNameCache.find(stdPath) != fileNameCache.end())
break;
}
nlwarning("File name not known: '%s' ('%s')", path.c_str(), stdPath.c_str());
return stdPath;
} }
nlwarning("File name not known: '%s' ('%s')", path.c_str(), stdPath.c_str());
return stdPath;
} }
return stdPath;
} }
else return stdPath;
}
else
{
if (stdPath.find(databaseDirectory) == std::string::npos)
{ {
if (stdPath.find(databaseDirectory) == std::string::npos) if (stdPath[1] == ':' || (stdPath[0] == '\\' && stdPath[1] == '\\'))
{ {
if (stdPath[1] == ':' || (stdPath[0] == '\\' && stdPath[1] == '\\')) if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end())
{ return KnownFileCache[NLMISC::CFile::getFilename(stdPath)];
nlwarning("Path not in database: '%s' ('%s')", path.c_str(), stdPath.c_str());
MissingFiles.insert(path); if (stdPath[stdPath.size() - 3] == 't' && stdPath[stdPath.size() - 2] == 'g' && stdPath[stdPath.size() - 1] == 'a')
return stdPath; { stdPath[stdPath.size() - 3] = 'p'; stdPath[stdPath.size() - 2] = 'n'; stdPath[stdPath.size() - 1] = 'g'; }
} if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end())
else return KnownFileCache[NLMISC::CFile::getFilename(stdPath)];
{
// invalid path, don't care too much if (stdPath[stdPath.size() - 3] == 'p' && stdPath[stdPath.size() - 2] == 'n' && stdPath[stdPath.size() - 1] == 'g')
return stdPath; { stdPath[stdPath.size() - 3] = 't'; stdPath[stdPath.size() - 2] = 'g'; stdPath[stdPath.size() - 1] = 'a'; }
} if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end())
return KnownFileCache[NLMISC::CFile::getFilename(stdPath)];
nlwarning("Path not in database: '%s' ('%s')", path.c_str(), stdPath.c_str());
MissingFiles.insert(path);
return stdPath;
} }
else
{
// invalid path, don't care too much
return stdPath;
}
}
breakable breakable
{
if (!NLMISC::CFile::fileExists(stdPath))
{ {
if (!NLMISC::CFile::fileExists(stdPath)) if (stdPath[stdPath.size() - 3] == 't' && stdPath[stdPath.size() - 2] == 'g' && stdPath[stdPath.size() - 1] == 'a')
{
stdPath[stdPath.size() - 3] = 'p';
stdPath[stdPath.size() - 2] = 'n';
stdPath[stdPath.size() - 1] = 'g';
if (NLMISC::CFile::fileExists(stdPath))
break;
}
{ {
if (stdPath[stdPath.size() - 3] == 't' && stdPath[stdPath.size() - 2] == 'g' && stdPath[stdPath.size() - 1] == 'a') std::string stdPathVv2 = standardizePath(NLMISC::CFile::getPath(stdPath) + "/vv2/" + NLMISC::CFile::getFilename(stdPath), false);
bool vv2works = false;
if (NLMISC::CFile::fileExists(stdPathVv2))
{ {
stdPath[stdPath.size() - 3] = 'p'; vv2works = true;
stdPath[stdPath.size() - 2] = 'n';
stdPath[stdPath.size() - 1] = 'g';
if (NLMISC::CFile::fileExists(stdPath))
break;
} }
else
{ {
std::string stdPathVv2 = standardizePath(NLMISC::CFile::getPath(stdPath) + "/vv2/" + NLMISC::CFile::getFilename(stdPath), false); if (stdPathVv2[stdPathVv2.size() - 3] == 'p' && stdPathVv2[stdPathVv2.size() - 2] == 'n' && stdPathVv2[stdPathVv2.size() - 1] == 'g')
bool vv2works = false;
if (NLMISC::CFile::fileExists(stdPathVv2))
{ {
vv2works = true; stdPathVv2[stdPathVv2.size() - 3] = 't';
} stdPathVv2[stdPathVv2.size() - 2] = 'g';
else stdPathVv2[stdPathVv2.size() - 1] = 'a';
{ if (NLMISC::CFile::fileExists(stdPathVv2))
if (stdPathVv2[stdPathVv2.size() - 3] == 'p' && stdPathVv2[stdPathVv2.size() - 2] == 'n' && stdPathVv2[stdPathVv2.size() - 1] == 'g')
{ {
stdPathVv2[stdPathVv2.size() - 3] = 't'; vv2works = true;
stdPathVv2[stdPathVv2.size() - 2] = 'g';
stdPathVv2[stdPathVv2.size() - 1] = 'a';
if (NLMISC::CFile::fileExists(stdPathVv2))
{
vv2works = true;
}
} }
} }
if (vv2works) }
if (vv2works)
{
// try with vv2
/*if (stdPathVv2.size() > path.size())
{ {
// try with vv2 nlwarning("Path with vv2 size becomes too large: '%s' -> '%s'", path.c_str(), stdPathVv2.c_str());
if (stdPathVv2.size() > path.size()) return stdPath;
{
nlwarning("Path with vv2 size becomes too large: '%s' -> '%s'", path.c_str(), stdPathVv2.c_str());
return stdPath;
}
else
{
stdPath = stdPathVv2;
break;
}
} }
else
{*/
stdPath = stdPathVv2;
break;
//}
} }
nlwarning("Path file does not exist: '%s' ('%s')", path.c_str(), stdPath.c_str());
MissingFiles.insert(path);
return stdPath;
} }
// try find
if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end())
return KnownFileCache[NLMISC::CFile::getFilename(stdPath)];
if (stdPath[stdPath.size() - 3] == 't' && stdPath[stdPath.size() - 2] == 'g' && stdPath[stdPath.size() - 1] == 'a')
{ stdPath[stdPath.size() - 3] = 'p'; stdPath[stdPath.size() - 2] = 'n'; stdPath[stdPath.size() - 1] = 'g'; }
if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end())
return KnownFileCache[NLMISC::CFile::getFilename(stdPath)];
if (stdPath[stdPath.size() - 3] == 'p' && stdPath[stdPath.size() - 2] == 'n' && stdPath[stdPath.size() - 1] == 'g')
{ stdPath[stdPath.size() - 3] = 't'; stdPath[stdPath.size() - 2] = 'g'; stdPath[stdPath.size() - 1] = 'a'; }
if (KnownFileCache.find(NLMISC::CFile::getFilename(stdPath)) != KnownFileCache.end())
return KnownFileCache[NLMISC::CFile::getFilename(stdPath)];
nlwarning("Path file does not exist: '%s' ('%s')", path.c_str(), stdPath.c_str());
MissingFiles.insert(path);
return stdPath;
} }
} }
fileNameCache.insert(NLMISC::CFile::getFilename(stdPath));
return stdPath;
} }
fileNameCache.insert(NLMISC::CFile::getFilename(stdPath));
return stdPath;
}
class CMaxRewritePathsCommand : public NLMISC::IRunnable
{
public:
NLMISC::CLog *Log;
std::string SrcDirectoryRecursive;
std::string DatabaseDirectory;
virtual void getName(std::string &result) const
{ result = "CMaxRewritePathsCommand"; }
void doFile(const std::string &filePath) void doFile(const std::string &filePath)
{ {
if (filePath[filePath.size() - 3] == 'm' && filePath[filePath.size() - 2] == 'a' && filePath[filePath.size() - 1] == 'x') if (filePath[filePath.size() - 3] == 'm' && filePath[filePath.size() - 2] == 'a' && filePath[filePath.size() - 1] == 'x')
@ -359,17 +421,20 @@ public:
{ {
nldebug("Directory: '%s'", directoryPath.c_str()); nldebug("Directory: '%s'", directoryPath.c_str());
std::string dirPath = standardizePath(SrcDirectoryRecursive, true); std::string dirPath = standardizePath(directoryPath, true);
std::vector<std::string> dirContents; std::vector<std::string> dirContents;
NLMISC::CPath::getPathContent(dirPath, false, true, true, dirContents); NLMISC::CPath::getPathContent(dirPath, false, true, true, dirContents);
for (std::vector<std::string>::iterator it = dirContents.begin(), end = dirContents.end(); it != end; ++it) for (std::vector<std::string>::iterator it = dirContents.begin(), end = dirContents.end(); it != end; ++it)
{ {
const std::string &subPath = *it; const std::string &subPath = standardizePath(*it, false);
if (NLMISC::CFile::isDirectory(subPath)) if (NLMISC::CFile::isDirectory(subPath))
doDirectory(subPath); {
if (subPath.find("\\.") == std::string.npos)
doDirectory(subPath);
}
else else
doFile(subPath); doFile(subPath);
@ -394,10 +459,79 @@ public:
}; };
CMaxRewritePathsCommand s_MaxRewritePathsCommand; CMaxRewritePathsCommand s_MaxRewritePathsCommand;
class CMaxRewriteInitCacheCommand : public NLMISC::IRunnable
{
public:
NLMISC::CLog *Log;
std::string SrcDirectoryRecursive;
std::string DatabaseDirectory;
virtual void getName(std::string &result) const
{ result = "CMaxRewriteInitCacheCommand"; }
void doFile(const std::string &filePath)
{
KnownFileCache[NLMISC::CFile::getFilename(filePath)] = standardizePath(filePath, true);
}
// maxRewritePaths W:/database/interfaces/anims_max
void doDirectory(const std::string &directoryPath)
{
nldebug("Directory: '%s'", directoryPath.c_str());
std::string dirPath = standardizePath(directoryPath, true);
std::vector<std::string> dirContents;
NLMISC::CPath::getPathContent(dirPath, false, true, true, dirContents);
for (std::vector<std::string>::iterator it = dirContents.begin(), end = dirContents.end(); it != end; ++it)
{
const std::string &subPath = standardizePath(*it, false);
if (NLMISC::CFile::isDirectory(subPath))
{
if (subPath.find("\\.") == std::string.npos)
doDirectory(subPath);
}
else
doFile(subPath);
if (PIPELINE::IPipelineInterface::getInstance()->isExiting())
return;
}
}
virtual void run()
{
std::string tempDirectory = PIPELINE::IPipelineProcess::getInstance()->getTempDirectory();
DatabaseDirectory = standardizePath(PIPELINE::IPipelineInterface::getInstance()->getConfigFile().getVar("DatabaseDirectory").asString(0), true);
nlinfo("DatabaseDirectory: '%s'", DatabaseDirectory.c_str());
doDirectory(SrcDirectoryRecursive);
PIPELINE::IPipelineInterface::getInstance()->endedRunnableTask();
}
};
CMaxRewriteInitCacheCommand s_MaxRewriteInitCacheCommand;
} /* anonymous namespace */ } /* anonymous namespace */
} /* namespace PIPELINE */ } /* namespace PIPELINE */
NLMISC_CATEGORISED_COMMAND(max, maxRewriteInitCache, "Find all .tga, .png and .max files", "<srcDirectoryRecursive>")
{
if(args.size() != 1) return false;
PIPELINE::s_MaxRewriteInitCacheCommand.Log = &log;
PIPELINE::s_MaxRewriteInitCacheCommand.SrcDirectoryRecursive = args[0];
if (!PIPELINE::IPipelineInterface::getInstance()->tryRunnableTask("COMMAND_MAX_REWRITE_INIT_CACHE", &PIPELINE::s_MaxRewriteInitCacheCommand))
{
log.displayNL("Busy.");
return false;
}
return true;
}
NLMISC_CATEGORISED_COMMAND(max, maxRewritePaths, "Rewrite all paths to .tga, .png and .max files found in a max file", "<srcDirectoryRecursive>") NLMISC_CATEGORISED_COMMAND(max, maxRewritePaths, "Rewrite all paths to .tga, .png and .max files found in a max file", "<srcDirectoryRecursive>")
{ {
if(args.size() != 1) return false; if(args.size() != 1) return false;

Loading…
Cancel
Save