Changed: Allow to extract interface elements with build_interface
This commit is contained in:
parent
2e93b84f2c
commit
25834f81d8
1 changed files with 109 additions and 0 deletions
|
@ -210,6 +210,7 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
args.setDescription("Build a huge interface texture from several small elements to optimize video memory usage.");
|
args.setDescription("Build a huge interface texture from several small elements to optimize video memory usage.");
|
||||||
args.addArg("s", "subset", "existing_uv_txt_name", "Build a subset of an existing interface definition while preserving the existing texture ids, to support freeing up VRAM by switching to the subset without rebuilding the entire interface.");
|
args.addArg("s", "subset", "existing_uv_txt_name", "Build a subset of an existing interface definition while preserving the existing texture ids, to support freeing up VRAM by switching to the subset without rebuilding the entire interface.");
|
||||||
|
args.addArg("x", "extract", "", "Extract all interface elements from <output_filename> to <input_path>.");
|
||||||
args.addAdditionalArg("output_filename", "PNG or TGA file to generate", true);
|
args.addAdditionalArg("output_filename", "PNG or TGA file to generate", true);
|
||||||
args.addAdditionalArg("input_path", "Path that containts interfaces elements", false);
|
args.addAdditionalArg("input_path", "Path that containts interfaces elements", false);
|
||||||
|
|
||||||
|
@ -225,6 +226,9 @@ int main(int argc, char **argv)
|
||||||
existingUVfilename = args.getArg("s").front();
|
existingUVfilename = args.getArg("s").front();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// extract all interface elements
|
||||||
|
bool extractElements = args.haveArg("x");
|
||||||
|
|
||||||
std::vector<std::string> inputDirs = args.getAdditionalArg("input_path");
|
std::vector<std::string> inputDirs = args.getAdditionalArg("input_path");
|
||||||
|
|
||||||
string fmtName = args.getAdditionalArg("output_filename").front();
|
string fmtName = args.getAdditionalArg("output_filename").front();
|
||||||
|
@ -232,6 +236,111 @@ int main(int argc, char **argv)
|
||||||
// append PNG extension if no one provided
|
// append PNG extension if no one provided
|
||||||
if (fmtName.rfind('.') == string::npos) fmtName += ".png";
|
if (fmtName.rfind('.') == string::npos) fmtName += ".png";
|
||||||
|
|
||||||
|
if (extractElements)
|
||||||
|
{
|
||||||
|
if (inputDirs.empty())
|
||||||
|
{
|
||||||
|
outString(toString("ERROR: No input directories specified"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// name of UV file
|
||||||
|
existingUVfilename = fmtName.substr(0, fmtName.rfind('.'));
|
||||||
|
existingUVfilename += ".txt";
|
||||||
|
|
||||||
|
// Load existing UV file
|
||||||
|
CIFile iFile;
|
||||||
|
string filename = CPath::lookup(existingUVfilename, false);
|
||||||
|
|
||||||
|
if (filename.empty() || !iFile.open(filename))
|
||||||
|
{
|
||||||
|
outString(toString("ERROR: Unable to open %s", existingUVfilename.c_str()));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load existing bitmap file
|
||||||
|
CIFile bitmapFile;
|
||||||
|
|
||||||
|
if (!bitmapFile.open(fmtName))
|
||||||
|
{
|
||||||
|
outString(toString("ERROR: Unable to open %s", fmtName.c_str()));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// load bitmap
|
||||||
|
CBitmap textureBitmap;
|
||||||
|
uint8 colors = textureBitmap.load(bitmapFile);
|
||||||
|
|
||||||
|
// file already loaded in memory, close it
|
||||||
|
bitmapFile.close();
|
||||||
|
|
||||||
|
if (colors != 32)
|
||||||
|
{
|
||||||
|
outString(toString("ERROR: %s is not a RGBA bitmap", existingUVfilename.c_str()));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure transparent pixels are black
|
||||||
|
textureBitmap.makeTransparentPixelsBlack();
|
||||||
|
|
||||||
|
float textureWidth = (float)textureBitmap.getWidth();
|
||||||
|
float textureHeight = (float)textureBitmap.getHeight();
|
||||||
|
|
||||||
|
char bufTmp[256], tgaName[256];
|
||||||
|
string sTGAname;
|
||||||
|
float uvMinU, uvMinV, uvMaxU, uvMaxV;
|
||||||
|
while (!iFile.eof())
|
||||||
|
{
|
||||||
|
iFile.getline(bufTmp, 256);
|
||||||
|
|
||||||
|
if (sscanf(bufTmp, "%s %f %f %f %f", tgaName, &uvMinU, &uvMinV, &uvMaxU, &uvMaxV) != 5)
|
||||||
|
{
|
||||||
|
nlwarning("Can't parse %s", bufTmp);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
float xf = uvMinU * textureWidth;
|
||||||
|
float yf = uvMinV * textureHeight;
|
||||||
|
float widthf = (uvMaxU - uvMinU) * textureWidth;
|
||||||
|
float heightf = (uvMaxV - uvMinV) * textureHeight;
|
||||||
|
|
||||||
|
uint x = (uint)xf;
|
||||||
|
uint y = (uint)yf;
|
||||||
|
uint width = (uint)widthf;
|
||||||
|
uint height = (uint)heightf;
|
||||||
|
|
||||||
|
if ((float)x != xf || (float)y != yf || (float)width != widthf || (float)height != heightf)
|
||||||
|
{
|
||||||
|
nlwarning("Wrong round");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (width && height)
|
||||||
|
{
|
||||||
|
// create bitmap
|
||||||
|
CBitmap bitmap;
|
||||||
|
bitmap.resize(width, height);
|
||||||
|
bitmap.blit(textureBitmap, x, y, width, height, 0, 0);
|
||||||
|
|
||||||
|
sTGAname = inputDirs.front() + "/" + tgaName;
|
||||||
|
|
||||||
|
if (writeFileDependingOnFilename(sTGAname, bitmap))
|
||||||
|
{
|
||||||
|
outString(toString("Writing file %s", sTGAname.c_str()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outString(toString("Unable to writing file %s", sTGAname.c_str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outString(toString("Bitmap with wrong size"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
vector<string> AllMapNames;
|
vector<string> AllMapNames;
|
||||||
vector<string>::iterator it = inputDirs.begin(), itEnd = inputDirs.end();
|
vector<string>::iterator it = inputDirs.begin(), itEnd = inputDirs.end();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue