Fixed: #1196 Allow to dump ZBuffer when doing a screenshot
This commit is contained in:
parent
681703dff6
commit
8f9822595b
4 changed files with 96 additions and 46 deletions
|
@ -410,6 +410,7 @@ CClientConfig::CClientConfig()
|
||||||
ScreenShotWidth = 0;
|
ScreenShotWidth = 0;
|
||||||
ScreenShotHeight = 0;
|
ScreenShotHeight = 0;
|
||||||
ScreenShotFullDetail = true;
|
ScreenShotFullDetail = true;
|
||||||
|
ScreenShotZBuffer = false;
|
||||||
|
|
||||||
MaxNumberOfTimedFXInstances = 20;
|
MaxNumberOfTimedFXInstances = 20;
|
||||||
SelectionFX = "sfx_selection_mouseover.ps";
|
SelectionFX = "sfx_selection_mouseover.ps";
|
||||||
|
@ -1028,6 +1029,7 @@ void CClientConfig::setValues()
|
||||||
READ_INT_FV(ScreenShotWidth)
|
READ_INT_FV(ScreenShotWidth)
|
||||||
READ_INT_FV(ScreenShotHeight)
|
READ_INT_FV(ScreenShotHeight)
|
||||||
READ_BOOL_FV(ScreenShotFullDetail)
|
READ_BOOL_FV(ScreenShotFullDetail)
|
||||||
|
READ_BOOL_FV(ScreenShotZBuffer)
|
||||||
|
|
||||||
/////////////////////////
|
/////////////////////////
|
||||||
// NEW PATCHING SYSTEM //
|
// NEW PATCHING SYSTEM //
|
||||||
|
|
|
@ -280,6 +280,7 @@ struct CClientConfig
|
||||||
uint ScreenShotWidth; // If 0 : normal screen shot, else custom screen shot without interface
|
uint ScreenShotWidth; // If 0 : normal screen shot, else custom screen shot without interface
|
||||||
uint ScreenShotHeight;
|
uint ScreenShotHeight;
|
||||||
bool ScreenShotFullDetail; // If set to true, then load balancing will be disabled for the duration of the screenshot
|
bool ScreenShotFullDetail; // If set to true, then load balancing will be disabled for the duration of the screenshot
|
||||||
|
bool ScreenShotZBuffer; // If set to true, save also the ZBuffer in a file
|
||||||
|
|
||||||
/////////////////////////
|
/////////////////////////
|
||||||
// NEW PATCHING SYSTEM //
|
// NEW PATCHING SYSTEM //
|
||||||
|
|
|
@ -600,6 +600,67 @@ void initScreenshot()
|
||||||
if (!CFile::isExists(ScreenshotsDirectory)) CFile::createDirectory(ScreenshotsDirectory);
|
if (!CFile::isExists(ScreenshotsDirectory)) CFile::createDirectory(ScreenshotsDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool screenshotZBuffer(const std::string &filename)
|
||||||
|
{
|
||||||
|
std::string::size_type pos = filename.find(".");
|
||||||
|
|
||||||
|
if (pos == std::string::npos)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::string filename_z = filename.substr(0, pos) + "_z" + filename.substr(pos);
|
||||||
|
std::string ext = filename.substr(pos+1);
|
||||||
|
|
||||||
|
std::vector<float> z;
|
||||||
|
Driver->getZBuffer(z);
|
||||||
|
|
||||||
|
float min = std::numeric_limits<float>::max();
|
||||||
|
float max = std::numeric_limits<float>::min();
|
||||||
|
|
||||||
|
// get min and max values
|
||||||
|
for(uint i = 0; i < z.size(); ++i)
|
||||||
|
{
|
||||||
|
float value = z[i];
|
||||||
|
if (value > max)
|
||||||
|
{
|
||||||
|
max = value;
|
||||||
|
}
|
||||||
|
else if (value < min)
|
||||||
|
{
|
||||||
|
min = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
max = max - min;
|
||||||
|
|
||||||
|
CBitmap zi;
|
||||||
|
zi.resize(Driver->getWindowWidth(), Driver->getWindowHeight());
|
||||||
|
CRGBA *dest = (CRGBA *) &zi.getPixels()[0];
|
||||||
|
|
||||||
|
for(uint k = 0; k < z.size(); ++k)
|
||||||
|
{
|
||||||
|
// normalize values
|
||||||
|
uint8 i = (uint8) ((z[k] - min) * 255.f / max);
|
||||||
|
dest->set(i, i, i, i);
|
||||||
|
++ dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
COFile f;
|
||||||
|
f.open(filename_z);
|
||||||
|
if (ext == "png")
|
||||||
|
zi.writePNG(f, 32);
|
||||||
|
else
|
||||||
|
zi.writeTGA(f, 32);
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void screenShotTGA()
|
void screenShotTGA()
|
||||||
{
|
{
|
||||||
CBitmap btm;
|
CBitmap btm;
|
||||||
|
@ -607,10 +668,20 @@ void screenShotTGA()
|
||||||
|
|
||||||
string filename = CFile::findNewFile (ScreenshotsDirectory+"screenshot.tga");
|
string filename = CFile::findNewFile (ScreenshotsDirectory+"screenshot.tga");
|
||||||
COFile fs(filename);
|
COFile fs(filename);
|
||||||
btm.writeTGA(fs, 24, false);
|
|
||||||
nlinfo("Screenshot '%s' saved in tga format (%dx%d)", filename.c_str(), (int) ClientCfg.ScreenShotWidth, (int) ClientCfg.ScreenShotHeight);
|
if (!btm.writeTGA(fs, 24, false))
|
||||||
|
{
|
||||||
|
fs.close();
|
||||||
|
CFile::deleteFile(filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ClientCfg.ScreenShotZBuffer)
|
||||||
|
screenshotZBuffer(filename);
|
||||||
|
|
||||||
|
nlinfo("Screenshot '%s' saved in tga format (%ux%u)", filename.c_str(), ClientCfg.ScreenShotWidth, ClientCfg.ScreenShotHeight);
|
||||||
displayScreenShotSavedInfo(filename);
|
displayScreenShotSavedInfo(filename);
|
||||||
};
|
}
|
||||||
|
|
||||||
void screenShotPNG()
|
void screenShotPNG()
|
||||||
{
|
{
|
||||||
|
@ -619,6 +690,7 @@ void screenShotPNG()
|
||||||
|
|
||||||
string filename = CFile::findNewFile (ScreenshotsDirectory+"screenshot.png");
|
string filename = CFile::findNewFile (ScreenshotsDirectory+"screenshot.png");
|
||||||
COFile fs(filename);
|
COFile fs(filename);
|
||||||
|
|
||||||
if (!btm.writePNG(fs, 24))
|
if (!btm.writePNG(fs, 24))
|
||||||
{
|
{
|
||||||
fs.close();
|
fs.close();
|
||||||
|
@ -626,9 +698,12 @@ void screenShotPNG()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
nlinfo("Screenshot '%s' saved in png format (%dx%d)", filename.c_str(), (int) ClientCfg.ScreenShotWidth, (int) ClientCfg.ScreenShotHeight);
|
if (ClientCfg.ScreenShotZBuffer)
|
||||||
|
screenshotZBuffer(filename);
|
||||||
|
|
||||||
|
nlinfo("Screenshot '%s' saved in png format (%ux%u)", filename.c_str(), ClientCfg.ScreenShotWidth, ClientCfg.ScreenShotHeight);
|
||||||
displayScreenShotSavedInfo(filename);
|
displayScreenShotSavedInfo(filename);
|
||||||
};
|
}
|
||||||
|
|
||||||
void screenShotJPG()
|
void screenShotJPG()
|
||||||
{
|
{
|
||||||
|
@ -637,10 +712,20 @@ void screenShotJPG()
|
||||||
|
|
||||||
string filename = CFile::findNewFile (ScreenshotsDirectory+"screenshot.jpg");
|
string filename = CFile::findNewFile (ScreenshotsDirectory+"screenshot.jpg");
|
||||||
COFile fs(filename);
|
COFile fs(filename);
|
||||||
btm.writeJPG(fs);
|
|
||||||
nlinfo("Screenshot '%s' saved in jpg format (%dx%d)", filename.c_str(), (int) ClientCfg.ScreenShotWidth, (int) ClientCfg.ScreenShotHeight);
|
if (!btm.writeJPG(fs))
|
||||||
|
{
|
||||||
|
fs.close();
|
||||||
|
CFile::deleteFile(filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ClientCfg.ScreenShotZBuffer)
|
||||||
|
screenshotZBuffer(filename);
|
||||||
|
|
||||||
|
nlinfo("Screenshot '%s' saved in jpg format (%ux%u)", filename.c_str(), ClientCfg.ScreenShotWidth, ClientCfg.ScreenShotHeight);
|
||||||
displayScreenShotSavedInfo(filename);
|
displayScreenShotSavedInfo(filename);
|
||||||
};
|
}
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
|
||||||
|
|
|
@ -2739,44 +2739,6 @@ bool mainLoop()
|
||||||
R2::getEditor().updateBeforeSwapBuffer();
|
R2::getEditor().updateBeforeSwapBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
static volatile bool captureBuffers = false;
|
|
||||||
if (captureBuffers)
|
|
||||||
{
|
|
||||||
CBitmap color;
|
|
||||||
Driver->getBuffer(color);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
COFile f;
|
|
||||||
f.open("color.tga");
|
|
||||||
color.writeTGA(f);
|
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
std::vector<float> z;
|
|
||||||
Driver->getZBuffer(z);
|
|
||||||
CBitmap zi;
|
|
||||||
zi.resize(color.getWidth(), color.getHeight());
|
|
||||||
CRGBA *dest = (CRGBA *) &zi.getPixels()[0];
|
|
||||||
for(uint k = 0; k < z.size(); ++k)
|
|
||||||
{
|
|
||||||
uint8 i = (uint8) (z[k] * 255.f);
|
|
||||||
dest->set(i, i, i, i);
|
|
||||||
++ dest;
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
COFile f;
|
|
||||||
f.open("z.tga");
|
|
||||||
zi.writeTGA(f);
|
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Driver->swapBuffers();
|
Driver->swapBuffers();
|
||||||
|
|
||||||
if(Profiling)
|
if(Profiling)
|
||||||
|
|
Loading…
Reference in a new issue