2010-05-07 09:06:20 +00:00
|
|
|
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
|
|
|
// Copyright (C) 2010 Winch Gate Property Limited
|
|
|
|
//
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Affero General Public License as
|
|
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
|
|
// License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Affero General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2010-05-06 00:08:41 +00:00
|
|
|
|
|
|
|
#include <nel/misc/types_nl.h>
|
|
|
|
#include "graphics_viewport.h"
|
|
|
|
|
|
|
|
// STL includes
|
|
|
|
|
|
|
|
// Qt includes
|
|
|
|
#include <QtGui/QAction>
|
|
|
|
|
|
|
|
// NeL includes
|
|
|
|
#include <nel/misc/debug.h>
|
|
|
|
#include <nel/misc/hierarchical_timer.h>
|
|
|
|
#include <nel/misc/file.h>
|
|
|
|
#include <nel/misc/bitmap.h>
|
|
|
|
#include <nel/misc/path.h>
|
|
|
|
#include <nel/misc/i18n.h>
|
|
|
|
#include <nel/3d/u_driver.h>
|
|
|
|
#include <nel/3d/u_text_context.h>
|
|
|
|
|
|
|
|
// Project includes
|
|
|
|
#include "internationalization.h"
|
|
|
|
#include "graphics_config.h"
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
using namespace NLMISC;
|
|
|
|
using namespace NL3D;
|
|
|
|
|
|
|
|
namespace NLQT {
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
QString nli18n(const char *label)
|
|
|
|
{
|
|
|
|
return QString::fromUtf16(CI18N::get(label).c_str());
|
|
|
|
}
|
|
|
|
|
|
|
|
} /* anonymous namespace */
|
|
|
|
|
|
|
|
CGraphicsViewport::CGraphicsViewport(QWidget *parent)
|
|
|
|
: QWidget(parent),
|
|
|
|
m_GraphicsConfig(NULL),
|
|
|
|
m_Driver(NULL),
|
|
|
|
m_TextContext(NULL)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
CGraphicsViewport::~CGraphicsViewport()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicsViewport::init(CGraphicsConfig *graphicsConfig)
|
|
|
|
{
|
|
|
|
//H_AUTO2
|
|
|
|
nldebug("CGraphicsViewport::init");
|
|
|
|
|
|
|
|
// copy parameters
|
|
|
|
m_GraphicsConfig = graphicsConfig;
|
|
|
|
|
|
|
|
// check stuff we need
|
|
|
|
nlassert(m_GraphicsConfig);
|
|
|
|
|
|
|
|
// create the driver
|
|
|
|
nlassert(!m_Driver);
|
|
|
|
m_Direct3D = false;
|
|
|
|
std::string driver = m_GraphicsConfig->getGraphicsDriver();
|
|
|
|
if (driver == "Direct3D") m_Direct3D = true; //m_Driver = Direct3D;
|
|
|
|
else if (driver == "OpenGL") m_Direct3D = false; //m_Driver = OpenGL;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nlwarning("Invalid driver specified, defaulting to OpenGL");
|
|
|
|
//m_Configuration->getConfigFile().getVar("GraphicsDriver").forceAsString("OpenGL");
|
|
|
|
//m_Driver = OpenGL;
|
|
|
|
}
|
|
|
|
m_Driver = UDriver::createDriver(NULL, m_Direct3D, NULL);
|
|
|
|
nlassert(m_Driver);
|
|
|
|
|
|
|
|
// initialize the window with config file values
|
2010-08-11 10:33:23 +00:00
|
|
|
m_Driver->setDisplay(winId(), NL3D::UDriver::CMode(width(), height(), 32));
|
2010-05-06 00:08:41 +00:00
|
|
|
|
|
|
|
// register config callbacks
|
|
|
|
connect(m_GraphicsConfig, SIGNAL(onBackgroundColor(NLMISC::CRGBA)),
|
|
|
|
this, SLOT(cfcbBackgroundColor(NLMISC::CRGBA)));
|
|
|
|
m_BackgroundColor = m_GraphicsConfig->getBackgroundColor();
|
|
|
|
|
|
|
|
// set the cache size for the font manager(in bytes)
|
|
|
|
m_Driver->setFontManagerMaxMemory(2097152);
|
|
|
|
|
|
|
|
// create the text context
|
|
|
|
nlassert(!m_TextContext);
|
|
|
|
m_TextContext = m_Driver->createTextContext(CPath::lookup(
|
|
|
|
m_GraphicsConfig->getFontName()));
|
|
|
|
nlassert(m_TextContext);
|
|
|
|
connect(m_GraphicsConfig, SIGNAL(onFontShadow(bool)),
|
|
|
|
this, SLOT(cfcbFontShadow(bool)));
|
|
|
|
m_TextContext->setShaded(m_GraphicsConfig->getFontShadow());
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicsViewport::release()
|
|
|
|
{
|
|
|
|
//H_AUTO2
|
|
|
|
nldebug("CGraphicsViewport::release");
|
|
|
|
|
|
|
|
// release text context
|
|
|
|
nlassert(m_TextContext);
|
|
|
|
disconnect(m_GraphicsConfig, SIGNAL(onFontShadow(bool)),
|
|
|
|
this, SLOT(cfcbFontShadow(bool)));
|
|
|
|
m_Driver->deleteTextContext(m_TextContext);
|
|
|
|
m_TextContext = NULL;
|
|
|
|
|
|
|
|
// release driver
|
|
|
|
nlassert(m_Driver);
|
|
|
|
disconnect(m_GraphicsConfig, SIGNAL(onBackgroundColor(NLMISC::CRGBA)),
|
|
|
|
this, SLOT(cfcbBackgroundColor(NLMISC::CRGBA)));
|
|
|
|
m_Driver->release();
|
|
|
|
delete m_Driver;
|
|
|
|
m_Driver = NULL;
|
|
|
|
|
|
|
|
// reset parameters
|
|
|
|
m_GraphicsConfig = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicsViewport::updateInput()
|
|
|
|
{
|
|
|
|
m_Driver->EventServer.pump();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicsViewport::renderDriver()
|
|
|
|
{
|
|
|
|
m_Driver->clearBuffers(m_BackgroundColor);
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicsViewport::renderDebug2D()
|
|
|
|
{
|
|
|
|
m_TextContext->setColor(NL3D::CRGBA (255, 255, 255));
|
|
|
|
m_TextContext->setFontSize(40);
|
|
|
|
m_TextContext->setHotSpot(NL3D::UTextContext::BottomLeft);
|
|
|
|
m_TextContext->printAt(0.3f, 0.5f, std::string("NeL Qt"));
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicsViewport::cfcbBackgroundColor(NLMISC::CRGBA backgroundColor)
|
|
|
|
{
|
|
|
|
m_BackgroundColor = backgroundColor;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicsViewport::cfcbFontShadow(bool fontShadow)
|
|
|
|
{
|
|
|
|
m_TextContext->setShaded(fontShadow);
|
|
|
|
}
|
|
|
|
|
|
|
|
QAction *CGraphicsViewport::createSaveScreenshotAction(QObject *parent)
|
|
|
|
{
|
|
|
|
QAction *action = new QAction(parent);
|
|
|
|
connect(action, SIGNAL(triggered()), this, SLOT(saveScreenshot()));
|
|
|
|
return action;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicsViewport::saveScreenshot()
|
|
|
|
{
|
|
|
|
saveScreenshot(
|
|
|
|
m_GraphicsConfig->getScreenshotName(),
|
|
|
|
m_GraphicsConfig->getScreenshotJPG(),
|
|
|
|
m_GraphicsConfig->getScreenshotPNG(),
|
|
|
|
m_GraphicsConfig->getScreenshotTGA());
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicsViewport::saveScreenshot(const string &name, bool jpg, bool png, bool tga)
|
|
|
|
{
|
|
|
|
//H_AUTO2
|
|
|
|
|
|
|
|
// FIXME: create screenshot path if it doesn't exist!
|
|
|
|
|
|
|
|
// empty bitmap
|
|
|
|
CBitmap bitmap;
|
|
|
|
// copy the driver buffer to the bitmap
|
|
|
|
m_Driver->getBuffer(bitmap);
|
|
|
|
// create the file name
|
|
|
|
string filename = std::string("./")
|
|
|
|
+ m_GraphicsConfig->getScreenshotPath()
|
|
|
|
+ std::string("/") + name;
|
|
|
|
// write the bitmap as a jpg, png or tga to the file
|
|
|
|
if (jpg)
|
|
|
|
{
|
|
|
|
string newfilename = CFile::findNewFile(filename + ".jpg");
|
|
|
|
COFile outputFile(newfilename);
|
|
|
|
bitmap.writeJPG(outputFile, 100);
|
|
|
|
nlinfo("Screenshot '%s' saved", newfilename.c_str());
|
|
|
|
}
|
|
|
|
if (png)
|
|
|
|
{
|
|
|
|
string newfilename = CFile::findNewFile(filename + ".png");
|
|
|
|
COFile outputFile(newfilename);
|
|
|
|
bitmap.writePNG(outputFile, 24);
|
|
|
|
nlinfo("Screenshot '%s' saved", newfilename.c_str());
|
|
|
|
}
|
|
|
|
if (tga)
|
|
|
|
{
|
|
|
|
string newfilename = CFile::findNewFile(filename + ".tga");
|
|
|
|
COFile outputFile(newfilename);
|
|
|
|
bitmap.writeTGA(outputFile, 24, false);
|
|
|
|
nlinfo("Screenshot '%s' saved", newfilename.c_str());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CGraphicsViewport::resizeEvent(QResizeEvent *resizeEvent)
|
|
|
|
{
|
|
|
|
QWidget::resizeEvent(resizeEvent);
|
|
|
|
if (m_Driver && !m_Direct3D)
|
|
|
|
{
|
|
|
|
m_Driver->setMode(UDriver::CMode(resizeEvent->size().width(), resizeEvent->size().height(), 32));
|
|
|
|
}
|
|
|
|
|
|
|
|
// The OpenGL driver does not resize automatically.
|
|
|
|
// The Direct3D driver breaks the window mode to include window borders when calling setMode windowed.
|
|
|
|
|
|
|
|
// Resizing the window after switching drivers a few times becomes slow.
|
|
|
|
// There is probably something inside the drivers not being released properly.
|
|
|
|
}
|
|
|
|
|
|
|
|
} /* namespace NLQT */
|
|
|
|
|
|
|
|
/* end of file */
|