nelu.cpp
Go to the documentation of this file.00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "std3d.h"
00025
00026 #include "nel/misc/path.h"
00027 #include "nel/misc/file.h"
00028
00029 #include "nel/3d/nelu.h"
00030 #include "nel/3d/dru.h"
00031 #include "nel/3d/camera.h"
00032 #include "nel/3d/register_3d.h"
00033 #include "nel/3d/init_3d.h"
00034 #include "nel/3d/vertex_stream_manager.h"
00035 #include "nel/misc/debug.h"
00036 using namespace std;
00037 using namespace NLMISC;
00038
00039
00040 namespace NL3D
00041 {
00042
00043 const float CNELU::DefLx=0.26f;
00044 const float CNELU::DefLy=0.2f;
00045 const float CNELU::DefLzNear=0.15f;
00046 const float CNELU::DefLzFar=1000.0f;
00047
00048 IDriver *CNELU::Driver=NULL;
00049 CScene *CNELU::Scene=NULL;
00050 CShapeBank *CNELU::ShapeBank=NULL;
00051 CVertexStreamManager*CNELU::MeshSkinManager=NULL;
00052 CRefPtr<CCamera> CNELU::Camera;
00053 CEventServer CNELU::EventServer;
00054 CEventListenerAsync CNELU::AsyncListener;
00055
00056
00057 bool CNELU::initDriver (uint w, uint h, uint bpp, bool windowed, void *systemWindow, bool offscreen, bool direct3d) throw(EDru)
00058 {
00059
00060
00061
00062 ShapeBank = new CShapeBank;
00063
00064
00065 #ifdef NL_OS_WINDOWS
00066 if (direct3d)
00067 {
00068 CNELU::Driver= CDRU::createD3DDriver();
00069 }
00070 else
00071 {
00072 CNELU::Driver= CDRU::createGlDriver();
00073 }
00074 #else // NL_OS_WINDOWS
00075
00076 CNELU::Driver= CDRU::createGlDriver();
00077
00078
00079 #endif // NL_OS_WINDOWS
00080 if (!CNELU::Driver->init())
00081 {
00082 nlwarning ("CNELU::initDriver: init() failed");
00083 return false;
00084 }
00085 if (!CNELU::Driver->setDisplay(systemWindow, GfxMode(uint16(w), uint16(h), uint8(bpp), windowed, offscreen)))
00086 {
00087 nlwarning ("CNELU::initDriver: setDisplay() failed");
00088 return false;
00089 }
00090 if (!CNELU::Driver->activate())
00091 {
00092 nlwarning ("CNELU::initDriver: activate() failed");
00093 return false;
00094 }
00095
00096
00097 MeshSkinManager = new CVertexStreamManager;
00098
00099 return true;
00100 }
00101
00102
00103 void CNELU::initScene(CViewport viewport)
00104 {
00105
00106 CScene::registerBasics();
00107
00108 if (CNELU::Scene == NULL)
00109 CNELU::Scene = new CScene(false);
00110
00111
00112 CNELU::Scene->initDefaultRoots();
00113
00114
00115 CNELU::Scene->setDriver(CNELU::Driver);
00116
00117
00118 CNELU::Scene->setViewport (viewport);
00119
00120
00121 CNELU::Scene->initQuadGridClipManager ();
00122
00123
00124 CNELU::Camera= (CCamera*)CNELU::Scene->createModel(NL3D::CameraId);
00125 CNELU::Scene->setCam(CNELU::Camera);
00126 CNELU::Camera->setFrustum(DefLx, DefLy, DefLzNear, DefLzFar);
00127
00128
00129 CNELU::Scene->setShapeBank(CNELU::ShapeBank);
00130
00131
00132 CNELU::Scene->getRenderTrav().setMeshSkinManager(MeshSkinManager);
00133 }
00134
00135
00136 void CNELU::initEventServer()
00137 {
00138 CNELU::AsyncListener.reset ();
00139 CNELU::EventServer.addEmitter(CNELU::Driver->getEventEmitter());
00140 CNELU::AsyncListener.addToServer(CNELU::EventServer);
00141 }
00142
00143
00144 void CNELU::releaseEventServer()
00145 {
00146 CNELU::AsyncListener.removeFromServer(CNELU::EventServer);
00147 if (CNELU::Driver != NULL)
00148 {
00149 CNELU::EventServer.removeEmitter(CNELU::Driver->getEventEmitter());
00150 }
00151 }
00152
00153
00154 void CNELU::releaseScene()
00155 {
00156
00157 CNELU::Camera= NULL;
00158
00159
00160 CNELU::Scene->setDriver(NULL);
00161 CNELU::Scene->release();
00162 }
00163
00164
00165 void CNELU::releaseDriver()
00166 {
00167 if (MeshSkinManager)
00168 delete MeshSkinManager;
00169
00170
00171 if (CNELU::Driver != NULL)
00172 {
00173 CNELU::Driver->release();
00174 delete CNELU::Driver;
00175 CNELU::Driver = NULL;
00176 }
00177 if( CNELU::ShapeBank != NULL )
00178 {
00179 delete CNELU::ShapeBank;
00180 CNELU::ShapeBank = NULL;
00181 }
00182 }
00183
00184 bool CNELU::init (uint w, uint h, CViewport viewport, uint bpp, bool windowed, void *systemWindow, bool offscreen, bool direct3d) throw(EDru)
00185 {
00186 NL3D::registerSerial3d();
00187 if (initDriver(w,h,bpp,windowed,systemWindow,offscreen,direct3d))
00188 {
00189 initScene(viewport);
00190 initEventServer();
00191 return true;
00192 }
00193 else
00194 return false;
00195 }
00196
00197 void CNELU::release()
00198 {
00199 releaseEventServer();
00200 releaseScene();
00201 releaseDriver();
00202 }
00203
00204 void CNELU::screenshot()
00205 {
00206 if (AsyncListener.isKeyPushed(KeyF12))
00207 {
00208 CBitmap btm;
00209 CNELU::Driver->getBuffer(btm);
00210 string filename = CFile::findNewFile ("screenshot.tga");
00211 COFile fs(filename);
00212 btm.writeTGA (fs,24);
00213 nlinfo("Screenshot '%s' saved", filename.c_str());
00214 }
00215 }
00216
00217
00218 void CNELU::clearBuffers(CRGBA col)
00219 {
00220 CNELU::Driver->clear2D(col);
00221 CNELU::Driver->clearZBuffer();
00222 }
00223
00224 void CNELU::swapBuffers()
00225 {
00226 CNELU::Driver->swapBuffers();
00227 }
00228
00229
00230
00231 }