render_trav.h
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 #ifndef NL_RENDER_TRAV_H
00025 #define NL_RENDER_TRAV_H
00026
00027 #include "nel/3d/trav_scene.h"
00028 #include "nel/3d/ordering_table.h"
00029 #include "nel/3d/layered_ordering_table.h"
00030 #include "nel/misc/rgba.h"
00031 #include "nel/3d/viewport.h"
00032 #include "nel/3d/light_contribution.h"
00033 #include "nel/3d/light.h"
00034 #include "nel/3d/mesh_block_manager.h"
00035 #include "nel/3d/shadow_map_manager.h"
00036 #include "nel/3d/u_scene.h"
00037 #include <vector>
00038
00039
00040 namespace NL3D
00041 {
00042
00043 using NLMISC::CVector;
00044 using NLMISC::CPlane;
00045 using NLMISC::CMatrix;
00046
00047 class IDriver;
00048 class CMaterial;
00049
00050 class CTransform;
00051 class CLandscapeModel;
00052
00053 class CVertexStreamManager;
00054 class CWaterModel;
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 #define NL3D_MESH_SKIN_MANAGER_VERTEXFORMAT (CVertexBuffer::PositionFlag | CVertexBuffer::NormalFlag | CVertexBuffer::TexCoord0Flag)
00065 #define NL3D_MESH_SKIN_MANAGER_MAXVERTICES 5000
00066 #define NL3D_MESH_SKIN_MANAGER_NUMVB 8
00067
00068
00069
00070
00071
00072
00073
00074 #define NL3D_SHADOW_MESH_SKIN_MANAGER_VERTEXFORMAT (CVertexBuffer::PositionFlag)
00075 #define NL3D_SHADOW_MESH_SKIN_MANAGER_MAXVERTICES 3000
00076 #define NL3D_SHADOW_MESH_SKIN_MANAGER_NUMVB 8
00077
00078
00079
00080
00099 class CRenderTrav : public CTravCameraScene
00100 {
00101 public:
00102
00104 CRenderTrav();
00105
00107
00108
00113 void traverse(UScene::TRenderPart renderPart, bool newRender);
00115
00117
00118
00119 void clearRenderList();
00122 void addRenderModel(CTransform *m)
00123 {
00124
00125 m->_IndexLSBInRenderList= uint8(_CurrentNumVisibleModels&255);
00126
00127 RenderList[_CurrentNumVisibleModels]= m;
00128 _CurrentNumVisibleModels++;
00129 }
00130
00131 void reserveRenderList(uint numModels);
00132
00133
00134
00135
00136 void removeRenderModel(CTransform *m);
00137
00139 void clearWaterModelList();
00140
00142
00143
00144
00145 void setDriver(IDriver *drv) {Driver= drv;}
00146 IDriver *getDriver() {return Driver;}
00147
00148 IDriver *getAuxDriver() {return Driver;}
00149 void setViewport (const CViewport& viewport)
00150 {
00151 _Viewport = viewport;
00152 }
00153 CViewport getViewport () const
00154 {
00155 return _Viewport;
00156 }
00157
00158 bool isCurrentPassOpaque() { return _CurrentPassOpaque; }
00159
00166 void setLayersRenderingOrder(bool directOrder = true) { _LayersRenderingOrder = directOrder; }
00167 bool getLayersRenderingOrder() const { return _LayersRenderingOrder; }
00168
00177 void setupTransparencySorting(uint8 maxPriority = 0, uint NbDistanceEntries = 1024);
00178
00179
00180
00182
00183
00184
00185 bool LightingSystemEnabled;
00186
00187
00188 NLMISC::CRGBA AmbientGlobal;
00189
00190 NLMISC::CRGBA SunAmbient, SunDiffuse, SunSpecular;
00191
00192 void setSunDirection(const CVector &dir);
00193 const CVector getSunDirection() const {return _SunDirection;}
00194
00195
00196
00197
00202 void setMeshSkinManager(CVertexStreamManager *msm);
00203
00205 CVertexStreamManager *getMeshSkinManager() const {return _MeshSkinManager;}
00206
00208 CShadowMapManager &getShadowMapManager() {return _ShadowMapManager;}
00209 const CShadowMapManager &getShadowMapManager() const {return _ShadowMapManager;}
00210
00212 void setShadowMeshSkinManager(CVertexStreamManager *msm);
00213 CVertexStreamManager *getShadowMeshSkinManager() const {return _ShadowMeshSkinManager;}
00214
00215
00216
00217 void addRenderLandscape(CLandscapeModel *model);
00218
00219
00221
00222
00223
00224 void debugWaterModelMemory(const char *tag, bool dumpList= false);
00226
00227
00228 public:
00229
00231
00232
00233
00234 enum {MaxVPLight= 4};
00235
00240 void resetLightSetup();
00241
00252 void changeLightSetup(CLightContribution *lightContribution, bool useLocalAttenuation);
00253
00254
00263 void beginVPLightSetup(uint ctStart, bool supportSpecular, const CMatrix &invObjectWM);
00264
00268 void changeVPLightSetupMaterial(const CMaterial &mat, bool excludeStrongest);
00269
00270
00309 static std::string getLightVPFragment(uint numActivePointLights, uint ctStart, bool supportSpecular, bool normalize);
00310
00314 const CLight &getDriverLight(sint index) const
00315 {
00316 nlassert(index >= 0 && index < NL3D_MAX_LIGHT_CONTRIBUTION+1);
00317 return _DriverLight[index];
00318 }
00319
00321 sint getStrongestLightIndex() const;
00322
00327 void getStrongestLightColors(NLMISC::CRGBA &diffuse, NLMISC::CRGBA &specular);
00328
00332 uint getNumVPLights() const {return _VPNumLights;}
00333
00334
00335
00336
00338
00339
00341 CMeshBlockManager MeshBlockManager;
00342
00343
00344
00345
00346 void setupDriverCamera();
00347
00348 private:
00349
00350
00351 std::vector<CTransform*> RenderList;
00352 uint32 _CurrentNumVisibleModels;
00353
00354
00355 COrderingTable<CTransform> OrderOpaqueList;
00356 std::vector<CLayeredOrderingTable<CTransform> > _OrderTransparentListByPriority;
00357 uint8 _MaxTransparencyPriority;
00358
00359 IDriver *Driver;
00360 CViewport _Viewport;
00361
00362
00363 bool _CurrentPassOpaque;
00364 bool _LayersRenderingOrder;
00365
00366
00368
00369
00370 CLightContribution *_CacheLightContribution;
00371 bool _LastLocalAttenuation;
00372
00373 uint _NumLightEnabled;
00374
00375
00376 uint _LastSunFactor;
00377 NLMISC::CRGBA _LastFinalAmbient;
00378 CPointLight *_LastPointLight[NL3D_MAX_LIGHT_CONTRIBUTION];
00379 uint8 _LastPointLightFactor[NL3D_MAX_LIGHT_CONTRIBUTION];
00380 bool _LastPointLightLocalAttenuation[NL3D_MAX_LIGHT_CONTRIBUTION];
00381
00382 CVector _SunDirection;
00383
00384
00385 CLight _DriverLight[NL3D_MAX_LIGHT_CONTRIBUTION+1];
00386
00387
00388 mutable uint _StrongestLightIndex;
00389 mutable bool _StrongestLightTouched;
00390
00391
00392 uint _VPCurrentCtStart;
00393
00394 uint _VPNumLights;
00395
00396 bool _VPSupportSpecular;
00397
00398 NLMISC::CRGBAF _VPFinalAmbient;
00399
00400 NLMISC::CRGBAF _VPLightDiffuse[MaxVPLight];
00401 NLMISC::CRGBAF _VPLightSpecular[MaxVPLight];
00402
00403 NLMISC::CRGBA _StrongestLightDiffuse;
00404 NLMISC::CRGBA _StrongestLightSpecular;
00405
00406
00407 bool _VPMaterialCacheDirty;
00408 uint32 _VPMaterialCacheEmissive;
00409 uint32 _VPMaterialCacheAmbient;
00410 uint32 _VPMaterialCacheDiffuse;
00411 uint32 _VPMaterialCacheSpecular;
00412 float _VPMaterialCacheShininess;
00413
00414
00415
00416
00418 CVertexStreamManager *_MeshSkinManager;
00419
00420
00422 CShadowMapManager _ShadowMapManager;
00424 CVertexStreamManager *_ShadowMeshSkinManager;
00425
00426
00432
00433 void clearRenderLandscapeList();
00434
00435 void renderLandscapes();
00436
00437
00438 std::vector<CLandscapeModel*> _LandscapeRenderList;
00439
00440
00441
00443
00444 struct CWaterModelDump
00445 {
00446 void *Address;
00447 void *ClippedPolyBegin;
00448 void *ClippedPolyEnd;
00449 };
00450 std::vector<CWaterModelDump> _DebugWaterModelList;
00452
00453 public:
00454 CWaterModel *_FirstWaterModel;
00455 };
00456
00457
00458 }
00459
00460
00461 #endif // NL_RENDER_TRAV_H
00462
00463