NL3D::CRenderTrav Class Reference

#include <render_trav.h>

Inheritance diagram for NL3D::CRenderTrav:

NL3D::CTravCameraScene NL3D::CTraversal

Detailed Description

The Render traversal. The purpose of this traversal is to render a list of models. This traversals is tightly linked to the cliptraversal. The clipTraversals insert directly the models with CRenderTrav::addRenderModel(m). The traverse() method should render all the render models with IDriver.

This traversal has no graph of models

USER RULES: Before using traverse() on a render traversal, you should:

NB: see CScene for 3d conventions (orthonormal basis...)

Author:
Lionel Berenguier

Nevrax France

Date:
2000

Definition at line 100 of file render_trav.h.

Render Lighting Setup. FOR MODEL TRAVERSING ONLY.

enum  { MaxVPLight = 4 }
void beginVPLightSetup (uint ctStart, bool supportSpecular, const CMatrix &invObjectWM)
void changeLightSetup (CLightContribution *lightContribution, bool useLocalAttenuation)
void changeVPLightSetupMaterial (const CMaterial &mat, bool excludeStrongest)
const CLightgetDriverLight (sint index) const
uint getNumVPLights () const
void getStrongestLightColors (NLMISC::CRGBA &diffuse, NLMISC::CRGBA &specular)
sint getStrongestLightIndex () const
 return an index to the current strongest settuped light (or -1 if there's none)

void resetLightSetup ()
std::string getLightVPFragment (uint numActivePointLights, uint ctStart, bool supportSpecular, bool normalize)

Render Lighting Setup.

const CVector getSunDirection () const
void setSunDirection (const CVector &dir)
NLMISC::CRGBA AmbientGlobal
bool LightingSystemEnabled
NLMISC::CRGBA SunAmbient
NLMISC::CRGBA SunDiffuse
NLMISC::CRGBA SunSpecular

Special Landscape RenderList.

The Landscape list is separated from std render List for optimisation purpose. See Doc in traverse() method.

void clearRenderLandscapeList ()
void renderLandscapes ()
std::vector< CLandscapeModel * > _LandscapeRenderList

Public Types


Public Member Functions

void addRenderLandscape (CLandscapeModel *model)
 CRenderTrav ()
 Constructor.

IDrivergetAuxDriver ()
IDrivergetDriver ()
bool getLayersRenderingOrder () const
CVertexStreamManagergetMeshSkinManager () const
 get the MeshSkinManager

const CShadowMapManagergetShadowMapManager () const
CShadowMapManagergetShadowMapManager ()
 get the CShadowMapManager

CVertexStreamManagergetShadowMeshSkinManager () const
CViewport getViewport () const
bool isCurrentPassOpaque ()
void setCamMatrix (const NLMISC::CMatrix &camMatrix)
 Setup the camera matrix (a translation/rotation matrix).

void setDriver (IDriver *drv)
void setFrustum (float width, float height, float znear, float zfar, bool perspective=true)
 Setup the camera mode as a perspective/ortho camera. NB: znear and zfar must be >0 (if perspective).

void setFrustum (float left, float right, float bottom, float top, float znear, float zfar, bool perspective=true)
 Setup the camera mode as a perspective/ortho camera. NB: znear and zfar must be >0 (if perspective).

void setLayersRenderingOrder (bool directOrder=true)
void setMeshSkinManager (CVertexStreamManager *msm)
void setShadowMeshSkinManager (CVertexStreamManager *msm)
 the MeshSkinManager for Shadow. Same Behaviour than std MeshSkinManager. NB: the Shadow MSM is inited with AuxDriver.

void setupDriverCamera ()
void setViewport (const CViewport &viewport)
RenderList.
void addRenderModel (CTransform *m)
void clearRenderList ()
 Clear the list of rendered models.

void reserveRenderList (uint numModels)
ITravScene Implementation.
void traverse ()

Data Fields

CSceneScene
FOR MODEL TRAVERSING ONLY. (Read only)
Those variables are valid only in traverse().

float Bottom
NLMISC::CVector CamLook
NLMISC::CMatrix CamMatrix
NLMISC::CVector CamPos
float Far
float Left
float Near
bool Perspective
float Right
float Top
NLMISC::CMatrix ViewMatrix
FOR MODEL TRAVERSING ONLY. (Read only)
Those variables are valid only in traverse().

float Bottom
NLMISC::CVector CamLook
NLMISC::CMatrix CamMatrix
NLMISC::CVector CamPos
float Far
float Left
float Near
bool Perspective
float Right
float Top
NLMISC::CMatrix ViewMatrix
FOR MODEL TRAVERSING ONLY. (Read only)
Those variables are valid only in traverse().

float Bottom
NLMISC::CVector CamLook
NLMISC::CMatrix CamMatrix
NLMISC::CVector CamPos
float Far
float Left
float Near
bool Perspective
float Right
float Top
NLMISC::CMatrix ViewMatrix
MeshBlock Manager. FOR MODEL TRAVERSING AND MESHS ONLY.
CMeshBlockManager MeshBlockManager
 The manager of meshBlock. Used to add instances.

FOR MODEL TRAVERSING ONLY. (Read only)
Those variables are valid only in traverse().

float Bottom
NLMISC::CVector CamLook
NLMISC::CMatrix CamMatrix
NLMISC::CVector CamPos
float Far
float Left
float Near
bool Perspective
float Right
float Top
NLMISC::CMatrix ViewMatrix

Protected Member Functions

void update ()
 update the dependent information.


Private Attributes

uint32 _CurrentNumVisibleModels
bool _CurrentPassOpaque
bool _LayersRenderingOrder
CVertexStreamManager_MeshSkinManager
 The manager of skin. NULL by default.

CShadowMapManager _ShadowMapManager
 The ShadowMap Manager.

CVertexStreamManager_ShadowMeshSkinManager
 The SkinManager, but For Shadow rendering.

CViewport _Viewport
IDriverDriver
COrderingTable< CTransformOrderOpaqueList
CLayeredOrderingTable< CTransformOrderTransparentList
std::vector< CTransform * > RenderList
Render Lighting Setup.
CLightContribution_CacheLightContribution
CLight _DriverLight [NL3D_MAX_LIGHT_CONTRIBUTION+1]
NLMISC::CRGBA _LastFinalAmbient
bool _LastLocalAttenuation
CPointLight_LastPointLight [NL3D_MAX_LIGHT_CONTRIBUTION]
uint8 _LastPointLightFactor [NL3D_MAX_LIGHT_CONTRIBUTION]
bool _LastPointLightLocalAttenuation [NL3D_MAX_LIGHT_CONTRIBUTION]
uint _LastSunFactor
uint _NumLightEnabled
NLMISC::CRGBA _StrongestLightDiffuse
uint _StrongestLightIndex
NLMISC::CRGBA _StrongestLightSpecular
bool _StrongestLightTouched
CVector _SunDirection
uint _VPCurrentCtStart
NLMISC::CRGBAF _VPFinalAmbient
NLMISC::CRGBAF _VPLightDiffuse [MaxVPLight]
NLMISC::CRGBAF _VPLightSpecular [MaxVPLight]
uint32 _VPMaterialCacheAmbient
uint32 _VPMaterialCacheDiffuse
bool _VPMaterialCacheDirty
uint32 _VPMaterialCacheEmissive
float _VPMaterialCacheShininess
uint32 _VPMaterialCacheSpecular
uint _VPNumLights
bool _VPSupportSpecular


Member Enumeration Documentation

anonymous enum
 

Enumeration values:
MaxVPLight 

Definition at line 203 of file render_trav.h.

00203 {MaxVPLight= 4};


Constructor & Destructor Documentation

NL3D::CRenderTrav::CRenderTrav  ) 
 

Constructor.

Definition at line 61 of file render_trav.cpp.

References _CacheLightContribution, _CurrentPassOpaque, _LayersRenderingOrder, _StrongestLightTouched, _SunDirection, AmbientGlobal, NL3D::CLayeredOrderingTable< CTransform >::init(), NL3D::COrderingTable< CTransform >::init(), NLMISC::CVector::normalize(), OrderOpaqueList, OrderTransparentList, RenderList, NLMISC::CVector::set(), SunAmbient, SunDiffuse, and SunSpecular.

00062 {
00063         RenderList.resize(1024);
00064         _CurrentNumVisibleModels= 0;
00065 
00066         OrderOpaqueList.init(1024);
00067         OrderTransparentList.init(1024);
00068         Driver = NULL;
00069         _CurrentPassOpaque = true;
00070 
00071         _CacheLightContribution= NULL;
00072 
00073         // Default light Setup.
00074         LightingSystemEnabled= false;
00075         AmbientGlobal= CRGBA(50, 50, 50);
00076         SunAmbient= CRGBA::Black;
00077         SunDiffuse= SunSpecular= CRGBA::White;
00078         _SunDirection.set(0, 0.5, -0.5);
00079         _SunDirection.normalize();
00080 
00081         _StrongestLightTouched = true;
00082 
00083         _MeshSkinManager= NULL;
00084         _ShadowMeshSkinManager= NULL;
00085 
00086         _LayersRenderingOrder= true;
00087 }


Member Function Documentation

void NL3D::CRenderTrav::addRenderLandscape CLandscapeModel model  ) 
 

Definition at line 1037 of file render_trav.cpp.

References _LandscapeRenderList.

Referenced by NL3D::CLandscapeModel::traverseRender().

01038 {
01039         _LandscapeRenderList.push_back(model);
01040 }

void NL3D::CRenderTrav::addRenderModel CTransform m  )  [inline]
 

Add a model to the list of rendered models. DOESN'T CHECK if already inserted.

Definition at line 121 of file render_trav.h.

References RenderList.

Referenced by NL3D::CParticleSystemModel::traverseAnimDetail(), and NL3D::CTransform::traverseClip().

00122         {
00123                 RenderList[_CurrentNumVisibleModels]= m;
00124                 _CurrentNumVisibleModels++;
00125         }

void NL3D::CRenderTrav::beginVPLightSetup uint  ctStart,
bool  supportSpecular,
const CMatrix invObjectWM
 

setup the driver VP constants to get info from current LightSetup. Only 0..3 Light + SunLights are supported. The VP do NOT support distance/Spot attenuation Also it does not handle World Matrix with non uniform scale correctly since lighting is made in ObjectSpace

Parameters:
ctStart the program use ctes from ctStart to ctStart+NumCtes.
supportSpecular asitsounds. PointLights and dirLight are localViewer
invObjectWM the inverse of object matrix: lights are mul by this. Vp compute in object space.

Definition at line 557 of file render_trav.cpp.

References _DriverLight, _NumLightEnabled, _VPCurrentCtStart, _VPFinalAmbient, _VPLightDiffuse, _VPLightSpecular, _VPMaterialCacheDirty, _VPNumLights, _VPSupportSpecular, AmbientGlobal, NL3D::CLight::getAmbiant(), NL3D::CLight::getDiffuse(), NL3D::CLight::getPosition(), NL3D::CLight::getSpecular(), MaxVPLight, min, NLMISC::CMatrix::mulVector(), nlassert, NLMISC::CVector::normalize(), NL3D::IDriver::setConstant(), and uint.

Referenced by NL3D::CMeshVPPerPixelLight::begin(), and NL3D::CMeshVPWindTree::setupLighting().

00558 {       
00559         uint    i;               
00560         nlassert(MaxVPLight==4);
00561         _VPNumLights= min(_NumLightEnabled, (uint)MaxVPLight);
00562         _VPCurrentCtStart= ctStart;
00563         _VPSupportSpecular= supportSpecular;
00564         
00565         // Prepare Colors (to be multiplied by material)
00566         //================
00567         // Ambient. _VPCurrentCtStart+0
00568         _VPFinalAmbient= AmbientGlobal;
00569         for(i=0; i<_VPNumLights; i++)
00570         {
00571                 _VPFinalAmbient+= _DriverLight[i].getAmbiant();         
00572         }
00573         // Diffuse. _VPCurrentCtStart+1 to 4
00574         for(i=0; i<_VPNumLights; i++)
00575         {
00576                 _VPLightDiffuse[i]= _DriverLight[i].getDiffuse();
00577         }
00578         // reset other to 0.
00579         for(; i<MaxVPLight; i++)
00580         {
00581                 _VPLightDiffuse[i]= CRGBA::Black;
00582                 Driver->setConstant(_VPCurrentCtStart+1+i, 0.f, 0.f, 0.f, 0.f);
00583         }
00584         // Specular. _VPCurrentCtStart+5 to 8 (only if supportSpecular)
00585         if(supportSpecular)
00586         {
00587                 for(i=0; i<_VPNumLights; i++)
00588                 {
00589                         _VPLightSpecular[i]= _DriverLight[i].getSpecular();
00590                 }
00591                 // reset other to 0.
00592                 for(; i<MaxVPLight; i++)
00593                 {
00594                         _VPLightSpecular[i]= CRGBA::Black;
00595                         Driver->setConstant(_VPCurrentCtStart+5+i, 0.f, 0.f, 0.f, 0.f);
00596                 }
00597         }
00598 
00599 
00600         // Compute Eye position in Object space.
00601         CVector         eye= invObjectWM * CamPos;
00602 
00603 
00604         // Setup Sun Directionnal light.
00605         //================
00606         CVector         lightDir;
00607         // in objectSpace.
00608         lightDir= invObjectWM.mulVector(_DriverLight[0].getDirection());
00609         lightDir.normalize();
00610         lightDir= -lightDir; 
00611         if(supportSpecular)
00612         {
00613                 // Setup lightDir.
00614                 Driver->setConstant(_VPCurrentCtStart+9, lightDir);
00615         }
00616         else
00617         {
00618                 // Setup lightDir. NB: no specular color!
00619                 Driver->setConstant(_VPCurrentCtStart+5, lightDir);
00620         }
00621 
00622 
00623         // Setup PointLights
00624         //================
00625         uint            startPLPos;
00626         if(supportSpecular)
00627         {
00628                 // Setup eye in objectSpace for localViewer
00629                 Driver->setConstant(_VPCurrentCtStart+11, eye);
00630                 // Start at 12.
00631                 startPLPos= 12;
00632         }
00633         else
00634         {
00635                 // Start at 6.
00636                 startPLPos= 6;
00637         }
00638         // For all pointLight enabled (other are black: don't matter)
00639         for(i=1; i<_VPNumLights; i++)
00640         {
00641                 // Setup position of light.
00642                 CVector         lightPos;
00643                 lightPos= invObjectWM * _DriverLight[i].getPosition();
00644                 Driver->setConstant(_VPCurrentCtStart+startPLPos+(i-1), lightPos);
00645         }
00646 
00647 
00648         // Must force real light setup at least the first time, in changeVPLightSetupMaterial()
00649         _VPMaterialCacheDirty= true;
00650 }

void NL3D::CRenderTrav::changeLightSetup CLightContribution lightContribution,
bool  useLocalAttenuation
 

setup the driver to the given lightContribution. if lightContribution==NULL, then all currently enabled lights are disabled. NB: lightContribution is cached, so if same than preceding, no-op. cache cleared at each frame with resetLightSetup(). NB: models which are sticked or skinned on a skeleton have same lightContribution because lightSetup is made on the skeleton only. Hence the interest of this cache.

Parameters:
useLocalAttenuation if true, use Hardware Attenuation, else use global one (attenuation with AttFactor)

Definition at line 409 of file render_trav.cpp.

References _CacheLightContribution, _DriverLight, _LastFinalAmbient, _LastLocalAttenuation, _LastPointLight, _LastPointLightFactor, _LastPointLightLocalAttenuation, _LastSunFactor, _NumLightEnabled, _StrongestLightTouched, _SunDirection, NLMISC::CRGBA::A, NLMISC::CRGBA::addRGBOnly(), NL3D::CLightContribution::AttFactor, NL3D::CLightContribution::computeCurrentAmbient(), NL3D::IDriver::enableLight(), NL3D::CLightContribution::Factor, NL3D::CLightContribution::MergedPointLight, NLMISC::CRGBA::modulateFromuiRGBOnly(), NL3D_MAX_LIGHT_CONTRIBUTION, NL3D::CLightContribution::PointLight, NL3D::IDriver::setLight(), NL3D::CLight::setupDirectional(), SunAmbient, NL3D::CLightContribution::SunContribution, SunDiffuse, SunSpecular, uint, and NL3D::CLightContribution::UseMergedPointLight.

Referenced by NL3D::CTransformShape::changeLightSetup().

00410 {
00411         // If lighting System disabled, skip
00412         if(!LightingSystemEnabled)
00413                 return;
00414 
00415         uint            i;
00416 
00417         // if same lightContribution, no-op.
00418         if(_CacheLightContribution == lightContribution &&  _LastLocalAttenuation == useLocalAttenuation)
00419                 return;
00420         // else, must setup the lights into driver.
00421         else
00422         {
00423                 _StrongestLightTouched = true;
00424                 // if the setup is !NULL
00425                 if(lightContribution)
00426                 {
00427                         // Compute SunAmbient / LocalAmbient
00428                         //-----------
00429                         // Take the current model ambient
00430                         CRGBA   finalAmbient= lightContribution->computeCurrentAmbient(SunAmbient);
00431                         // If use the mergedPointLight, add it to final Ambient
00432                         if(lightContribution->UseMergedPointLight)
00433                                 finalAmbient.addRGBOnly(finalAmbient, lightContribution->MergedPointLight);
00434                         // Force Alpha to 255 for good cache test.
00435                         finalAmbient.A= 255;
00436 
00437 
00438                         // Setup the directionnal Sunlight.
00439                         //-----------
00440                         // expand 0..255 to 0..256, to avoid loss of precision.
00441                         uint    ufactor= lightContribution->SunContribution;
00442                         //      different SunLight as in cache ??
00443                         //      NB: sunSetup can't change during renderPass, so need only to test factor.
00444                         if(ufactor != _LastSunFactor || finalAmbient != _LastFinalAmbient)
00445                         {
00446                                 // cache (before expanding!!)
00447                                 _LastSunFactor= ufactor;
00448                                 // Cache final ambient light
00449                                 _LastFinalAmbient= finalAmbient;
00450 
00451                                 // expand to 0..256.
00452                                 ufactor+= ufactor>>7;   // add 0 or 1.
00453                                 // modulate color with factor of the lightContribution.
00454                                 CRGBA   sunDiffuse, sunSpecular;
00455                                 sunDiffuse.modulateFromuiRGBOnly(SunDiffuse, ufactor);
00456                                 sunSpecular.modulateFromuiRGBOnly(SunSpecular, ufactor);
00457                                 // setup driver light
00458                                 _DriverLight[0].setupDirectional(finalAmbient, sunDiffuse, sunSpecular, _SunDirection);
00459                                 Driver->setLight(0, _DriverLight[0]);
00460                         }
00461 
00462 
00463                         // Setup other point lights
00464                         //-----------
00465                         uint    plId=0;
00466                         // for the list of light.
00467                         while(lightContribution->PointLight[plId]!=NULL)
00468                         {
00469                                 CPointLight             *pl= lightContribution->PointLight[plId];
00470                                 uint                    inf;
00471                                 if(useLocalAttenuation)
00472                                         inf= lightContribution->Factor[plId];
00473                                 else
00474                                         inf= lightContribution->AttFactor[plId];
00475 
00476                                 // different PointLight setup than in cache??
00477                                 // NB: pointLight setup can't change during renderPass, so need only to test pointer, 
00478                                 // attenuation mode and factor.
00479                                 if( pl!=_LastPointLight[plId] || 
00480                                         inf!=_LastPointLightFactor[plId] ||
00481                                         useLocalAttenuation!=_LastPointLightLocalAttenuation[plId] )
00482                                 {
00483                                         // need to resetup the light. Cache it.
00484                                         _LastPointLight[plId]= pl;
00485                                         _LastPointLightFactor[plId]= inf;
00486                                         _LastPointLightLocalAttenuation[plId]= useLocalAttenuation;
00487 
00488                                         // compute the driver light
00489                                         if(useLocalAttenuation)
00490                                                 pl->setupDriverLight(_DriverLight[plId+1], inf);
00491                                         else
00492                                                 // Compute it with user Attenuation
00493                                                 pl->setupDriverLightUserAttenuation(_DriverLight[plId+1], inf);
00494 
00495                                         // setup driver. decal+1 because of sun.
00496                                         Driver->setLight(plId+1, _DriverLight[plId+1]);
00497                                 }
00498 
00499                                 // next light?
00500                                 plId++;
00501                                 if(plId>=NL3D_MAX_LIGHT_CONTRIBUTION)
00502                                         break;
00503                         }
00504 
00505 
00506                         // Disable olds, enable news, and cache.
00507                         //-----------
00508                         // count new number of light enabled.
00509                         uint    newNumLightEnabled;
00510                         // number of pointLight + the sun 
00511                         newNumLightEnabled= plId + 1;
00512 
00513                         // enable lights which are used now and were not before.
00514                         for(i=_NumLightEnabled; i<newNumLightEnabled; i++)
00515                         {
00516                                 Driver->enableLight(i, true);
00517                         }
00518 
00519                         // disable lights which are no more used.
00520                         for(i=newNumLightEnabled; i<_NumLightEnabled; i++)
00521                         {
00522                                 Driver->enableLight(i, false);
00523                         }
00524 
00525                         // cache the setup.
00526                         _CacheLightContribution = lightContribution;
00527                         _NumLightEnabled= newNumLightEnabled;
00528                         _LastLocalAttenuation= useLocalAttenuation;
00529                 }
00530                 else
00531                 {
00532                         // Disable old lights, and cache.
00533                         //-----------
00534                         // disable lights which are no more used.
00535                         for(i=0; i<_NumLightEnabled; i++)
00536                         {
00537                                 Driver->enableLight(i, false);
00538                         }
00539 
00540                         // cache the setup.
00541                         _CacheLightContribution = NULL;
00542                         _NumLightEnabled= 0;
00543                 }
00544 
00545 
00546         }
00547 }

void NL3D::CRenderTrav::changeVPLightSetupMaterial const CMaterial mat,
bool  excludeStrongest
 

change the driver VP LightSetup constants which depends on material.

Parameters:
excludeStrongest This remove the strongest light from the setup. The typical use is to have it computed by using perpixel lighting.

Definition at line 653 of file render_trav.cpp.

References _StrongestLightDiffuse, _StrongestLightSpecular, _VPCurrentCtStart, _VPFinalAmbient, _VPLightDiffuse, _VPLightSpecular, _VPMaterialCacheAmbient, _VPMaterialCacheDiffuse, _VPMaterialCacheDirty, _VPMaterialCacheEmissive, _VPMaterialCacheShininess, _VPMaterialCacheSpecular, _VPNumLights, _VPSupportSpecular, NLMISC::CRGBAF::A, NLMISC::CRGBAF::B, NLMISC::CRGBAF::G, NL3D::CMaterial::getAmbient(), NL3D::CMaterial::getDiffuse(), NL3D::CMaterial::getEmissive(), NLMISC::CRGBA::getPacked(), NL3D::CMaterial::getShininess(), NL3D::CMaterial::getSpecular(), getStrongestLightIndex(), NLMISC::CRGBAF::R, NLMISC::CRGBA::set(), NL3D::IDriver::setConstant(), uint, and uint8.

Referenced by NL3D::CMeshGeom::renderPass(), NL3D::SetupForMaterial(), and NL3D::CMeshVPPerPixelLight::setupForMaterial().

00654 {
00655         // Must test if at least done one time.
00656         if(!_VPMaterialCacheDirty)
00657         {
00658                 // Must test if same as in cache
00659                 if( _VPMaterialCacheEmissive == mat.getEmissive().getPacked() &&
00660                         _VPMaterialCacheAmbient == mat.getAmbient().getPacked() &&
00661                         _VPMaterialCacheDiffuse == mat.getDiffuse().getPacked() )
00662                 {
00663                         // Same Diffuse part, test if same specular if necessary
00664                         if( !_VPSupportSpecular ||
00665                                 ( _VPMaterialCacheSpecular == mat.getSpecular().getPacked() &&
00666                                   _VPMaterialCacheShininess == mat.getShininess() )  )
00667                         {
00668                                 // Then ok, skip.
00669                                 return;
00670                         }
00671                 }
00672         }
00673 
00674         // If not skiped, cache now. cache all for simplification
00675         _VPMaterialCacheDirty= false;
00676         _VPMaterialCacheEmissive= mat.getEmissive().getPacked();
00677         _VPMaterialCacheAmbient= mat.getDiffuse().getPacked();
00678         _VPMaterialCacheDiffuse= mat.getDiffuse().getPacked();
00679         _VPMaterialCacheSpecular= mat.getSpecular().getPacked();
00680         _VPMaterialCacheShininess= mat.getShininess();
00681 
00682         // Setup constants
00683         CRGBAF  color;
00684         uint    i;
00685         CRGBAF  matDiff= mat.getDiffuse();
00686         CRGBAF  matSpec= mat.getSpecular();
00687         float   specExp= mat.getShininess();
00688         
00689         uint strongestLightIndex = excludeStrongest ? getStrongestLightIndex() : _VPNumLights;
00690 
00691         // setup Ambient + Emissive
00692         color= _VPFinalAmbient * mat.getAmbient();
00693         color+= mat.getEmissive();
00694         Driver->setConstant(_VPCurrentCtStart+0, 1, &color.R);
00695         
00696 
00697         // is the strongest light is not excluded, its index should have been setup to _VPNumLights
00698 
00699         // setup Diffuse.
00700         for(i = 0; i < strongestLightIndex; ++i)
00701         {
00702                 color= _VPLightDiffuse[i] * matDiff;
00703                 Driver->setConstant(_VPCurrentCtStart+1+i, 1, &color.R);
00704         }
00705 
00706         
00707         if (i != _VPNumLights)
00708         {
00709                 color= _VPLightDiffuse[i] * matDiff;
00710                 _StrongestLightDiffuse.set((uint8) (255.f * color.R), (uint8) (255.f * color.G), (uint8) (255.f * color.B), (uint8) (255.f * color.A));
00711                 // setup strongest light to black for the gouraud part
00712                 Driver->setConstant(_VPCurrentCtStart + 1 + i, 0.f, 0.f, 0.f, 0.f);
00713                 ++i;
00714                 // setup other lights
00715                 for(; i < _VPNumLights; i++)
00716                 {
00717                         color= _VPLightDiffuse[i] * matDiff;
00718                         Driver->setConstant(_VPCurrentCtStart + 1 + i, 1, &color.R);
00719                 }
00720         }
00721 
00722         // setup Specular
00723         if(_VPSupportSpecular)
00724         {
00725                 for(i = 0; i < strongestLightIndex; ++i)
00726                 {
00727                         color= _VPLightSpecular[i] * matSpec;
00728                         color.A= specExp;
00729                         Driver->setConstant(_VPCurrentCtStart+5+i, 1, &color.R);
00730                 }
00731 
00732                 if (i != _VPNumLights)
00733                 {
00734                         color= _VPLightSpecular[i] * matSpec;
00735                         _StrongestLightSpecular.set((uint8) (255.f * color.R), (uint8) (255.f * color.G), (uint8) (255.f * color.B), (uint8) (255.f * color.A));
00736 
00737                         // setup strongest light to black (for gouraud part)
00738                         Driver->setConstant(_VPCurrentCtStart + 5 + i, 0.f, 0.f, 0.f, 0.f);
00739                         ++i;
00740                         // setup other lights
00741                         for(; i < _VPNumLights; i++)
00742                         {
00743                                 color= _VPLightSpecular[i] * matSpec;
00744                                 color.A= specExp;
00745                                 Driver->setConstant(_VPCurrentCtStart + 5 + i, 1, &color.R);
00746                         }
00747                 }
00748         }
00749 
00750         // setup alpha.
00751         static  float   alphaCte[4]= {0,0,1,0};
00752         alphaCte[3]= matDiff.A;
00753         // setup at good place
00754         if(_VPSupportSpecular)
00755                         Driver->setConstant(_VPCurrentCtStart+10, 1, alphaCte);
00756         else
00757                         Driver->setConstant(_VPCurrentCtStart+9, 1, alphaCte);
00758 }

void NL3D::CRenderTrav::clearRenderLandscapeList  )  [private]
 

Definition at line 1031 of file render_trav.cpp.

References _LandscapeRenderList.

Referenced by traverse().

01032 {
01033         _LandscapeRenderList.clear();
01034 }

void NL3D::CRenderTrav::clearRenderList  ) 
 

Clear the list of rendered models.

Definition at line 312 of file render_trav.cpp.

Referenced by NL3D::CClipTrav::traverse().

00313 {
00314         _CurrentNumVisibleModels= 0;
00315 }

IDriver* NL3D::CRenderTrav::getAuxDriver  )  [inline]
 

Definition at line 135 of file render_trav.h.

Referenced by NL3D::CSkeletonModel::generateShadowMap(), NL3D::CMeshInstance::generateShadowMap(), NL3D::CShadowMapManager::renderGenerate(), NL3D::CSkeletonModel::renderIntoSkeletonShadowMap(), NL3D::CMeshInstance::renderIntoSkeletonShadowMap(), NL3D::CSkeletonModel::renderShadowSkins(), and traverse().

00135 {return Driver;}

IDriver* NL3D::CRenderTrav::getDriver void   )  [inline]
 

Definition at line 133 of file render_trav.h.

Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape(), NL3D::CLandscapeModel::receiveShadowMap(), NL3D::CSkeletonModel::renderCLod(), NL3D::CShadowMapManager::renderProject(), NL3D::CMeshMRMGeom::renderSkin(), NL3D::CMeshGeom::renderSkin(), NL3D::CMeshMRMSkinnedGeom::renderSkinGroupGeom(), NL3D::CMeshMRMGeom::renderSkinGroupGeom(), NL3D::CMeshMRMSkinnedGeom::renderSkinGroupPrimitives(), NL3D::CMeshMRMGeom::renderSkinGroupPrimitives(), NL3D::CMeshMRMSkinnedGeom::renderSkinGroupSpecularRdrPass(), NL3D::CMeshMRMGeom::renderSkinGroupSpecularRdrPass(), NL3D::CSkeletonModel::renderSkinList(), NL3D::CSkeletonModel::renderSkins(), setupDriverCamera(), traverse(), NL3D::CWaterModel::traverseRender(), NL3D::CVegetableBlendLayerModel::traverseRender(), NL3D::CTransformShape::traverseRender(), and NL3D::CFlareModel::traverseRender().

00133 {return Driver;}

const CLight& NL3D::CRenderTrav::getDriverLight sint  index  )  const [inline]
 

This returns a reference to a driver light, by its index

See also:
getStrongestLightIndex

Definition at line 283 of file render_trav.h.

References _DriverLight, index, NL3D_MAX_LIGHT_CONTRIBUTION, nlassert, and sint.

Referenced by NL3D::CMeshVPPerPixelLight::begin().

00284         { 
00285                 nlassert(index >= 0 && index < NL3D_MAX_LIGHT_CONTRIBUTION+1);
00286                 return _DriverLight[index]; 
00287         }

bool NL3D::CRenderTrav::getLayersRenderingOrder  )  const [inline]
 

Definition at line 154 of file render_trav.h.

References _LayersRenderingOrder.

Referenced by NL3D::CScene::getLayersRenderingOrder().

00154 { return _LayersRenderingOrder; }

std::string NL3D::CRenderTrav::getLightVPFragment uint  numActivePointLights,
uint  ctStart,
bool  supportSpecular,
bool  normalize
[static]
 

tool to get a VP fragment which compute lighting with following rules: IN:

  • R5 vertex in objectSpace (ie untransformed)
  • R6 normal in objectSpace (ie untransformed) OUT:
  • R6 normal normalized
  • o[COL0] and o[COL1] are setuped. NB: BF0 and BF1 not computed/setuped. Scratch:
  • R0, R1, R2, R3, R4

For information, constant mapping is (add ctStart):

== Strongest light included ==

if !supportSpecular:

  • 0: AmbientColor.
  • 1..4: DiffuseColor of 4 lights.
  • 5: - (directional Light direction) in objectSpace
  • 6..8: light position (3 pointLihgts) in objectSpace
  • 9: material Diffuse Alpha copied to output. cte is: {0,0, 1, alphaMat} TOTAL: 10 constants used. if supportSpecular:
  • 0: AmbientColor.
  • 1..4: DiffuseColor of 4 lights.
  • 5..8: SpecularColor of 4 lights. NB: SpecularColor[5].w get the specular exponent of the material
  • 9: - (directional Light direction) in objectSpace
  • 10: material Diffuse Alpha copied to output. cte is: {0,0, 1, alphaMat}
  • 11: eye position in objectSpace
  • 12..14: light position (3 pointLihgts) in objectSpace TOTAL: 15 constants used.

NB: the number of active light does not change the number of constantes used. But the VP code returned is modified accordingly.

Parameters:
numActivePoinLights tells how many point light from 0 to 3 this VP must handle. NB: the Sun directionnal is not option NB: nlassert(numActiveLights<=MaxVPLight-1).

Definition at line 964 of file render_trav.cpp.

References NL3D::LightingVPFragmentNormalize, NL3D::LightingVPFragmentNoSpecular_Begin, NL3D::LightingVPFragmentNoSpecular_End, NL3D::LightingVPFragmentNoSpecular_PL, NL3D::LightingVPFragmentSpecular_Begin, NL3D::LightingVPFragmentSpecular_End, NL3D::LightingVPFragmentSpecular_PL, MaxVPLight, nlassert, sint, NL3D::strReplaceAll(), and uint.

00965 {
00966         string  ret;
00967 
00968         // Code frag written for 4 light max.
00969         nlassert(MaxVPLight==4);
00970         nlassert(numActivePointLights<=MaxVPLight-1);
00971 
00972         // Add LightingVPFragmentNormalize fragment?
00973         if(normalize)
00974                 ret+= LightingVPFragmentNormalize;
00975 
00976         // Which fragment to use...
00977         if(supportSpecular)
00978         {
00979                 // Add start of VP.
00980                 ret+= LightingVPFragmentSpecular_Begin;
00981 
00982                 // Add needed pointLights.
00983                 for(uint i=0;i<numActivePointLights;i++)
00984                 {
00985                         ret+= LightingVPFragmentSpecular_PL[i];
00986                 }
00987 
00988                 // Add end of VP.
00989                 ret+= LightingVPFragmentSpecular_End;
00990         }
00991         else
00992         {
00993                 // Add start of VP.
00994                 ret+= LightingVPFragmentNoSpecular_Begin;
00995 
00996                 // Add needed pointLights.
00997                 for(uint i=0;i<numActivePointLights;i++)
00998                 {
00999                         ret+= LightingVPFragmentNoSpecular_PL[i];
01000                 }
01001 
01002                 // Add end of VP.
01003                 ret+= LightingVPFragmentNoSpecular_End;
01004         }
01005 
01006         // Replace all CTS+x with good index. do it for 15 possible indices: 0 to 14 if specular.
01007         // run from 14 to 0 so CTS+14 will not be taken for a CTS+1 !!
01008         for(sint i=14; i>=0; i--)
01009         {
01010                 char    tokenSrc[256];
01011                 sprintf(tokenSrc, "CTS+%d", i);
01012                 char    tokenDst[256];
01013                 sprintf(tokenDst, "%d", ctStart+i);
01014                 // replace all in the string
01015                 strReplaceAll(ret, tokenSrc, tokenDst);
01016         }
01017 
01018         // verify no CTS+ leaved... (not all ctes parsed!!!)
01019         nlassert( ret.find("CTS+")==string::npos );
01020 
01021         return ret;
01022 }

CVertexStreamManager* NL3D::CRenderTrav::getMeshSkinManager  )  const [inline]
 

get the MeshSkinManager

Definition at line 182 of file render_trav.h.

Referenced by NL3D::CSkeletonModel::renderSkinList().

00182 {return _MeshSkinManager;}

uint NL3D::CRenderTrav::getNumVPLights  )  const [inline]
 

return the number of VP lights currently activated (sunlight included) Value correct after beginVPLightSetup() only

Definition at line 301 of file render_trav.h.

References _VPNumLights, and uint.

Referenced by NL3D::CMeshVPWindTree::begin(), and NL3D::CMeshVPWindTree::beginMBRInstance().

00301 {return _VPNumLights;}

const CShadowMapManager& NL3D::CRenderTrav::getShadowMapManager  )  const [inline]
 

Definition at line 186 of file render_trav.h.

References _ShadowMapManager.

00186 {return _ShadowMapManager;}

CShadowMapManager& NL3D::CRenderTrav::getShadowMapManager  )  [inline]
 

get the CShadowMapManager

Definition at line 185 of file render_trav.h.

References _ShadowMapManager.

Referenced by NL3D::CClipTrav::clipSkeletonShadowMaps(), NL3D::CScene::enableShadowPolySmooth(), NL3D::CSkeletonModel::generateShadowMap(), NL3D::CMeshInstance::generateShadowMap(), NL3D::CScene::getEnableShadowPolySmooth(), NL3D::CMeshInstance::traverseRender(), and NL3D::CLandscapeModel::traverseRender().

00185 {return _ShadowMapManager;}

CVertexStreamManager* NL3D::CRenderTrav::getShadowMeshSkinManager  )  const [inline]
 

Definition at line 190 of file render_trav.h.

Referenced by NL3D::CSkeletonModel::renderShadowSkins().

00190 {return _ShadowMeshSkinManager;}

void NL3D::CRenderTrav::getStrongestLightColors NLMISC::CRGBA diffuse,
NLMISC::CRGBA specular
 

Get current color, diffuse and specular of the strongest light in the scene. These values are modulated by the current material color, so these values are valid only after changeVPLightSetupMaterial() has been called

Definition at line 778 of file render_trav.cpp.

References _StrongestLightDiffuse, _StrongestLightSpecular, getStrongestLightIndex(), and sint.

Referenced by NL3D::CMeshVPPerPixelLight::setupForMaterial().

00779 {
00780         sint strongestLightIndex = getStrongestLightIndex();
00781         if (strongestLightIndex == -1)
00782         {
00783                 diffuse = specular = NLMISC::CRGBA::Black;              
00784         }
00785         else
00786         {
00787                 diffuse = _StrongestLightDiffuse;
00788                 specular = _StrongestLightSpecular;             
00789         }
00790 }

sint NL3D::CRenderTrav::getStrongestLightIndex  )  const
 

return an index to the current strongest settuped light (or -1 if there's none)

Definition at line 761 of file render_trav.cpp.

References _NumLightEnabled, _StrongestLightTouched, _VPLightDiffuse, _VPLightSpecular, NLMISC::CRGBAF::A, NLMISC::CRGBAF::B, NLMISC::CRGBAF::G, MaxVPLight, min, NLMISC::CRGBAF::R, sint, and uint.

Referenced by NL3D::CMeshVPPerPixelLight::begin(), changeVPLightSetupMaterial(), and getStrongestLightColors().

00762 {
00763         if (!_StrongestLightTouched) return -1;
00764         uint vpNumLights = min(_NumLightEnabled, (uint)MaxVPLight);
00765         // If there is only a directionnal light, use it
00766         // If there is any point light, use the nearest, or the directionnal light if it is brighter
00767         if (vpNumLights == 0) return -1;
00768         if (vpNumLights == 1) return 0;
00769         // First point light is brightest ?
00770         float lumDir = _VPLightDiffuse[0].R + _VPLightDiffuse[0].G + _VPLightDiffuse[0].B + _VPLightDiffuse[0].A
00771                                    + _VPLightSpecular[0].R + _VPLightSpecular[0].G + _VPLightSpecular[0].B + _VPLightSpecular[0].A;
00772         float lumOmni = _VPLightDiffuse[1].R + _VPLightDiffuse[1].G + _VPLightDiffuse[1].B + _VPLightDiffuse[1].A
00773                                    + _VPLightSpecular[1].R + _VPLightSpecular[1].G + _VPLightSpecular[1].B + _VPLightSpecular[1].A;
00774         return lumDir > lumOmni ? 0 : 1;
00775 }

const CVector NL3D::CRenderTrav::getSunDirection  )  const [inline]
 

Definition at line 170 of file render_trav.h.

References _SunDirection.

Referenced by NL3D::CScene::getSunDirection().

00170 {return _SunDirection;}

CViewport NL3D::CRenderTrav::getViewport  )  const [inline]
 

Definition at line 140 of file render_trav.h.

00141         {
00142                 return _Viewport;
00143         }

bool NL3D::CRenderTrav::isCurrentPassOpaque  )  [inline]
 

Definition at line 145 of file render_trav.h.

References _CurrentPassOpaque.

Referenced by NL3D::CTransformShape::profileRender(), NL3D::CSkeletonModel::renderCLod(), NL3D::CSkeletonModel::renderSkins(), NL3D::CTransformShape::traverseRender(), and NL3D::CFlareModel::traverseRender().

00145 { return _CurrentPassOpaque; }

void NL3D::CRenderTrav::renderLandscapes  )  [private]
 

Definition at line 1043 of file render_trav.cpp.

References _LandscapeRenderList, and uint.

Referenced by traverse().

01044 {
01045         // Render Each Landscapes.
01046         for(uint i=0;i<_LandscapeRenderList.size();i++)
01047         {
01048                 _LandscapeRenderList[i]->clipAndRenderLandscape();
01049         }
01050 }

void NL3D::CRenderTrav::reserveRenderList uint  numModels  ) 
 

Add a model to the list of rendered models. DOESN'T CHECK if already inserted.

Definition at line 339 of file render_trav.cpp.

References RenderList, and uint.

Referenced by NL3D::CScene::createModel().

00340 {
00341         // enlarge only.
00342         if(numModels>RenderList.size())
00343                 RenderList.resize(numModels);
00344 }

void NL3D::CRenderTrav::resetLightSetup  ) 
 

reset the lighting setup in the driver (all lights are disabled). called at begining of traverse(). Must be called by any model (before and after rendering) that wish to use CDriver::setLight() instead of the standard behavior with changeLightSetup()

Definition at line 355 of file render_trav.cpp.

References _CacheLightContribution, _DriverLight, _LastFinalAmbient, _LastPointLight, _LastSunFactor, _NumLightEnabled, _StrongestLightTouched, _SunDirection, AmbientGlobal, NL3D::IDriver::enableLight(), NL3D::IDriver::getMaxLight(), NL3D_MAX_LIGHT_CONTRIBUTION, NLMISC::CVector::normalize(), NLMISC::CRGBA::set(), NL3D::IDriver::setAmbientColor(), NL3D::IDriver::setLight(), NL3D::CLight::setupDirectional(), and uint.

Referenced by traverse().

00356 {
00357         // If lighting System disabled, skip
00358         if(!LightingSystemEnabled)
00359         {
00360                 // Dont modify Driver lights, but setup default lighting For VertexProgram Lighting.
00361                 _NumLightEnabled= 1;
00362                 // Setup A default directionnal.
00363                 CVector         defDir(-0.5f, 0.0, -0.85f);
00364                 defDir.normalize();
00365                 CRGBA           aday= CRGBA(130,  105,  119);
00366                 CRGBA           dday= CRGBA(238, 225, 204);
00367                 _DriverLight[0].setupDirectional(aday, dday, dday, defDir);
00368 
00369                 return;
00370         }
00371         else
00372         {
00373                 uint i;
00374 
00375                 // Disable all lights.
00376                 for(i=0; i<Driver->getMaxLight(); i++)
00377                 {
00378                         Driver->enableLight(i, false);
00379                 }
00380 
00381 
00382                 // setup the precise cache, and setup lights according to this cache?
00383                 // setup blackSun (factor==0).
00384                 _LastSunFactor= 0;
00385                 _LastFinalAmbient.set(0,0,0,255);
00386                 _DriverLight[0].setupDirectional(CRGBA::Black, CRGBA::Black, CRGBA::Black, _SunDirection);
00387                 Driver->setLight(0, _DriverLight[0]);
00388                 // setup NULL point lights (=> cache will fail), so no need to setup other lights in Driver.
00389                 for(i=0; i<NL3D_MAX_LIGHT_CONTRIBUTION; i++)
00390                 {
00391                         _LastPointLight[i]= NULL;
00392                 }
00393 
00394 
00395                 // Set the global ambientColor
00396                 Driver->setAmbientColor(AmbientGlobal);
00397 
00398 
00399                 // clear the cache.
00400                 _CacheLightContribution= NULL;
00401                 _NumLightEnabled= 0;
00402 
00403                 _StrongestLightTouched = true;
00404         }
00405 }

void NL3D::CTravCameraScene::setCamMatrix const NLMISC::CMatrix camMatrix  )  [inline, inherited]
 

Setup the camera matrix (a translation/rotation matrix).

Definition at line 102 of file trav_scene.h.

References NL3D::CTravCameraScene::CamMatrix.

Referenced by NL3D::CScene::render().

00103         {
00104                 CamMatrix= camMatrix;
00105         }

void NL3D::CRenderTrav::setDriver IDriver drv  )  [inline]
 

Definition at line 132 of file render_trav.h.

Referenced by NL3D::CScene::setDriver().

00132 {Driver= drv;}

void NL3D::CTravCameraScene::setFrustum float  width,
float  height,
float  znear,
float  zfar,
bool  perspective = true
[inline, inherited]
 

Setup the camera mode as a perspective/ortho camera. NB: znear and zfar must be >0 (if perspective).

Definition at line 97 of file trav_scene.h.

References height, NL3D::CTravCameraScene::setFrustum(), and width.

00098         {
00099                 setFrustum(-width/2, width/2, -height/2, height/2, znear, zfar, perspective);
00100         }

void NL3D::CTravCameraScene::setFrustum float  left,
float  right,
float  bottom,
float  top,
float  znear,
float  zfar,
bool  perspective = true
[inline, inherited]
 

Setup the camera mode as a perspective/ortho camera. NB: znear and zfar must be >0 (if perspective).

Definition at line 86 of file trav_scene.h.

References NL3D::CTravCameraScene::Bottom, NL3D::CTravCameraScene::Far, NL3D::CTravCameraScene::Near, NL3D::CTravCameraScene::Perspective, and NL3D::CTravCameraScene::Right.

Referenced by NL3D::CTravCameraScene::CTravCameraScene(), NL3D::CScene::render(), and NL3D::CTravCameraScene::setFrustum().

00087         {
00088                 Left= left;
00089                 Right= right;
00090                 Bottom= bottom;
00091                 Top= top;
00092                 Near= znear;
00093                 Far= zfar;
00094                 Perspective= perspective;
00095         }

void NL3D::CRenderTrav::setLayersRenderingOrder bool  directOrder = true  )  [inline]
 

Set the order or rendering for transparent objects. In real case, with direct order, we have:

  • Underwater is rendered.
  • Water is rendered.
  • Objects above water are rendered.

Definition at line 153 of file render_trav.h.

References _LayersRenderingOrder.

Referenced by NL3D::CScene::setLayersRenderingOrder().

00153 { _LayersRenderingOrder = directOrder; }

void NL3D::CRenderTrav::setMeshSkinManager CVertexStreamManager msm  ) 
 

Set/Replace the MeshSkinManager. NULL by default => skinning is slower. The ptr is handled but not deleted. There should be one MeshSkinManager per driver.

Definition at line 327 of file render_trav.cpp.

00328 {
00329         _MeshSkinManager= msm;
00330 }

void NL3D::CRenderTrav::setShadowMeshSkinManager CVertexStreamManager msm  ) 
 

the MeshSkinManager for Shadow. Same Behaviour than std MeshSkinManager. NB: the Shadow MSM is inited with AuxDriver.

Definition at line 333 of file render_trav.cpp.

00334 {
00335         _ShadowMeshSkinManager= msm;
00336 }

void NL3D::CRenderTrav::setSunDirection const CVector dir  ) 
 

Definition at line 319 of file render_trav.cpp.

References _SunDirection, and NLMISC::CVector::normalize().

Referenced by NL3D::CScene::setSunDirection().

00320 {
00321         _SunDirection= dir;
00322         _SunDirection.normalize();
00323 }

void NL3D::CRenderTrav::setupDriverCamera  ) 
 

Definition at line 304 of file render_trav.cpp.

References getDriver(), NL3D::IDriver::setFrustum(), and NL3D::IDriver::setupViewMatrixEx().

Referenced by NL3D::CShadowMapManager::renderGenerate(), and traverse().

00305 {
00306         getDriver()->setFrustum(Left, Right, Bottom, Top, Near, Far, Perspective);
00307         // Use setupViewMatrixEx() for ZBuffer precision.
00308         getDriver()->setupViewMatrixEx(ViewMatrix, CamPos);
00309 }

void NL3D::CRenderTrav::setViewport const CViewport viewport  )  [inline]
 

Definition at line 136 of file render_trav.h.

Referenced by NL3D::CScene::render().

00137         {
00138                 _Viewport = viewport;
00139         }

void NL3D::CRenderTrav::traverse  ) 
 

First traverse the root (if any), then render the render list. NB: no Driver clear buffers (color or ZBuffer) are done....

Definition at line 89 of file render_trav.cpp.

References _CurrentPassOpaque, _LayersRenderingOrder, _ShadowMapManager, NL3D::CLayeredOrderingTable< CTransform >::begin(), NL3D::COrderingTable< CTransform >::begin(), NL3D::CLodCharacterManager::beginRender(), clearRenderLandscapeList(), NL3D::CLodCharacterManager::endRender(), NL3D::CMeshBlockManager::flush(), NL3D::CCoarseMeshManager::flushRender(), NL3D::CLayeredOrderingTable< CTransform >::get(), NL3D::COrderingTable< CTransform >::get(), getAuxDriver(), NL3D::CScene::getCoarseMeshManager(), NL3D::CVertexStreamManager::getDriver(), getDriver(), NL3D::CScene::getLodCharacterManager(), NL3D::CTransform::getOrderingLayer(), NLMISC::CMatrix::getPos(), NL3D::CLayeredOrderingTable< CTransform >::getSize(), NL3D::COrderingTable< CTransform >::getSize(), NL3D::CTransform::getWorldMatrix(), H_AUTO, NL3D::CVertexStreamManager::init(), NL3D::CLayeredOrderingTable< CTransform >::insert(), NL3D::COrderingTable< CTransform >::insert(), NL3D::CScene::isNextRenderProfile(), NL3D::CTransform::isOpaque(), NL3D::CTransform::isTransparent(), MeshBlockManager, min, NL3D::CLayeredOrderingTable< CTransform >::next(), NL3D::COrderingTable< CTransform >::next(), NL3D_MESH_SKIN_MANAGER_MAXVERTICES, NL3D_MESH_SKIN_MANAGER_NUMVB, NL3D_MESH_SKIN_MANAGER_VERTEXFORMAT, NL3D_SHADOW_MESH_SKIN_MANAGER_MAXVERTICES, NL3D_SHADOW_MESH_SKIN_MANAGER_NUMVB, NL3D_SHADOW_MESH_SKIN_MANAGER_VERTEXFORMAT, NLMISC::OptFastFloor(), NLMISC::OptFastFloorBegin(), NLMISC::OptFastFloorEnd(), OrderOpaqueList, OrderTransparentList, NL3D::CTransform::profileRender(), NL3D::CVertexStreamManager::release(), NL3D::CShadowMapManager::renderGenerate(), renderLandscapes(), RenderList, NL3D::CShadowMapManager::renderProject(), NL3D::CLayeredOrderingTable< CTransform >::reset(), NL3D::COrderingTable< CTransform >::reset(), resetLightSetup(), setupDriverCamera(), NL3D::IDriver::setupViewport(), NL3D::CTransform::traverseRender(), and uint32.

Referenced by NL3D::CScene::render().

00090 {
00091         H_AUTO( NL3D_TravRender );
00092 
00093         CTravCameraScene::update();
00094 
00095         // Bind to Driver.
00096         setupDriverCamera();
00097         getDriver()->setupViewport(_Viewport);
00098 
00099         // reset the light setup, and set global ambient.
00100         resetLightSetup();
00101 
00102 
00103         // reset the Skin manager, if needed
00104         if(_MeshSkinManager)
00105         {
00106                 if(Driver!=_MeshSkinManager->getDriver())
00107                 {
00108                         _MeshSkinManager->release();
00109                         _MeshSkinManager->init(Driver, 
00110                                 NL3D_MESH_SKIN_MANAGER_VERTEXFORMAT, 
00111                                 NL3D_MESH_SKIN_MANAGER_MAXVERTICES, 
00112                                 NL3D_MESH_SKIN_MANAGER_NUMVB, 
00113                                 "MRMSkinVB");
00114                 }
00115         }
00116 
00117         // Same For Shadow ones. NB: use AuxDriver here!!!
00118         if(_ShadowMeshSkinManager)
00119         {
00120                 if(getAuxDriver()!=_ShadowMeshSkinManager->getDriver())
00121                 {
00122                         _ShadowMeshSkinManager->release();
00123                         _ShadowMeshSkinManager->init(getAuxDriver(), 
00124                                 NL3D_SHADOW_MESH_SKIN_MANAGER_VERTEXFORMAT, 
00125                                 NL3D_SHADOW_MESH_SKIN_MANAGER_MAXVERTICES,
00126                                 NL3D_SHADOW_MESH_SKIN_MANAGER_NUMVB,
00127                                 "ShadowSkinVB");
00128                 }
00129         }
00130 
00131 
00132         // Fill OT with models, for both Opaque and transparent pass
00133         // =============================
00134 
00135         // Sort the models by distance from camera
00136         // This is done here and not in the addRenderModel because of the LoadBalancing traversal which can modify
00137         // the transparency flag (multi lod for instance)
00138 
00139         // clear the OTs, and prepare to allocate max element space
00140         OrderOpaqueList.reset(_CurrentNumVisibleModels);
00141         OrderTransparentList.reset(_CurrentNumVisibleModels);
00142 
00143         // fill the OTs.
00144         CTransform                      **itRdrModel= NULL;
00145         uint32                          nNbModels = _CurrentNumVisibleModels;
00146         if(nNbModels)   
00147                 itRdrModel= &RenderList[0];
00148         float   rPseudoZ, rPseudoZ2;
00149 
00150         // Some precalc
00151         float   OOFar= 1.0f / this->Far;
00152         uint32  opaqueOtSize= OrderOpaqueList.getSize();
00153         uint32  opaqueOtMax= OrderOpaqueList.getSize()-1;
00154         uint32  transparentOtSize= OrderTransparentList.getSize();
00155         uint32  transparentOtMax= OrderTransparentList.getSize()-1;
00156         uint32  otId;
00157         // fast floor
00158         NLMISC::OptFastFloorBegin();
00159         // For all rdr models
00160         for( ; nNbModels>0; itRdrModel++, nNbModels-- )
00161         {
00162                 CTransform                      *pTransform = *itRdrModel;
00163 
00164                 // Yoyo: skins are rendered through skeletons, so models WorldMatrix are all good here (even sticked objects)
00165                 rPseudoZ = (pTransform->getWorldMatrix().getPos() - CamPos).norm();
00166 
00167                 // rPseudoZ from 0.0 -> 1.0
00168                 rPseudoZ =  sqrtf( rPseudoZ * OOFar );
00169 
00170                 if( pTransform->isOpaque() )
00171                 {
00172                         // since norm, we are sure that rPseudoZ>=0
00173                         rPseudoZ2 = rPseudoZ * opaqueOtSize;
00174                         otId= NLMISC::OptFastFloor(rPseudoZ2);
00175                         otId= min(otId, opaqueOtMax);
00176                         OrderOpaqueList.insert( otId, pTransform );
00177                 }
00178                 if( pTransform->isTransparent() )
00179                 {
00180                         // since norm, we are sure that rPseudoZ>=0
00181                         rPseudoZ2 = rPseudoZ * transparentOtSize;
00182                         otId= NLMISC::OptFastFloor(rPseudoZ2);
00183                         otId= min(otId, transparentOtMax);
00184                         // must invert id, because transparent, sort from back to front
00185                         OrderTransparentList.insert( pTransform->getOrderingLayer(), pTransform, transparentOtMax-otId );
00186                 }
00187 
00188         }
00189         // fast floor
00190         NLMISC::OptFastFloorEnd();
00191 
00192 
00193         // Render Opaque stuff.
00194         // =============================
00195 
00196         // TestYoyo
00197         //OrderOpaqueList.reset(0);
00198         //OrderTransparentList.reset(0);
00199 
00200         // Clear any landscape
00201         clearRenderLandscapeList();
00202 
00203         // Start LodCharacter Manager render.
00204         CLodCharacterManager    *clodMngr= Scene->getLodCharacterManager();
00205         if(clodMngr)
00206                 clodMngr->beginRender(getDriver(), CamPos);
00207 
00208         // Render the opaque materials
00209         _CurrentPassOpaque = true;
00210         OrderOpaqueList.begin();
00211         while( OrderOpaqueList.get() != NULL )
00212         {
00213                 CTransform      *tr= OrderOpaqueList.get();
00214                 tr->traverseRender();
00215                 OrderOpaqueList.next();
00216         }
00217 
00218         /* Render MeshBlock Manager. 
00219                 Some Meshs may be render per block. Interesting to remove VertexBuffer and Material setup overhead.
00220                 Faster if rendered before lods, for ZBuffer optimisation: render first near objects then far. 
00221                 Lods are usually far objects.
00222         */
00223         MeshBlockManager.flush(Driver, Scene, this);
00224 
00225 
00226         // End LodCharacter Manager render.
00227         if(clodMngr)
00228                 clodMngr->endRender();
00229 
00230 
00231         /* Render Scene CoarseMeshManager. 
00232                 Important to render them at end of Opaque rendering, because coarses instances are created/removed during
00233                 this model opaque rendering pass.
00234         */
00235         if( Scene->getCoarseMeshManager() )
00236                 Scene->getCoarseMeshManager()->flushRender(Driver);
00237 
00238         /* Render ShadowMaps.
00239                 Important to render them at end of Opaque rendering, because alphaBlended objects must blend with opaque
00240                 objects shadowed.
00241                 Therefore, transparent objects neither can't cast or receive shadows...
00242 
00243                 NB: Split in 2 calls and interleave Landscape Rendering between the 2. WHY???
00244                 Because it is far more efficient for VBLock (but not for ZBuffer optim...) because in renderGenerate()
00245                 the ShadowMeshSkinManager do lot of VBLocks that really stall (because only 2 VBHard with swap scheme). 
00246 
00247                 Therefore the first Lock that stall will wait not only for the first MeshSkin to finish but also for the
00248                 preceding landscape render to finish too! => big STALL.
00249         */
00250 
00251         // Generate ShadowMaps
00252         _ShadowMapManager.renderGenerate(Scene);
00253 
00254         // Render the Landscape
00255         renderLandscapes();
00256 
00257         // Project ShadowMaps.
00258         _ShadowMapManager.renderProject(Scene);
00259 
00260 
00261         // Profile this frame?
00262         if(Scene->isNextRenderProfile())
00263         {
00264                 OrderOpaqueList.begin();
00265                 while( OrderOpaqueList.get() != NULL )
00266                 {
00267                         OrderOpaqueList.get()->profileRender();
00268                         OrderOpaqueList.next();
00269                 }
00270         }
00271 
00272         // Render Transparent stuff.
00273         // =============================
00274 
00275          // Render transparent materials
00276         _CurrentPassOpaque = false;
00277         OrderTransparentList.begin(_LayersRenderingOrder);      
00278         while( OrderTransparentList.get() != NULL )
00279         {                               
00280                 OrderTransparentList.get()->traverseRender();
00281                 OrderTransparentList.next();
00282         }
00283 
00284         // Profile this frame?
00285         if(Scene->isNextRenderProfile())
00286         {
00287                 OrderTransparentList.begin();
00288                 while( OrderTransparentList.get() != NULL )
00289                 {
00290                         OrderTransparentList.get()->profileRender();
00291                         OrderTransparentList.next();
00292                 }
00293         }
00294 
00295         // END!
00296         // =============================
00297 
00298         // clean: reset the light setup
00299         resetLightSetup();
00300 
00301 }

void NL3D::CTravCameraScene::update  )  [inline, protected, inherited]
 

update the dependent information.

Definition at line 122 of file trav_scene.h.

References NL3D::CTravCameraScene::CamLook, NL3D::CTravCameraScene::CamMatrix, NL3D::CTravCameraScene::CamPos, NLMISC::CMatrix::getPos(), NLMISC::CMatrix::inverted(), and NLMISC::CMatrix::mulVector().

00123         {
00124                 ViewMatrix= CamMatrix.inverted();
00125                 CamPos= CamMatrix.getPos();
00126                 CamLook= CamMatrix.mulVector(NLMISC::CVector::J);
00127         }


Field Documentation

CLightContribution* NL3D::CRenderTrav::_CacheLightContribution [private]
 

Definition at line 338 of file render_trav.h.

Referenced by changeLightSetup(), CRenderTrav(), and resetLightSetup().

uint32 NL3D::CRenderTrav::_CurrentNumVisibleModels [private]
 

Definition at line 321 of file render_trav.h.

bool NL3D::CRenderTrav::_CurrentPassOpaque [private]
 

Definition at line 331 of file render_trav.h.

Referenced by CRenderTrav(), isCurrentPassOpaque(), and traverse().

CLight NL3D::CRenderTrav::_DriverLight[NL3D_MAX_LIGHT_CONTRIBUTION+1] [private]
 

Definition at line 353 of file render_trav.h.

Referenced by beginVPLightSetup(), changeLightSetup(), getDriverLight(), and resetLightSetup().

std::vector<CLandscapeModel*> NL3D::CRenderTrav::_LandscapeRenderList [private]
 

Definition at line 406 of file render_trav.h.

Referenced by addRenderLandscape(), clearRenderLandscapeList(), and renderLandscapes().

NLMISC::CRGBA NL3D::CRenderTrav::_LastFinalAmbient [private]
 

Definition at line 345 of file render_trav.h.

Referenced by changeLightSetup(), and resetLightSetup().

bool NL3D::CRenderTrav::_LastLocalAttenuation [private]
 

Definition at line 339 of file render_trav.h.

Referenced by changeLightSetup().

CPointLight* NL3D::CRenderTrav::_LastPointLight[NL3D_MAX_LIGHT_CONTRIBUTION] [private]
 

Definition at line 346 of file render_trav.h.

Referenced by changeLightSetup(), and resetLightSetup().

uint8 NL3D::CRenderTrav::_LastPointLightFactor[NL3D_MAX_LIGHT_CONTRIBUTION] [private]
 

Definition at line 347 of file render_trav.h.

Referenced by changeLightSetup().

bool NL3D::CRenderTrav::_LastPointLightLocalAttenuation[NL3D_MAX_LIGHT_CONTRIBUTION] [private]
 

Definition at line 348 of file render_trav.h.

Referenced by changeLightSetup().

uint NL3D::CRenderTrav::_LastSunFactor [private]
 

Definition at line 344 of file render_trav.h.

Referenced by changeLightSetup(), and resetLightSetup().

bool NL3D::CRenderTrav::_LayersRenderingOrder [private]
 

Definition at line 332 of file render_trav.h.

Referenced by CRenderTrav(), getLayersRenderingOrder(), setLayersRenderingOrder(), and traverse().

CVertexStreamManager* NL3D::CRenderTrav::_MeshSkinManager [private]
 

The manager of skin. NULL by default.

Definition at line 386 of file render_trav.h.

uint NL3D::CRenderTrav::_NumLightEnabled [private]
 

Definition at line 341 of file render_trav.h.

Referenced by beginVPLightSetup(), changeLightSetup(), getStrongestLightIndex(), and resetLightSetup().

CShadowMapManager NL3D::CRenderTrav::_ShadowMapManager [private]
 

The ShadowMap Manager.

Definition at line 390 of file render_trav.h.

Referenced by getShadowMapManager(), and traverse().

CVertexStreamManager* NL3D::CRenderTrav::_ShadowMeshSkinManager [private]
 

The SkinManager, but For Shadow rendering.

Definition at line 392 of file render_trav.h.

NLMISC::CRGBA NL3D::CRenderTrav::_StrongestLightDiffuse [private]
 

Definition at line 371 of file render_trav.h.

Referenced by changeVPLightSetupMaterial(), and getStrongestLightColors().

uint NL3D::CRenderTrav::_StrongestLightIndex [mutable, private]
 

Definition at line 356 of file render_trav.h.

NLMISC::CRGBA NL3D::CRenderTrav::_StrongestLightSpecular [private]
 

Definition at line 372 of file render_trav.h.

Referenced by changeVPLightSetupMaterial(), and getStrongestLightColors().

bool NL3D::CRenderTrav::_StrongestLightTouched [mutable, private]
 

Definition at line 357 of file render_trav.h.

Referenced by changeLightSetup(), CRenderTrav(), getStrongestLightIndex(), and resetLightSetup().

CVector NL3D::CRenderTrav::_SunDirection [private]
 

Definition at line 350 of file render_trav.h.

Referenced by changeLightSetup(), CRenderTrav(), getSunDirection(), resetLightSetup(), and setSunDirection().

CViewport NL3D::CRenderTrav::_Viewport [private]
 

Definition at line 328 of file render_trav.h.

uint NL3D::CRenderTrav::_VPCurrentCtStart [private]
 

Definition at line 360 of file render_trav.h.

Referenced by beginVPLightSetup(), and changeVPLightSetupMaterial().

NLMISC::CRGBAF NL3D::CRenderTrav::_VPFinalAmbient [private]
 

Definition at line 366 of file render_trav.h.

Referenced by beginVPLightSetup(), and changeVPLightSetupMaterial().

NLMISC::CRGBAF NL3D::CRenderTrav::_VPLightDiffuse[MaxVPLight] [private]
 

Definition at line 368 of file render_trav.h.

Referenced by beginVPLightSetup(), changeVPLightSetupMaterial(), and getStrongestLightIndex().

NLMISC::CRGBAF NL3D::CRenderTrav::_VPLightSpecular[MaxVPLight] [private]
 

Definition at line 369 of file render_trav.h.

Referenced by beginVPLightSetup(), changeVPLightSetupMaterial(), and getStrongestLightIndex().

uint32 NL3D::CRenderTrav::_VPMaterialCacheAmbient [private]
 

Definition at line 377 of file render_trav.h.

Referenced by changeVPLightSetupMaterial().

uint32 NL3D::CRenderTrav::_VPMaterialCacheDiffuse [private]
 

Definition at line 378 of file render_trav.h.

Referenced by changeVPLightSetupMaterial().

bool NL3D::CRenderTrav::_VPMaterialCacheDirty [private]
 

Definition at line 375 of file render_trav.h.

Referenced by beginVPLightSetup(), and changeVPLightSetupMaterial().

uint32 NL3D::CRenderTrav::_VPMaterialCacheEmissive [private]
 

Definition at line 376 of file render_trav.h.

Referenced by changeVPLightSetupMaterial().

float NL3D::CRenderTrav::_VPMaterialCacheShininess [private]
 

Definition at line 380 of file render_trav.h.

Referenced by changeVPLightSetupMaterial().

uint32 NL3D::CRenderTrav::_VPMaterialCacheSpecular [private]
 

Definition at line 379 of file render_trav.h.

Referenced by changeVPLightSetupMaterial().

uint NL3D::CRenderTrav::_VPNumLights [private]
 

Definition at line 362 of file render_trav.h.

Referenced by beginVPLightSetup(), changeVPLightSetupMaterial(), and getNumVPLights().

bool NL3D::CRenderTrav::_VPSupportSpecular [private]
 

Definition at line 364 of file render_trav.h.

Referenced by beginVPLightSetup(), and changeVPLightSetupMaterial().

NLMISC::CRGBA NL3D::CRenderTrav::AmbientGlobal
 

Definition at line 165 of file render_trav.h.

Referenced by beginVPLightSetup(), CRenderTrav(), NL3D::CScene::getAmbientGlobal(), resetLightSetup(), and NL3D::CScene::setAmbientGlobal().

float NL3D::CTravCameraScene::Bottom [inherited]
 

Definition at line 75 of file trav_scene.h.

Referenced by NL3D::CTravCameraScene::setFrustum(), NL3D::CWaterModel::traverseRender(), and NL3D::CFlareModel::traverseRender().

NLMISC::CVector NL3D::CTravCameraScene::CamLook [inherited]
 

Definition at line 80 of file trav_scene.h.

Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape(), NL3D::CTravCameraScene::CTravCameraScene(), and NL3D::CTravCameraScene::update().

NLMISC::CMatrix NL3D::CTravCameraScene::CamMatrix [inherited]
 

Definition at line 77 of file trav_scene.h.

Referenced by NL3D::CTravCameraScene::CTravCameraScene(), NL3D::CTravCameraScene::setCamMatrix(), NL3D::CWaterModel::traverseRender(), NL3D::CFlareModel::traverseRender(), and NL3D::CTravCameraScene::update().

NLMISC::CVector NL3D::CTravCameraScene::CamPos [inherited]
 

Definition at line 79 of file trav_scene.h.

Referenced by NL3D::CTransformShape::clip(), NL3D::CQuadGridClipClusterQTreeNode::clip(), NL3D::CLandscapeModel::clipAndRenderLandscape(), NL3D::CSkeletonModel::computeDisplayLodCharacterPriority(), NL3D::CTravCameraScene::CTravCameraScene(), NL3D::CWaterModel::doSimpleRender(), NL3D::CQuadGridClipClusterQTreeNode::noFrustumClip(), NL3D::CCluster::recursTraverseClip(), NL3D::CScene::render(), NL3D::CMeshMRMGeom::render(), NL3D::CMeshGeom::render(), NL3D::CSkeletonModel::renderCLod(), NL3D::CMeshMRMGeom::renderSkin(), NL3D::CMeshGeom::renderSkin(), NL3D::CShadowMapManager::selectShadowMapsToGenerate(), NL3D::CSkeletonModel::traverseAnimDetail(), NL3D::CParticleSystemModel::traverseClip(), NL3D::CTransformShape::traverseLoadBalancingPass0(), NL3D::CWaterModel::traverseRender(), and NL3D::CTravCameraScene::update().

IDriver* NL3D::CRenderTrav::Driver [private]
 

Definition at line 327 of file render_trav.h.

float NL3D::CTravCameraScene::Far [inherited]
 

Definition at line 75 of file trav_scene.h.

Referenced by NL3D::CWaterModel::computeClippedPoly(), NL3D::CTravCameraScene::setFrustum(), NL3D::CWaterModel::traverseRender(), and NL3D::CFlareModel::traverseRender().

float NL3D::CTravCameraScene::Left [inherited]
 

Definition at line 75 of file trav_scene.h.

Referenced by NL3D::CWaterModel::traverseRender(), and NL3D::CFlareModel::traverseRender().

bool NL3D::CRenderTrav::LightingSystemEnabled
 

Definition at line 162 of file render_trav.h.

Referenced by NL3D::CScene::enableLightingSystem().

CMeshBlockManager NL3D::CRenderTrav::MeshBlockManager
 

The manager of meshBlock. Used to add instances.

Definition at line 310 of file render_trav.h.

Referenced by traverse(), and NL3D::CTransformShape::traverseRender().

float NL3D::CTravCameraScene::Near [inherited]
 

Definition at line 75 of file trav_scene.h.

Referenced by NL3D::CWaterModel::computeClippedPoly(), NL3D::CTravCameraScene::setFrustum(), NL3D::CWaterModel::traverseRender(), and NL3D::CFlareModel::traverseRender().

COrderingTable<CTransform> NL3D::CRenderTrav::OrderOpaqueList [private]
 

Definition at line 324 of file render_trav.h.

Referenced by CRenderTrav(), and traverse().

CLayeredOrderingTable<CTransform> NL3D::CRenderTrav::OrderTransparentList [private]
 

Definition at line 325 of file render_trav.h.

Referenced by CRenderTrav(), and traverse().

bool NL3D::CTravCameraScene::Perspective [inherited]
 

Definition at line 76 of file trav_scene.h.

Referenced by NL3D::CTravCameraScene::setFrustum().

std::vector<CTransform*> NL3D::CRenderTrav::RenderList [private]
 

Definition at line 320 of file render_trav.h.

Referenced by addRenderModel(), CRenderTrav(), reserveRenderList(), and traverse().

float NL3D::CTravCameraScene::Right [inherited]
 

Definition at line 75 of file trav_scene.h.

Referenced by NL3D::CWaterModel::computeClippedPoly(), NL3D::CTravCameraScene::setFrustum(), NL3D::CWaterModel::traverseRender(), and NL3D::CFlareModel::traverseRender().

CScene* NL3D::CTraversal::Scene [inherited]
 

Definition at line 55 of file trav_scene.h.

Referenced by NL3D::CScene::CScene(), NL3D::CMeshMRMSkinnedGeom::profileSceneRender(), NL3D::CMeshMRMGeom::profileSceneRender(), and NL3D::CMeshGeom::profileSceneRender().

NLMISC::CRGBA NL3D::CRenderTrav::SunAmbient
 

Definition at line 167 of file render_trav.h.

Referenced by changeLightSetup(), CRenderTrav(), NL3D::CScene::getSunAmbient(), and NL3D::CScene::setSunAmbient().

NLMISC::CRGBA NL3D::CRenderTrav::SunDiffuse
 

Definition at line 167 of file render_trav.h.

Referenced by changeLightSetup(), CRenderTrav(), NL3D::CScene::getSunDiffuse(), and NL3D::CScene::setSunDiffuse().

NLMISC::CRGBA NL3D::CRenderTrav::SunSpecular
 

Definition at line 167 of file render_trav.h.

Referenced by changeLightSetup(), CRenderTrav(), NL3D::CScene::getSunSpecular(), and NL3D::CScene::setSunSpecular().

float NL3D::CTravCameraScene::Top [inherited]
 

Definition at line 75 of file trav_scene.h.

Referenced by NL3D::CWaterModel::computeClippedPoly(), NL3D::CWaterModel::traverseRender(), and NL3D::CFlareModel::traverseRender().

NLMISC::CMatrix NL3D::CTravCameraScene::ViewMatrix [inherited]
 

Definition at line 78 of file trav_scene.h.

Referenced by NL3D::CWaterModel::computeClippedPoly(), NL3D::CParticleSystemModel::doAnimate(), NL3D::CWaterModel::traverseRender(), and NL3D::CFlareModel::traverseRender().


The documentation for this class was generated from the following files:
Generated on Tue Mar 16 07:37:20 2004 for NeL by doxygen 1.3.6