1
0
forked from 0ad/0ad

Add screenshot location logging w/ rendered console message. Rendered messages are hidden before screenshot is taken. Fixes #675

This was SVN commit r8675.
This commit is contained in:
historic_bruno 2010-11-21 01:25:16 +00:00
parent e7b859b8a5
commit 2963422173
5 changed files with 61 additions and 8 deletions

View File

@ -150,7 +150,7 @@ static std::string ToHTML(const wchar_t* message)
return cmessage;
}
void CLogger::WriteMessage(const wchar_t* message)
void CLogger::WriteMessage(const wchar_t* message, bool doRender = false)
{
std::string cmessage = ToHTML(message);
@ -163,8 +163,12 @@ void CLogger::WriteMessage(const wchar_t* message)
*m_MainLog << "<p>" << cmessage << "</p>\n";
m_MainLog->flush();
// Don't do this since it results in too much noise:
// PushRenderMessage(Normal, message);
if (doRender)
{
if (g_Console) g_Console->InsertMessage(L"INFO: %ls", message);
PushRenderMessage(Normal, message);
}
}
void CLogger::WriteError(const wchar_t* message)
@ -254,6 +258,22 @@ void CLogger::LogMessage(const wchar_t* fmt, ...)
WriteMessage(buffer);
}
void CLogger::LogMessageRender(const wchar_t* fmt, ...)
{
va_list argp;
wchar_t buffer[BUFFER_SIZE] = {0};
va_start(argp, fmt);
if (sys_vswprintf(buffer, ARRAY_SIZE(buffer), fmt, argp) == -1)
{
// Buffer too small - ensure the string is nicely terminated
wcscpy_s(buffer+ARRAY_SIZE(buffer)-4, 4, L"...");
}
va_end(argp);
WriteMessage(buffer, true);
}
void CLogger::LogWarning(const wchar_t* fmt, ...)
{
va_list argp;

View File

@ -34,6 +34,7 @@ extern CLogger* g_Logger;
// from all of the files. LOG_INFO, LOG_WARNING and LOG_ERROR are currently existing macros.
#define LOGMESSAGE g_Logger->LogMessage
#define LOGMESSAGERENDER g_Logger->LogMessageRender
#define LOGWARNING g_Logger->LogWarning
#define LOGERROR g_Logger->LogError
@ -67,7 +68,7 @@ public:
// Functions to write different message types (Errors and warnings are placed
// both in mainLog and intrestingLog.)
void WriteMessage(const wchar_t* message);
void WriteMessage(const wchar_t* message, bool doRender);
void WriteError (const wchar_t* message);
void WriteWarning(const wchar_t* message);
@ -77,6 +78,7 @@ public:
// Functions to write a message, warning or error to file.
void LogMessage(const wchar_t* fmt, ...) WPRINTF_ARGS(2);
void LogMessageRender(const wchar_t* fmt, ...) WPRINTF_ARGS(2);
void LogWarning(const wchar_t* fmt, ...) WPRINTF_ARGS(2);
void LogError(const wchar_t* fmt, ...) WPRINTF_ARGS(2);

View File

@ -113,6 +113,7 @@ ERROR_TYPE(System, RequiredExtensionsMissing);
#define LOG_CATEGORY L"gamesetup"
bool g_DoRenderGui = true;
bool g_DoRenderLogger = true;
static const int SANE_TEX_QUALITY_DEFAULT = 5; // keep in sync with code
@ -258,7 +259,7 @@ void Render()
ogl_WarnIfError();
PROFILE_START("render logger");
g_Logger->Render();
if(g_DoRenderLogger) g_Logger->Render();
PROFILE_END("render logger");
ogl_WarnIfError();
@ -734,7 +735,7 @@ void EarlyInit()
static bool Autostart(const CmdLineArgs& args);
void Init(const CmdLineArgs& args, int flags)
void Init(const CmdLineArgs& args, int UNUSED(flags))
{
h_mgr_init();
@ -878,6 +879,10 @@ void RenderGui(bool RenderingState)
g_DoRenderGui = RenderingState;
}
void RenderLogger(bool RenderingState)
{
g_DoRenderLogger = RenderingState;
}
static bool Autostart(const CmdLineArgs& args)
{

View File

@ -49,6 +49,7 @@ enum InitFlags
* enable/disable rendering of the GUI (intended mainly for screenshots)
*/
extern void RenderGui(bool RenderingState);
extern void RenderLogger(bool RenderingState);
class CmdLineArgs;
extern void Init(const CmdLineArgs& args, int flags);

View File

@ -36,6 +36,7 @@
#include "ps/GameSetup/Config.h"
#include "ps/GameSetup/GameSetup.h"
#include "ps/Game.h"
#include "ps/CLogger.h"
#include "ps/Filesystem.h"
#include "ps/VideoMode.h"
#include "renderer/Renderer.h"
@ -243,6 +244,11 @@ void WriteScreenshot(const std::wstring& extension)
flags |= TEX_BGR;
}
// Hide log messages and re-render
RenderLogger(false);
Render();
RenderLogger(true);
const size_t img_size = w * h * bpp/8;
const size_t hdr_size = tex_hdr_size(filename);
shared_ptr<u8> buf = io_Allocate(hdr_size+img_size);
@ -251,7 +257,16 @@ void WriteScreenshot(const std::wstring& extension)
if(tex_wrap(w, h, bpp, flags, buf, hdr_size, &t) < 0)
return;
glReadPixels(0, 0, (GLsizei)w, (GLsizei)h, fmt, GL_UNSIGNED_BYTE, img);
(void)tex_write(&t, filename);
if (tex_write(&t, filename) == INFO::OK)
{
fs::wpath realPath;
g_VFS->GetRealPath(filename, realPath);
LOGMESSAGERENDER(L"Screenshot written to '%ls'", realPath.string().c_str());
}
else
LOGERROR(L"Error writing screenshot to '%ls'", filename.string().c_str());
tex_free(&t);
}
@ -335,9 +350,11 @@ void WriteBigScreenshot(const std::wstring& extension, int tiles)
// Adjust the camera to render the appropriate region
g_Game->GetView()->GetCamera()->SetProjectionTile(tiles, tile_x, tile_y);
RenderLogger(false);
RenderGui(false);
Render();
RenderGui(true);
RenderLogger(true);
// Copy the tile pixels into the main image
glReadPixels(0, 0, tile_w, tile_h, fmt, GL_UNSIGNED_BYTE, tile_data);
@ -367,7 +384,15 @@ void WriteBigScreenshot(const std::wstring& extension, int tiles)
g_Game->GetView()->GetCamera()->SetProjectionTile(1, 0, 0);
}
(void)tex_write(&t, filename);
if (tex_write(&t, filename) == INFO::OK)
{
fs::wpath realPath;
g_VFS->GetRealPath(filename, realPath);
LOGMESSAGERENDER(L"Screenshot written to '%ls'", realPath.string().c_str());
}
else
LOGERROR(L"Error writing screenshot to '%ls'", filename.string().c_str());
tex_free(&t);
free(tile_data);
}