nelu.cpp

Go to the documentation of this file.
00001 
00005 /* Copyright, 2000 Nevrax Ltd.
00006  *
00007  * This file is part of NEVRAX NEL.
00008  * NEVRAX NEL is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2, or (at your option)
00011  * any later version.
00012 
00013  * NEVRAX NEL is distributed in the hope that it will be useful, but
00014  * WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00016  * General Public License for more details.
00017 
00018  * You should have received a copy of the GNU General Public License
00019  * along with NEVRAX NEL; see the file COPYING. If not, write to the
00020  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
00021  * MA 02111-1307, USA.
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     // Init debug system
00060 //  NLMISC::InitDebug();
00061 
00062     ShapeBank = new CShapeBank;
00063 
00064     // Init driver.
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     //CNELU::Driver= CDRU::createD3DDriver();
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     // Create a skin manager
00097     MeshSkinManager = new CVertexStreamManager;
00098 
00099     return true;
00100 }
00101 
00102 
00103 void            CNELU::initScene(CViewport viewport)
00104 {
00105     // Register basic csene.
00106     CScene::registerBasics();
00107 
00108     if (CNELU::Scene == NULL)
00109         CNELU::Scene = new CScene(false);
00110 
00111     // init default Roots.
00112     CNELU::Scene->initDefaultRoots();
00113 
00114     // Set driver.
00115     CNELU::Scene->setDriver(CNELU::Driver);
00116 
00117     // Set viewport
00118     CNELU::Scene->setViewport (viewport);
00119 
00120     // init QuadGridClipManager
00121     CNELU::Scene->initQuadGridClipManager ();
00122 
00123     // Create/link a camera.
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     // Link to the shape bank
00129     CNELU::Scene->setShapeBank(CNELU::ShapeBank);
00130 
00131     // set the MeshSkin Vertex Streams
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     // Release the camera.
00157     CNELU::Camera= NULL;
00158 
00159     // "Release" the Scene.
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     // "Release" the driver.
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 } // NL3D

Generated on Thu Jan 7 08:26:27 2010 for NeL by  doxygen 1.6.1