// NeL - MMORPG Framework
// 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 .
#include "std3d.h"
#include "nel/misc/path.h"
#include "nel/misc/file.h"
#include "nel/3d/nelu.h"
#include "nel/3d/dru.h"
#include "nel/3d/camera.h"
#include "nel/3d/register_3d.h"
#include "nel/3d/init_3d.h"
#include "nel/3d/vertex_stream_manager.h"
#include "nel/misc/debug.h"
using namespace std;
using namespace NLMISC;
namespace NL3D
{
const float CNELU::DefLx=0.26f;
const float CNELU::DefLy=0.2f;
const float CNELU::DefLzNear=0.15f;
const float CNELU::DefLzFar=1000.0f;
IDriver *CNELU::Driver=NULL;
CScene *CNELU::Scene=NULL;
CShapeBank *CNELU::ShapeBank=NULL;
CVertexStreamManager*CNELU::MeshSkinManager=NULL;
CRefPtr CNELU::Camera;
CEventServer CNELU::EventServer;
CEventListenerAsync CNELU::AsyncListener;
bool CNELU::initDriver (uint w, uint h, uint bpp, bool windowed, nlWindow systemWindow, bool offscreen, bool direct3d) throw(EDru)
{
// Init debug system
// NLMISC::InitDebug();
ShapeBank = new CShapeBank;
CNELU::Driver = NULL;
// Init driver.
#ifdef NL_OS_WINDOWS
if (direct3d)
{
CNELU::Driver= CDRU::createD3DDriver();
}
#endif
if (!CNELU::Driver)
{
CNELU::Driver= CDRU::createGlDriver();
}
if (!CNELU::Driver)
{
nlwarning ("CNELU::initDriver: no driver found");
return false;
}
if (!CNELU::Driver->init())
{
nlwarning ("CNELU::initDriver: init() failed");
return false;
}
if (!CNELU::Driver->setDisplay(systemWindow, GfxMode(uint16(w), uint16(h), uint8(bpp), windowed, offscreen)))
{
nlwarning ("CNELU::initDriver: setDisplay() failed");
return false;
}
if (!CNELU::Driver->activate())
{
nlwarning ("CNELU::initDriver: activate() failed");
return false;
}
// Create a skin manager
MeshSkinManager = new CVertexStreamManager;
return true;
}
void CNELU::initScene(CViewport viewport)
{
// Register basic csene.
CScene::registerBasics();
if (CNELU::Scene == NULL)
CNELU::Scene = new CScene(false);
// init default Roots.
CNELU::Scene->initDefaultRoots();
// Set driver.
CNELU::Scene->setDriver(CNELU::Driver);
// Set viewport
CNELU::Scene->setViewport (viewport);
// init QuadGridClipManager
CNELU::Scene->initQuadGridClipManager ();
// Create/link a camera.
CNELU::Camera= (CCamera*)CNELU::Scene->createModel(NL3D::CameraId);
CNELU::Scene->setCam(CNELU::Camera);
CNELU::Camera->setFrustum(DefLx, DefLy, DefLzNear, DefLzFar);
// Link to the shape bank
CNELU::Scene->setShapeBank(CNELU::ShapeBank);
// set the MeshSkin Vertex Streams
CNELU::Scene->getRenderTrav().setMeshSkinManager(MeshSkinManager);
}
void CNELU::initEventServer()
{
CNELU::AsyncListener.reset ();
CNELU::EventServer.addEmitter(CNELU::Driver->getEventEmitter());
CNELU::AsyncListener.addToServer(CNELU::EventServer);
}
void CNELU::releaseEventServer()
{
CNELU::AsyncListener.removeFromServer(CNELU::EventServer);
if (CNELU::Driver != NULL)
{
CNELU::EventServer.removeEmitter(CNELU::Driver->getEventEmitter());
}
}
void CNELU::releaseScene()
{
// Release the camera.
CNELU::Camera= NULL;
// "Release" the Scene.
CNELU::Scene->setDriver(NULL);
CNELU::Scene->release();
}
void CNELU::releaseDriver()
{
if (MeshSkinManager)
delete MeshSkinManager;
// "Release" the driver.
if (CNELU::Driver != NULL)
{
CNELU::Driver->release();
delete CNELU::Driver;
CNELU::Driver = NULL;
}
if( CNELU::ShapeBank != NULL )
{
delete CNELU::ShapeBank;
CNELU::ShapeBank = NULL;
}
}
bool CNELU::init (uint w, uint h, CViewport viewport, uint bpp, bool windowed, nlWindow systemWindow, bool offscreen, bool direct3d) throw(EDru)
{
NL3D::registerSerial3d();
if (initDriver(w,h,bpp,windowed,systemWindow,offscreen,direct3d))
{
initScene(viewport);
initEventServer();
return true;
}
else
return false;
}
void CNELU::release()
{
releaseEventServer();
releaseScene();
releaseDriver();
}
void CNELU::screenshot()
{
if (AsyncListener.isKeyPushed(KeyF12))
{
CBitmap btm;
CNELU::Driver->getBuffer(btm);
string filename = CFile::findNewFile ("screenshot.tga");
COFile fs(filename);
btm.writeTGA (fs,24);
nlinfo("Screenshot '%s' saved", filename.c_str());
}
}
void CNELU::clearBuffers(CRGBA col)
{
CNELU::Driver->clear2D(col);
CNELU::Driver->clearZBuffer();
}
void CNELU::swapBuffers()
{
CNELU::Driver->swapBuffers();
}
} // NL3D