#include <landscape.h>
Inheritance diagram for NL3D::CLandscape:

Limits:
If you use the tiles mapped on the patches, load the near bank file (.bank) and the far bank file (.farbank) by seralizing TileBank and TileFarBank with those files. Then call initTileBanks.
Nevrax France
Definition at line 141 of file landscape.h.
Accessors. | |
| const CZone * | getZone (sint zoneId) const |
| CZone * | getZone (sint zoneId) |
| void | getZoneList (std::vector< uint16 > &zoneIds) const |
| void | buildZoneName (sint zoneId, std::string &zoneName) |
| From an Id, return the name of the zone, in the form "150_EM", without extension. | |
Visual Collision system. | |
| void | addPatchBlocksInBBox (const CPatchIdentEx &paIdEx, const CAABBox &bbox, std::vector< CPatchBlockIdent > &paBlockIds) |
| void | addTrianglesInBBox (const CPatchIdentEx &paIdEx, const CAABBox &bbox, std::vector< CTrianglePatch > &triangles, uint8 tileTessLevel) const |
| CQuadGrid< CPatchIdentEx > | _PatchQuadGrid |
| The QuadGrid of patch. | |
| const float | _PatchQuadGridEltSize = 16 |
| const uint | _PatchQuadGridSize = 128 |
Dynamic ShadowMap | |
| void | appendToShadowPolyReceiver (CTessFace *face) |
| void | removeFromShadowPolyReceiver (CTessFace *face) |
| CShadowPolyReceiver | _ShadowPolyReceiver |
Allocators. | |
| void | deleteTessFace (CTessFace *f) |
| void | deleteTessFarVertex (CTessFarVertex *v) |
| void | deleteTessNearVertex (CTessNearVertex *v) |
| void | deleteTessVertex (CTessVertex *v) |
| void | deleteTileFace (CTileFace *tf) |
| void | deleteTileMaterial (CTileMaterial *tm) |
| CTessFace * | newTessFace () |
| CTessFarVertex * | newTessFarVertex () |
| CTessNearVertex * | newTessNearVertex () |
| CTessVertex * | newTessVertex () |
| CTileFace * | newTileFace () |
| CTileMaterial * | newTileMaterial () |
| CLandscapeFaceVectorManager | _FaceVectorManager |
| CTessBlock | _TessBlockModificationRoot |
| CBlockMemory< CTessFace > | TessFaceAllocator |
| CBlockMemory< CTessFarVertex > | TessFarVertexAllocator |
| CBlockMemory< CTessNearVertex > | TessNearVertexAllocator |
| CBlockMemory< CTessVertex > | TessVertexAllocator |
| CBlockMemory< CTileFace > | TileFaceAllocator |
| CBlockMemory< CTileMaterial > | TileMaterialAllocator |
DynamicLighting management | |
| CPatchDLMContextList * | getPatchDLMContextList () const |
| for CPatch. | |
| CTextureDLM * | getTextureDLM () const |
| for CPatch. | |
| CRGBA | _DLMGlobalVegetableColor |
| an approximate value used to simulate diffuse material of vegetables | |
| float | _DLMMaxAttEnd |
| Max AttEnd. | |
| CPatchDLMContextList * | _PatchDLMContextList |
| List of DLM Context. | |
| CRGBA | _PointLightDiffuseMaterial |
| The diffuse material of landscape, used for StaticPointLights and DynamicPointLights. | |
| NLMISC::CSmartPtr< ITexture > | _TextureDLM |
| The dynamic lightmap Texture. | |
[NOHEADER] | |
| const CTileVegetableDesc & | getTileVegetableDesc (uint16 tileId) |
| bool | _DriverOkForVegetable |
| Tells if the current dirver support vegetable. | |
| CTessList< CLandscapeVegetableBlock > | _VegetableBlockList |
| List of VegetableBlock, to be tested for creation each frame. | |
| CVegetableManager * | _VegetableManager |
| The VegetableManager. (ptr only for include speed). | |
| bool | _VegetableManagerEnabled |
| Tells if the Vegetable Managemnt is enabled. | |
UpdateLighting management | |
| void | linkPatchToNearUL (CPatch *patch) |
| Used by Patch to link/unlink from _ULRootNearPatch. | |
| void | unlinkPatchFromNearUL (CPatch *patch) |
| Used by Patch to link/unlink from _ULRootNearPatch. | |
| void | updateLightingTextureFar (float ratio) |
| Update All Far texture, given a ratio along total lumels. | |
| void | updateLightingTextureNear (float ratio) |
| Update All Near texture, given a ratio along total lumels. | |
| float | _ULFarPixelsToUpdate |
| Current number of far pixels to update. If negative, I have some advance. | |
| float | _ULFrequency |
| Frequency of update. | |
| uint | _ULNearCurrentTessBlockId |
| Current tessBlock id in the current patch processed. | |
| float | _ULNearPixelsToUpdate |
| Current number of near pixels to update. If negative, I have some advance. | |
| double | _ULPrecTime |
| Used by Patch to link/unlink from _ULRootNearPatch. | |
| bool | _ULPrecTimeInit |
| Used by Patch to link/unlink from _ULRootNearPatch. | |
| CPatch * | _ULRootNearPatch |
| The current patch rendered. | |
| CTextureFar * | _ULRootTextureFar |
| The current TextureFar rendered. | |
| double | _ULTime |
| Used by Patch to link/unlink from _ULRootNearPatch. | |
| sint | _ULTotalFarPixels |
| Far UpdateLighting. | |
| sint | _ULTotalNearPixels |
| Near UpdateLighting. | |
Public Member Functions | |
| CLandscape () | |
| Constructor. | |
| const sint & | getRefCount () const |
| ~CLandscape () | |
| Destructor. clear(). | |
Init/Build. | |
| bool | addZone (const CZone &newZone) |
| void | checkBinds (uint16 zoneId) throw (EBadBind) |
| Verify the binding of patchs of one zone. throw EBadBind if error. nop if zone not loaded. | |
| void | checkBinds () throw (EBadBind) |
| Verify the binding of patchs of all zones. throw EBadBind if error. | |
| void | clear () |
| Disconnect, and Delete all zones. | |
| void | init () |
| init the landscape VBuffers, texture cache etc... | |
| void | initTileBank () |
| Reinit the tile bank if the bank change. | |
| bool | initTileBanks () |
| bool | removeZone (uint16 zoneId) |
Lightmap get interface. | |
| void | appendTileLightInfluences (const CPatchIdent &patchId, const CUV &uv, std::vector< CPointLightInfluence > &pointLightList) const |
| Append lights under the position to pointLightList. Do nothing if invalid patchId. | |
| uint8 | getLumel (const CPatchIdent &patchId, const CUV &uv) const |
| Get the lumel under the position. return 255 if invalid patchId. | |
Render methods. | |
| void | averageTesselationVertices () |
| void | clip (const CVector &refineCenter, const std::vector< CPlane > &pyramid) |
| void | excludePatchFromRefineAll (sint zoneId, uint patch, bool exclude) |
| This is especially for Pacs. exlude a patch to be refineAll()ed. | |
| const CVector & | getOldRefineCenter () const |
| void | profileRender () |
| void | refine (const CVector &refineCenter) |
| void | refineAll (const CVector &refineCenter) |
| Refine/Geomorph ALL the tesselation of the landscape, from the view point refineCenter. Even if !RefineMode. | |
| void | render (const CVector &refineCenter, const CVector &frontVector, const CPlane pyramid[NL3D_TESSBLOCK_NUM_CLIP_PLANE], bool doTileAddPass=false) |
| void | setDriver (IDriver *drv) |
Collision methods. | |
| void | buildCollideFaces (sint zoneId, sint patch, std::vector< CTriangle > &faces) |
| void | buildCollideFaces (const CAABBoxExt &bbox, std::vector< CTriangle > &faces, bool faceSplit) |
| void | buildPatchBlocksInBBox (const CAABBox &bbox, std::vector< CPatchBlockIdent > &paBlockIds) |
| void | buildTrianglesInBBox (const CAABBox &bbox, std::vector< CTrianglePatch > &triangles, uint8 tileTessLevel) |
| void | fillPatchQuadBlock (CPatchQuadBlock &quadBlock) const |
| float | getCameraCollision (const CVector &start, const CVector &end, float radius, bool cone) |
| CVector | getTesselatedPos (const CPatchIdent &patchId, const CUV &uv) const |
| void | getTessellationLeaves (std::vector< const CTessFace * > &leaves) const |
Dynamic Lighting management | |
| void | computeDynamicLighting (const std::vector< CPointLight * > &pls) |
| CRGBA | getDLMGlobalVegetableColor () const |
| float | getDynamicLightingMaxAttEnd () const |
| uint | getDynamicLightingMemoryLoad () const |
| void | setDLMGlobalVegetableColor (CRGBA gvc) |
| void | setDynamicLightingMaxAttEnd (float maxAttEnd) |
| void | createVegetableBlendLayersModels (CScene *scene) |
| void | enableVegetable (bool enable) |
| uint | getNumVegetableFaceRendered () const |
| bool | isVegetableActive () const |
| void | loadVegetableTexture (const std::string &textureFileName) |
| void | setupColorsFromTileFlags (const NLMISC::CRGBA colors[4]) |
| void | setupVegetableLighting (const CRGBA &ambient, const CRGBA &diffuse, const CVector &directionalLight) |
| void | setVegetableTime (double time) |
| void | setVegetableUpdateLightingFrequency (float freq) |
| void | setVegetableUpdateLightingTime (double time) |
| void | setVegetableWind (const CVector &windDir, float windFreq, float windPower, float windBendMin) |
Lighting. | |
| void | enableAutomaticLighting (bool enable) |
| const CVector & | getAutomaticLightDir () const |
| return the light direction setuped in enableAutomaticLighting(). | |
| bool | getAutomaticLighting () const |
| return true if AutomaticLighting is enabled. | |
| CRGBA | getPointLightDiffuseMaterial () const |
| const CRGBA * | getStaticLight () const |
| void | initAnimatedLightIndex (const CScene &scene) |
| void | removeAllPointLights () |
| void | setPointLightDiffuseMaterial (CRGBA diffuse) |
| void | setPointLightFactor (const CScene &scene) |
| update the Light factor for all pointLights in All zones, according to scene LightGroups and AnimatedLights. | |
| void | setupAutomaticLightDir (const CVector &lightDir) |
| void | setupStaticLight (const CRGBA &diffuse, const CRGBA &ambiant, float multiply) |
Tile mgt. | |
| void | flushTiles (IDriver *drv, uint16 tileStart, uint16 nbTiles) |
| Force a range of tiles to be loaded in the driver... | |
| CTileElement * | getTileElement (const CPatchIdent &patchId, const CUV &uv) |
| Return the tile element for a patch at specific UV. UseFull for getting surface data. Return NULL if not found. | |
| NLMISC::CSmartPtr< ITexture > | getTileTexture (uint16 tileId, CTile::TBitmap bitmapType, CVector &uvScaleBias) |
| Return the texture for a tile Id. UseFull for Tile edition. | |
| void | releaseTiles (uint16 tileStart, uint16 nbTiles) |
| Force a range of tiles to be loaded in the driver... | |
HeightField DeltaZ. | |
| CVector | getHeightFieldDeltaZ (float x, float y) const |
| return the HeightField DeltaZ for the 2D position. (0,0,dZ) is returned. | |
| void | setHeightField (const CHeightMap &hf) |
Landscape Parameters. | |
| bool | getNoiseMode () const |
| bool | getRefineMode () const |
| float | getThreshold () const |
| Get threshold. | |
| uint | getTileMaxSubdivision () |
| Get Maximum Tile subdivision. | |
| float | getTileNear () const |
| Get tile near distance. | |
| void | invalidateAllTiles () |
| void | setNoiseMode (bool enabled) |
| Enable the noise or not. NB: only new tesselation computed is modified, so you should call it only at init time. | |
| void | setRefineMode (bool enabled) |
| void | setThreshold (float thre) |
| Set threshold for subdivsion quality. The lower is threshold, the more the landscape is subdivided. Default: 0.001. | |
| void | setTileMaxSubdivision (uint tileDiv) |
| Set Maximum Tile subdivision. Valid values must be in [0..4] (assert). Default is 0 (for now :) ). | |
| void | setTileNear (float tileNear) |
| Set tile near distance. Default 50.f. maximized to length of Far alpha transition). | |
Precision ZBuffer mgt. | |
| const CVector & | getPZBModelPosition () const |
| setPZBModelPosition() | |
| void | setPZBModelPosition (const CVector &pos) |
Tile added/removed callback | |
| ULandscapeTileCallback * | getTileCallback () const |
| void | setTileCallback (ULandscapeTileCallback *cb) |
Dynamic ShadowMap | |
| void | receiveShadowMap (IDriver *drv, CShadowMap *shadowMap, const CVector &casterPos, const CMaterial &shadowMat, const CVector &pzb) |
UpdateLighting management | |
| void | setUpdateLightingFrequency (float freq) |
| void | updateLighting (double time) |
| void | updateLightingAll () |
Data Fields | |
| sint | crefs |
| CLandscapeModel * | OwnerModel |
| CPtrInfo * | pinfo |
| CTileBank | TileBank |
| CTileFarBank | TileFarBank |
Static Public Attributes | |
| CPtrInfo | NullPtrInfo |
Private Types | |
| typedef std::vector< TSPRenderPass >::iterator | ItSPRenderPassVector |
| typedef TTileRdrPassSet::iterator | ItTileRdrPassSet |
| typedef TTileTextureMap::iterator | ItTileTextureMap |
| typedef NLMISC::CRefPtr< ITexture > | RPTexture |
| typedef NLMISC::CSmartPtr< CPatchRdrPass > | TSPRenderPass |
| typedef std::set< CPatchRdrPass > | TTileRdrPassSet |
| typedef std::map< std::string, RPTexture > | TTileTextureMap |
Private Member Functions | |
| void | checkZoneBinds (CZone &curZone, EBadBind &bindError) |
| void | clearFarRenderPass (CPatchRdrPass *pass) |
| bool | eraseTileFarIfNotGood (uint tileNumber, uint sizeOrder0, uint sizeOrder1, uint sizeOrder2) |
| CPatchRdrPass * | findTileRdrPass (const CPatchRdrPass &pass) |
| ITexture * | findTileTexture (const std::string &textName) |
| void | forceMergeAtTileLevel () |
| For changing TileMaxSubdivision. force tesselation to be under tile. | |
| void | freeFarRenderPass (CPatch *pPatch, CPatchRdrPass *pass, uint farIndex) |
| CPatchRdrPass * | getFarRenderPass (CPatch *pPatch, uint farIndex, float &far1UScale, float &far1VScale, float &far1UBias, float &far1VBias, bool &bRot) |
| CPatchRdrPass * | getTileRenderPass (uint16 tileId, bool additiveRdrPass) |
| void | getTileUvScaleBiasRot (uint16 tileId, CTile::TBitmap bitmapType, CVector &uvScaleBias, uint8 &rotAlpha) |
| void | loadTile (uint16 tileId) |
| void | lockBuffers () |
| void | releaseTile (uint16 tileId) |
| void | resetRenderFarAndDeleteVBFV () |
| void | synchronizeATIVBHards () |
| void | unlockBuffers () |
| void | updateGlobalsAndLockBuffers (const CVector &refineCenter) |
| void | updateTessBlocksFaceVector () |
| uint | getTileLightMap (CRGBA map[NL_TILE_LIGHTMAP_SIZE *NL_TILE_LIGHTMAP_SIZE], CPatchRdrPass *&lightmapRdrPass) |
| void | getTileLightMapUvInfo (uint tileLightMapId, CVector &uvScaleBias) |
| void | refillTileLightMap (uint tileLightMapId, CRGBA map[NL_TILE_LIGHTMAP_SIZE *NL_TILE_LIGHTMAP_SIZE]) |
| void | releaseTileLightMap (uint tileLightMapId) |
Private Attributes | |
| CVector | _AutomaticLightDir |
| bool | _AutomaticLighting |
| bool | _FarInitialized |
| float | _FarTransition |
| CHeightField | _HeightField |
| CRGBA | _LightValue [256] |
| uint | _NFreeLightMaps |
| bool | _RefineMode |
| std::vector< TSPRenderPass > | _TextureFars |
| std::vector< TSPRenderPass > | _TextureNears |
| float | _Threshold |
| ULandscapeTileCallback * | _TileCallback |
| float | _TileDistNear |
| uint | _TileMaxSubdivision |
| float | _VPThresholdChange |
| CMaterial | FarMaterial |
| std::vector< CTileInfo * > | TileInfos |
| CMaterial | TileMaterial |
| TTileRdrPassSet | TileRdrPassSet |
| TTileTextureMap | TileTextureMap |
| TZoneMap | Zones |
VertexBuffer mgt. | |
| CRefPtr< IDriver > | _Driver |
| CLandscapeVBAllocator | _Far0VB |
| CLandscapeVBAllocator | _Far1VB |
| bool | _RenderMustRefillVB |
| CLandscapeVBAllocator | _TileVB |
| bool | _VertexShaderOk |
| CTessFacePriorityList | _MergePriorityList |
| The priority list of faces which may need to merge. | |
| CVector | _OldRefineCenter |
| OldRefineCenter setuped in prec refine(). | |
| bool | _OldRefineCenterSetuped |
| The priority list of faces which may need to merge. | |
| CTessFacePListNode | _RootNewLeaves |
| newTessFace() append the face to _RootNewLeaves. | |
| CTessFacePriorityList | _SplitPriorityList |
| The priority list of faces which may need to split. | |
| bool | _NoiseEnabled |
Precision ZBuffer mgt. | |
| CVector | _PZBModelPosition |
| setPZBModelPosition() | |
Friends | |
| class | CPatch |
| struct | CPtrInfo |
| class | CTessFace |
| class | CZone |
|
|
Definition at line 781 of file landscape.h. |
|
|
Definition at line 731 of file landscape.h. Referenced by findTileRdrPass(), flushTiles(), releaseTiles(), and render(). |
|
|
Definition at line 728 of file landscape.h. |
|
|
Definition at line 726 of file landscape.h. |
|
|
Definition at line 732 of file landscape.h. Referenced by getFarRenderPass(), and getTileLightMap(). |
|
|
Definition at line 730 of file landscape.h. |
|
|
Definition at line 727 of file landscape.h. |
|
|
Constructor.
Definition at line 178 of file landscape.cpp. References _AutomaticLightDir, _AutomaticLighting, _DLMGlobalVegetableColor, _DLMMaxAttEnd, _DriverOkForVegetable, _FarInitialized, _FarTransition, _MergePriorityList, _NFreeLightMaps, _NoiseEnabled, _OldRefineCenter, _OldRefineCenterSetuped, _PatchDLMContextList, _PointLightDiffuseMaterial, _PZBModelPosition, _RefineMode, _RenderMustRefillVB, _SplitPriorityList, _TextureDLM, _Threshold, _TileCallback, _TileDistNear, _TileMaxSubdivision, _ULFarPixelsToUpdate, _ULFrequency, _ULNearCurrentTessBlockId, _ULNearPixelsToUpdate, _ULPrecTimeInit, _ULRootNearPatch, _ULRootTextureFar, _ULTotalFarPixels, _ULTotalNearPixels, _VegetableManager, _VegetableManagerEnabled, _VertexShaderOk, _VPThresholdChange, NL3D::CTessFacePriorityList::init(), initTileBank(), NL3D_LANDSCAPE_DLM_HEIGHT, NL3D_LANDSCAPE_DLM_WIDTH, NL3D_LANDSCAPE_VEGETABLE_MAX_AGP_VERTEX_LIGHTED, NL3D_LANDSCAPE_VEGETABLE_MAX_AGP_VERTEX_UNLIT, NL3D_REFINE_PLIST_DIST_MAX_MOD, NL3D_REFINE_PLIST_DIST_STEP, NL3D_REFINE_PLIST_NUM_ENTRIES, NL3D_REFINE_PLIST_SPLIT_NUMQUADRANT, NL3D_TESS_ALLOC_BLOCKSIZE, NL3D_TESSRDR_ALLOC_BLOCKSIZE, OwnerModel, NLMISC::CRGBA::set(), and setupStaticLight().
00178 : 00179 TessFaceAllocator(NL3D_TESS_ALLOC_BLOCKSIZE), 00180 TessVertexAllocator(NL3D_TESS_ALLOC_BLOCKSIZE), 00181 TessNearVertexAllocator(NL3D_TESSRDR_ALLOC_BLOCKSIZE), 00182 TessFarVertexAllocator(NL3D_TESSRDR_ALLOC_BLOCKSIZE), 00183 TileMaterialAllocator(NL3D_TESSRDR_ALLOC_BLOCKSIZE), 00184 TileFaceAllocator(NL3D_TESSRDR_ALLOC_BLOCKSIZE), 00185 _Far0VB(CLandscapeVBAllocator::Far0, "LandscapeFar0VB"), 00186 _Far1VB(CLandscapeVBAllocator::Far1, "LandscapeFar1VB"), 00187 _TileVB(CLandscapeVBAllocator::Tile, "LandscapeTileVB") 00188 { 00189 OwnerModel = NULL; 00190 00191 initTileBank(); 00192 00193 // Far texture not initialized till initTileBanks is not called 00194 _FarInitialized=false; 00195 00196 // Init far lighting with White/black 00197 setupStaticLight (CRGBA(255,255,255), CRGBA(0,0,0), 1.f); 00198 // Default material for pointLights 00199 _PointLightDiffuseMaterial= CRGBA::White; 00200 00201 _FarTransition= 10; // 10 meters. 00202 _TileDistNear=100.f; 00203 _Threshold= 0.001f; 00204 _RefineMode=true; 00205 00206 _TileMaxSubdivision= 0; 00207 00208 _NFreeLightMaps= 0; 00209 00210 // By default Automatic light comes from up. 00211 _AutomaticLighting = false; 00212 _AutomaticLightDir= -CVector::K; 00213 00214 // By default, noise is enabled. 00215 _NoiseEnabled= true; 00216 00217 // By default, we compute Geomorph and Alpha in software. 00218 _VertexShaderOk= false; 00219 _VPThresholdChange= false; 00220 00221 _RenderMustRefillVB= false; 00222 00223 // priority list. 00224 _OldRefineCenterSetuped= false; 00225 _SplitPriorityList.init(NL3D_REFINE_PLIST_DIST_STEP, NL3D_REFINE_PLIST_NUM_ENTRIES, NL3D_REFINE_PLIST_DIST_MAX_MOD, NL3D_REFINE_PLIST_SPLIT_NUMQUADRANT); 00226 // See updateRefine* Doc in tesselation.cpp for why the merge list do not need quadrants. 00227 _MergePriorityList.init(NL3D_REFINE_PLIST_DIST_STEP, NL3D_REFINE_PLIST_NUM_ENTRIES, NL3D_REFINE_PLIST_DIST_MAX_MOD, 0); 00228 // just for getTesselatedPos to work properly. 00229 _OldRefineCenter= CVector::Null; 00230 00231 // create / Init the vegetable manager. 00232 _VegetableManager= new CVegetableManager(NL3D_LANDSCAPE_VEGETABLE_MAX_AGP_VERTEX_UNLIT, NL3D_LANDSCAPE_VEGETABLE_MAX_AGP_VERTEX_LIGHTED); 00233 00234 // Init vegetable setup. 00235 _VegetableManagerEnabled= false; 00236 _DriverOkForVegetable= false; 00237 // default global vegetable color, used for dynamic lighting only (arbitrary). 00238 _DLMGlobalVegetableColor.set(180, 180, 180); 00239 00240 _PZBModelPosition= CVector::Null; 00241 00242 00243 // Default: no updateLighting. 00244 _ULFrequency= 0; 00245 _ULPrecTimeInit= false; 00246 // Default: no textureFar created. 00247 _ULTotalFarPixels= 0; 00248 _ULFarPixelsToUpdate= 0; 00249 _ULRootTextureFar= NULL; 00250 // Default: no patch created 00251 _ULTotalNearPixels= 0; 00252 _ULNearPixelsToUpdate= 0; 00253 _ULRootNearPatch= NULL; 00254 _ULNearCurrentTessBlockId= 0; 00255 00256 00257 // Dynamic Lighting. 00258 _TextureDLM= new CTextureDLM(NL3D_LANDSCAPE_DLM_WIDTH, NL3D_LANDSCAPE_DLM_HEIGHT); 00259 _PatchDLMContextList= new CPatchDLMContextList; 00260 _DLMMaxAttEnd= 30.f; 00261 00262 00263 // Alloc some global space for tri rendering. 00264 if( CLandscapeGlobals::PassTriArray.size() < 1000 ) 00265 CLandscapeGlobals::PassTriArray.resize( 1000 ); 00266 00267 _TileCallback = NULL; 00268 00269 } |
|
|
Destructor. clear().
Definition at line 271 of file landscape.cpp. References _PatchDLMContextList, _TextureDLM, _VegetableManager, and clear().
00272 {
00273 clear();
00274
00275 // release the VegetableManager.
00276 delete _VegetableManager;
00277 _VegetableManager= NULL;
00278
00279 // Dynamic Lighting.
00280 // smartPtr delete
00281 _TextureDLM= NULL;
00282 delete _PatchDLMContextList;
00283 _PatchDLMContextList= NULL;
00284 }
|
|
||||||||||||||||
|
private version of buildPatchBlocksInBBox, searching only for one patch. Definition at line 2327 of file landscape.cpp. References NL3D::CPatch::addPatchBlocksInBBox(), NL3D::CLandscape::CPatchIdentEx::Patch, NL3D::CPatchIdent::PatchId, and NL3D::CPatchIdent::ZoneId. Referenced by buildPatchBlocksInBBox().
02328 {
02329 // No clear here, just add blocks to the array.
02330 const CPatch *pa= paIdEx.Patch;
02331
02332 CPatchIdent paId;
02333 paId.ZoneId= paIdEx.ZoneId;
02334 paId.PatchId= paIdEx.PatchId;
02335 pa->addPatchBlocksInBBox(paId, bbox, paBlockIds);
02336 }
|
|
||||||||||||||||||||
|
This method search only on the given patch. NB: this method use a convex hull subdivion to search in O(logn) what part of the patch to insert.
Definition at line 2294 of file landscape.cpp. References NL3D::CPatch::addTrianglesInBBox(), NL3D::CLandscape::CPatchIdentEx::Patch, NL3D::CPatchIdent::PatchId, uint8, and NL3D::CPatchIdent::ZoneId. Referenced by buildTrianglesInBBox().
02295 {
02296 // No clear here, just add triangles to the array.
02297 const CPatch *pa= paIdEx.Patch;
02298
02299 CPatchIdent paId;
02300 paId.ZoneId= paIdEx.ZoneId;
02301 paId.PatchId= paIdEx.PatchId;
02302 pa->addTrianglesInBBox(paId, bbox, triangles, tileTessLevel);
02303 }
|
|
|
Add a zone which should be builded (or loaded), but not compiled. CLandscape compile it. The contents of newZone are copied into the landscape.
Definition at line 385 of file landscape.cpp. References _PatchQuadGrid, NL3D::CZone::_PointLightArray, NL3D::CZone::applyHeightField(), NL3D::CZone::build(), NL3D::CPatch::buildBBox(), NL3D::CZone::compile(), NLMISC::CAABBoxExt::getAABBox(), NLMISC::CAABBox::getHalfSize(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), NL3D::CZone::getNumPatchs(), NL3D::CTransform::getOwnerScene(), NL3D::CZone::getZoneBB(), NL3D::CZone::getZoneId(), NLMISC::CAABBox::include(), NL3D::CPointLightNamedArray::initAnimatedLightIndex(), NL3D::CQuadGrid< CPatchIdentEx >::insert(), nlassert, OwnerModel, NL3D::CLandscape::CPatchIdentEx::Patch, NL3D::CPatchIdent::PatchId, NLMISC::CAABBox::setHalfSize(), NL3D::CPointLightNamedArray::setPointLightFactor(), sint, uint16, unlockBuffers(), updateGlobalsAndLockBuffers(), updateTessBlocksFaceVector(), NL3D::CPatchIdent::ZoneId, and Zones. Referenced by NL3D::CLandscapeUser::loadAllZonesAround(), and NL3D::CLandscapeUser::refreshZonesAround().
00386 {
00387 // -1. Update globals
00388 updateGlobalsAndLockBuffers (CVector::Null);
00389 // NB: adding a zone may add vertices in VB in visible patchs (because of binds)=> buffers are locked.
00390
00391 uint16 zoneId= newZone.getZoneId();
00392
00393 if(Zones.find(zoneId)!=Zones.end())
00394 {
00395 unlockBuffers();
00396 return false;
00397 }
00398 CZone *zone= new CZone;
00399
00400 // copy zone.
00401 zone->build(newZone);
00402
00403 // Affect the current lighting of pointLight to the zone.
00404 if (OwnerModel)
00405 {
00406 CScene *scene = OwnerModel->getOwnerScene();
00407 zone->_PointLightArray.initAnimatedLightIndex(*scene);
00408 zone->_PointLightArray.setPointLightFactor(*scene);
00409 }
00410
00411 // apply the landscape heightField, modifying BBoxes.
00412 zone->applyHeightField(*this);
00413
00414 // compile the zone for this landscape.
00415 zone->compile(this, Zones);
00416
00417 // For test of _PatchQuadGrid erase.
00418 CAABBox zoneBBForErase= zone->getZoneBB().getAABBox();
00419 // Avoid precision problems by enlarging a little bbox size of zone for erase
00420 zoneBBForErase.setHalfSize( zoneBBForErase.getHalfSize() * 1.1f);
00421
00422 // add patchs of this zone to the quadgrid.
00423 for(sint i= 0; i<zone->getNumPatchs(); i++)
00424 {
00425 const CPatch *pa= ((const CZone*)zone)->getPatch(i);
00426 CPatchIdentEx paId;
00427 paId.ZoneId= zoneId;
00428 paId.PatchId= i;
00429 paId.Patch= pa;
00430 CAABBox bb= pa->buildBBox();
00431 _PatchQuadGrid.insert(bb.getMin(), bb.getMax(), paId);
00432 // NB: the bbox of zone is used to remove patch. Hence it is VERY important that zoneBBox includes
00433 // all patchs bbox (else some patchs entries may not be deleted in removeZone()).
00434 nlassert(zoneBBForErase.include(bb));
00435 }
00436
00437 // Must realase VB Buffers
00438 unlockBuffers();
00439
00440 // Because bind may add faces in other (visible) zones because of enforced split, we must check
00441 // and update any FaceVector.
00442 updateTessBlocksFaceVector();
00443
00444 return true;
00445 }
|
|
||||||||||||||||
|
Append lights under the position to pointLightList. Do nothing if invalid patchId.
Definition at line 3273 of file landscape.cpp. References NL3D::CPatch::appendTileLightInfluences(), nlassert, NL3D::CPatchIdent::PatchId, sint, uint16, NL3D::CPatchIdent::ZoneId, and Zones.
03275 {
03276 // \todo yoyo: TODO_ZONEID: change ZoneId in 32 bits...
03277 std::map<uint16, CZone*>::const_iterator it= Zones.find((uint16)patchId.ZoneId);
03278 if(it!=Zones.end())
03279 {
03280 sint N= (*it).second->getNumPatchs();
03281 // patch must exist in the zone.
03282 nlassert(patchId.PatchId<N);
03283 const CPatch *pa= const_cast<const CZone*>((*it).second)->getPatch(patchId.PatchId);
03284
03285 pa->appendTileLightInfluences(uv, pointLightList);
03286 }
03287 }
|
|
|
Definition at line 3658 of file landscape.cpp. References _ShadowPolyReceiver, NL3D::CShadowPolyReceiver::addTriangle(), NL3D::CTessVertex::EndPos, NL3D::CTessFace::ShadowMapTriId, NLMISC::CTriangle::V0, NLMISC::CTriangle::V1, NLMISC::CTriangle::V2, NL3D::CTessFace::VBase, NL3D::CTessFace::VLeft, and NL3D::CTessFace::VRight. Referenced by NL3D::CPatch::appendFaceToTileRenderList().
03659 {
03660 CTriangle tri;
03661 tri.V0= face->VBase->EndPos;
03662 tri.V1= face->VLeft->EndPos;
03663 tri.V2= face->VRight->EndPos;
03664 // Add and store id for remove
03665 face->ShadowMapTriId= _ShadowPolyReceiver.addTriangle(tri);
03666 }
|
|
|
This is especially for Pacs. Each Vertex->EndPos which is not a corner of a patch is set to the mean of its 2 shared Patchs. NB: Works with special cases of rectangular patchs and binded patchs. Definition at line 772 of file landscape.cpp. References _TessBlockModificationRoot, NL3D::CTessBlock::getNextToModify(), NL3D::ItZoneMap, nlassert, unlockBuffers(), updateGlobalsAndLockBuffers(), updateTessBlocksFaceVector(), and Zones.
00773 {
00774 // -1. Update globals
00775 updateGlobalsAndLockBuffers (CVector::Null);
00776 // NB: averageTesselationVertices may change vertices in VB in visible patchs => buffers are locked.
00777
00778 // Increment the update date.
00779 CLandscapeGlobals::CurrentDate++;
00780
00781 for(ItZoneMap it= Zones.begin();it!=Zones.end();it++)
00782 {
00783 (*it).second->averageTesselationVertices();
00784 }
00785
00786 // Must realase VB Buffers
00787 unlockBuffers();
00788
00789 // averageTesselationVertices() should not cause change in faces in any patchs.
00790 // It should not happens, but check for security.
00791 nlassert(_TessBlockModificationRoot.getNextToModify()==NULL);
00792 updateTessBlocksFaceVector();
00793
00794 }
|
|
||||||||||||||||
|
Build the set of faces of landscape, from a certain patch. Usefull for collisions. Triangles are built first in S then T order. There is two triangles by tiles. So the number of triangles for a patch is 2*OrderS*OrderT. Definition at line 2456 of file landscape.cpp. References NL3D::CPatch::computeVertex(), NL3D::CPatch::getOrderS(), NL3D::CPatch::getOrderT(), NL3D::ItZoneMap, nlassert, sint, NLMISC::CTriangle::V0, NLMISC::CTriangle::V1, NLMISC::CTriangle::V2, x, y, and Zones.
02457 {
02458 faces.clear();
02459
02460 ItZoneMap it= Zones.find(zoneId);
02461 if(it!=Zones.end())
02462 {
02463 // Then trace all patch.
02464 sint N= (*it).second->getNumPatchs();
02465 nlassert(patch>=0);
02466 nlassert(patch<N);
02467 const CPatch *pa= const_cast<const CZone*>((*it).second)->getPatch(patch);
02468
02469 // Build the faces.
02470 //=================
02471 sint ordS= pa->getOrderS();
02472 sint ordT= pa->getOrderT();
02473 sint x,y;
02474 float OOS= 1.0f/ordS;
02475 float OOT= 1.0f/ordT;
02476 for(y=0;y<ordT;y++)
02477 {
02478 for(x=0;x<ordS;x++)
02479 {
02480 CTriangle f;
02481 f.V0= pa->computeVertex(x*OOS, y*OOT);
02482 f.V1= pa->computeVertex(x*OOS, (y+1)*OOT);
02483 f.V2= pa->computeVertex((x+1)*OOS, (y+1)*OOT);
02484 faces.push_back(f);
02485 f.V0= pa->computeVertex(x*OOS, y*OOT);
02486 f.V1= pa->computeVertex((x+1)*OOS, (y+1)*OOT);
02487 f.V2= pa->computeVertex((x+1)*OOS, y*OOT);
02488 faces.push_back(f);
02489 }
02490 }
02491 }
02492 }
|
|
||||||||||||||||
|
Build the set of faces of landscape, which are IN a bbox. Usefull for collisions. The faces are builded at Tile level (2m*2m).
Definition at line 2380 of file landscape.cpp. References NL3D::CPatch::computeVertex(), NLMISC::CAABBoxExt::getCenter(), NL3D::CPatch::getOrderS(), NL3D::CPatch::getOrderT(), NLMISC::CAABBoxExt::getRadius(), NLMISC::CAABBoxExt::intersect(), NLMISC::CBSphere::intersect(), NL3D::ItZoneMap, sint, NLMISC::CTriangle::V0, NLMISC::CTriangle::V1, NLMISC::CTriangle::V2, x, y, and Zones.
02381 {
02382 CBSphere bsWanted(bbox.getCenter(), bbox.getRadius());
02383
02384 faces.clear();
02385 // For all zones.
02386 for(ItZoneMap it= Zones.begin();it!=Zones.end();it++)
02387 {
02388 const CAABBoxExt &bb= (*it).second->getZoneBB();
02389 CBSphere bs(bb.getCenter(), bb.getRadius());
02390 // If zone intersect the wanted area.
02391 //===================================
02392 if(bs.intersect(bsWanted))
02393 {
02394 // Then trace all patch.
02395 sint N= (*it).second->getNumPatchs();
02396 for(sint i=0;i<N;i++)
02397 {
02398 const CPatch *pa= const_cast<const CZone*>((*it).second)->getPatch(i);
02399
02400 // If patch in wanted area....
02401 //============================
02402 if(bsWanted.intersect((*it).second->getPatchBSphere(i)))
02403 {
02404 // 0. Build the faces.
02405 //====================
02406 sint ordS= pa->getOrderS();
02407 sint ordT= pa->getOrderT();
02408 sint x,y,j;
02409 vector<CTriangle> tmpFaces;
02410 tmpFaces.reserve(ordS*ordT);
02411 float OOS= 1.0f/ordS;
02412 float OOT= 1.0f/ordT;
02413 for(y=0;y<ordT;y++)
02414 {
02415 for(x=0;x<ordS;x++)
02416 {
02417 CTriangle f;
02418 f.V0= pa->computeVertex(x*OOS, y*OOT);
02419 f.V1= pa->computeVertex(x*OOS, (y+1)*OOT);
02420 f.V2= pa->computeVertex((x+1)*OOS, (y+1)*OOT);
02421 tmpFaces.push_back(f);
02422 f.V0= pa->computeVertex(x*OOS, y*OOT);
02423 f.V1= pa->computeVertex((x+1)*OOS, (y+1)*OOT);
02424 f.V2= pa->computeVertex((x+1)*OOS, y*OOT);
02425 tmpFaces.push_back(f);
02426 }
02427 }
02428
02429 // 1. Clip the faces.
02430 //===================
02431 if(faceClip)
02432 {
02433 // Insert only faces which are In the area.
02434 for(j=0;j<(sint)tmpFaces.size();j++)
02435 {
02436 CTriangle &f= tmpFaces[j];
02437 if(bbox.intersect(f.V0, f.V1, f.V2))
02438 {
02439 faces.push_back(f);
02440 }
02441 }
02442 }
02443 else
02444 {
02445 // Else insert ALL.
02446 faces.insert(faces.end(), tmpFaces.begin(), tmpFaces.end());
02447 }
02448 }
02449 }
02450 }
02451 }
02452 }
|
|
||||||||||||
|
Same as buildTrianglesInBBox(), but fill blockId instead of raw triangles. NB: this method use first a quadgrid to locate patchs of interest, then for each patch, it uses a convex hull subdivion to search in O(logn) what part of the patch to insert.
Definition at line 2340 of file landscape.cpp. References _PatchQuadGrid, addPatchBlocksInBBox(), NL3D::CQuadGrid< CPatchIdentEx >::begin(), NL3D::CQuadGrid< CPatchIdentEx >::clearSelection(), NL3D::CQuadGrid< CPatchIdentEx >::end(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), and NL3D::CQuadGrid< CPatchIdentEx >::select().
02341 {
02342 // clear selection.
02343 paBlockIds.clear();
02344
02345 // search path of interest.
02346 _PatchQuadGrid.clearSelection();
02347 _PatchQuadGrid.select(bbox.getMin(), bbox.getMax());
02348 CQuadGrid<CPatchIdentEx>::CIterator it;
02349
02350 // for each patch, add blocks to the array.
02351 for(it= _PatchQuadGrid.begin(); it!= _PatchQuadGrid.end(); it++)
02352 {
02353 addPatchBlocksInBBox((*it), bbox, paBlockIds);
02354 }
02355 }
|
|
||||||||||||||||
|
method relatively identical than buildCollideFaces(bbox....). Differences below: NB: this method use first a quadgrid to locate patchs of interest, then for each patch, it uses a convex hull subdivion to search in O(logn) what part of the patch to insert.
Definition at line 2307 of file landscape.cpp. References _PatchQuadGrid, addTrianglesInBBox(), NL3D::CQuadGrid< CPatchIdentEx >::begin(), NL3D::CQuadGrid< CPatchIdentEx >::clearSelection(), NL3D::CQuadGrid< CPatchIdentEx >::end(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), NL3D::CQuadGrid< CPatchIdentEx >::select(), and uint8.
02308 {
02309 // clear selection.
02310 triangles.clear();
02311
02312 // search path of interest.
02313 _PatchQuadGrid.clearSelection();
02314 _PatchQuadGrid.select(bbox.getMin(), bbox.getMax());
02315 CQuadGrid<CPatchIdentEx>::CIterator it;
02316
02317 // for each patch, add triangles to the array.
02318 for(it= _PatchQuadGrid.begin(); it!= _PatchQuadGrid.end(); it++)
02319 {
02320 addTrianglesInBBox((*it), bbox, triangles, tileTessLevel);
02321 }
02322 }
|
|
||||||||||||
|
From an Id, return the name of the zone, in the form "150_EM", without extension.
Definition at line 513 of file landscape.cpp.
|
|
|
Verify the binding of patchs of one zone. throw EBadBind if error. nop if zone not loaded.
Definition at line 2277 of file landscape.cpp. References NL3D::EBadBind::BindErrors, NL3D::ItZoneMap, and uint16.
02278 {
02279 EBadBind bindError;
02280
02281 ItZoneMap it= Zones.find(zoneId);
02282 if(it!= Zones.end())
02283 {
02284 CZone &curZone= *(*it).second;
02285 checkZoneBinds(curZone, bindError);
02286 if(!bindError.BindErrors.empty())
02287 throw bindError;
02288 }
02289 }
|
|
|
Verify the binding of patchs of all zones. throw EBadBind if error.
Definition at line 2261 of file landscape.cpp. References NL3D::EBadBind::BindErrors, and NL3D::ItZoneMap. Referenced by NL3D::CLandscapeUser::loadAllZonesAround(), and NL3D::CLandscapeUser::refreshZonesAround().
02262 {
02263 EBadBind bindError;
02264
02265 for(ItZoneMap it= Zones.begin();it!=Zones.end();it++)
02266 {
02267 CZone &curZone= *(*it).second;
02268 checkZoneBinds(curZone, bindError);
02269 }
02270
02271 if(!bindError.BindErrors.empty())
02272 throw bindError;
02273 }
|
|
||||||||||||
|
Definition at line 2232 of file landscape.cpp. References NL3D::CZone::CPatchConnect::BindEdges, NL3D::EBadBind::BindErrors, NL3D::CPatchInfo::CBindInfo::Edge, NL3D::CZone::getNumPatchs(), NL3D::CZone::getPatchConnect(), getZone(), NL3D::CZone::getZoneId(), NL3D::CPatchInfo::CBindInfo::Next, NL3D::CPatchInfo::CBindInfo::NPatchs, sint, and NL3D::CPatchInfo::CBindInfo::ZoneId.
02233 {
02234 for(sint i=0;i<curZone.getNumPatchs();i++)
02235 {
02236 const CZone::CPatchConnect &pa= *curZone.getPatchConnect(i);
02237
02238 // Check the bindInfos.
02239 for(sint j=0;j<4;j++)
02240 {
02241 const CPatchInfo::CBindInfo &bd=pa.BindEdges[j];
02242 // Just 1/1 for now.
02243 if(bd.NPatchs==1)
02244 {
02245 CZone *oZone= getZone(bd.ZoneId);
02246 // If loaded zone.
02247 if(oZone)
02248 {
02249 const CZone::CPatchConnect &po= *(oZone->getPatchConnect(bd.Next[0]));
02250 const CPatchInfo::CBindInfo &bo= po.BindEdges[bd.Edge[0]];
02251 if(bo.NPatchs!=1 || bo.Next[0]!=i || bo.Edge[0]!=j)
02252 bindError.BindErrors.push_back( EBadBind::CBindError(curZone.getZoneId(), i));
02253 }
02254 }
02255 }
02256 }
02257 }
|
|
|
Disconnect, and Delete all zones.
Definition at line 522 of file landscape.cpp. References _Far0VB, _Far1VB, _PatchQuadGrid, _TextureFars, _TileVB, NL3D::CLandscapeVBAllocator::clear(), NL3D::CQuadGrid< CPatchIdentEx >::clear(), clearFarRenderPass(), getZoneList(), ItSPRenderPassVector, nlverify, removeZone(), and sint. Referenced by NL3D::CLandscapeUser::removeAllZones(), and ~CLandscape().
00523 {
00524 // Build the list of zoneId.
00525 vector<uint16> zoneIds;
00526 getZoneList(zoneIds);
00527
00528 // Remove each zone one by one.
00529 sint i;
00530 for(i=0;i<(sint)zoneIds.size();i++)
00531 {
00532 nlverify(removeZone(zoneIds[i]));
00533 }
00534
00535 // ensure the quadgrid is empty.
00536 _PatchQuadGrid.clear();
00537
00538
00539 // If not done, delete all VBhards allocated.
00540 _Far0VB.clear();
00541 _Far1VB.clear();
00542 _TileVB.clear();
00543
00544
00545 // Reset All Far Texture and unlink _ULRootTextureFar ciruclarList.
00546 ItSPRenderPassVector itFar= _TextureFars.begin();
00547 // unitl set is empty
00548 while( itFar != _TextureFars.end() )
00549 {
00550 // erase with link update.
00551 clearFarRenderPass(*itFar);
00552 itFar++;
00553 }
00554 // delete all
00555 _TextureFars.clear();
00556
00557
00558 // reset driver.
00559 _Driver= NULL;
00560 }
|
|
|
Definition at line 2176 of file landscape.cpp. References _ULRootTextureFar, NL3D::CTextureFar::getNextUL(), NL3D::CPatchRdrPass::TextureDiffuse, and NL3D::CTextureFar::unlinkUL(). Referenced by clear().
02177 {
02178 // Before deleting, must remove TextureFar from UpdateLighting list.
02179
02180 // Get a pointer on the diffuse far texture
02181 CTextureFar *pTextureFar=(CTextureFar*)(&*(pass->TextureDiffuse));
02182
02183 // If I delete the textureFar which is the current root
02184 if(_ULRootTextureFar==pTextureFar)
02185 {
02186 // switch to next
02187 _ULRootTextureFar= pTextureFar->getNextUL();
02188 // if still the same, it means that the circular list is now empty
02189 if(_ULRootTextureFar==pTextureFar)
02190 _ULRootTextureFar= NULL;
02191 }
02192
02193 // unlink the texture from list
02194 pTextureFar->unlinkUL();
02195 }
|
|
||||||||||||
|
Clip the landscape according to frustum. Planes must be normalized. Definition at line 583 of file landscape.cpp. References _TessBlockModificationRoot, NL3D::CTessBlock::getNextToModify(), NL3D::ItZoneMap, nlassert, unlockBuffers(), updateGlobalsAndLockBuffers(), updateTessBlocksFaceVector(), and Zones. Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape().
00584 {
00585 // -1. Update globals
00586 updateGlobalsAndLockBuffers (refineCenter);
00587 // NB: clip may add/remove vertices in VB in visible patchs => buffers are locked.
00588
00589
00590 for(ItZoneMap it= Zones.begin();it!=Zones.end();it++)
00591 {
00592 (*it).second->clip(pyramid);
00593 }
00594
00595 // Must realase VB Buffers
00596 unlockBuffers();
00597
00598 // clip() should not cause change in faces in visible patchs.
00599 // It should not happens, but check for security.
00600 nlassert(_TessBlockModificationRoot.getNextToModify()==NULL);
00601 updateTessBlocksFaceVector();
00602
00603 }
|
|
|
Compute dynamic lightmaps
Definition at line 3489 of file landscape.cpp. References _DLMMaxAttEnd, _PatchDLMContextList, _PatchQuadGrid, _PointLightDiffuseMaterial, NL3D::CPatchDLMPointLight::BBox, NL3D::CQuadGrid< CPatchIdentEx >::begin(), NL3D::CTessList< CPatchDLMContext >::begin(), NL3D::CPatch::beginDLMLighting(), NL3D::CPatchDLMPointLight::BSphere, NL3D::CQuadGrid< CPatchIdentEx >::clearSelection(), NL3D::CQuadGrid< CPatchIdentEx >::end(), NL3D::CPatch::endDLMLighting(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), NL3D::CPatchDLMContext::getPatch(), NL3D::CZone::getPatchBSphere(), NL3D::CPatch::getPatchId(), NL3D::CPatch::getZone(), NLMISC::CBSphere::intersect(), NL3D::CTessNodeList::Next, NL3D::CQuadGrid< CPatchIdentEx >::select(), uint, unlockBuffers(), and updateGlobalsAndLockBuffers(). Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape().
03490 {
03491 uint i;
03492
03493 // Update globals, and lock buffers
03494 //====================
03495 updateGlobalsAndLockBuffers (CVector::Null);
03496 // NB: averageTesselationVertices may change vertices in VB in visible patchs => buffers are locked.
03497
03498
03499 // Run all DLM Context create, to init Lighting process.
03500 //===============
03501 CPatchDLMContext *ctxPtr= _PatchDLMContextList->begin();
03502 while(ctxPtr!=NULL)
03503 {
03504 // init lighting process, do differential from last computeDynamicLighting()
03505 ctxPtr->getPatch()->beginDLMLighting();
03506
03507 // next
03508 ctxPtr= (CPatchDLMContext*)ctxPtr->Next;
03509 }
03510
03511
03512 // compile all pointLights
03513 //===============
03514 static vector<CPatchDLMPointLight> dlmPls;
03515 dlmPls.resize(pls.size());
03516 for(i=0;i<dlmPls.size();i++)
03517 {
03518 // compile the pl.
03519 dlmPls[i].compile(*pls[i], _PointLightDiffuseMaterial, _DLMMaxAttEnd);
03520 }
03521
03522
03523 // For all pointLight, intersect patch.
03524 //===============
03525 for(i=0;i<dlmPls.size();i++)
03526 {
03527 CPatchDLMPointLight &pl= dlmPls[i];
03528
03529 // search patchs of interest: those which interssect the pointLight
03530 _PatchQuadGrid.clearSelection();
03531 _PatchQuadGrid.select(pl.BBox.getMin(), pl.BBox.getMax());
03532 CQuadGrid<CPatchIdentEx>::CIterator it;
03533
03534 // for each patch, light it with the light.
03535 for(it= _PatchQuadGrid.begin(); it!= _PatchQuadGrid.end(); it++)
03536 {
03537 // get the patch
03538 const CPatch *pa= (*it).Patch;
03539
03540 // More precise clipping:
03541 if( pa->getZone()->getPatchBSphere(pa->getPatchId()).intersect( pl.BSphere ) )
03542 {
03543 // Ok, light the patch with this spotLight
03544 const_cast<CPatch*>(pa)->processDLMLight(pl);
03545 }
03546 }
03547
03548 }
03549
03550
03551 // Run all DLM Context create, to end Lighting process.
03552 //===============
03553 ctxPtr= _PatchDLMContextList->begin();
03554 while(ctxPtr!=NULL)
03555 {
03556 // get enxt now, because the DLM itself may be deleted in endDLMLighting()
03557 CPatchDLMContext *next= (CPatchDLMContext*)ctxPtr->Next;
03558
03559 // delete the DLM if no more needed (near don't use nor pointLights)
03560 ctxPtr->getPatch()->endDLMLighting();
03561
03562 // next
03563 ctxPtr= next;
03564 }
03565
03566
03567 // Must realase VB Buffers
03568 //====================
03569 unlockBuffers();
03570
03571 }
|
|
|
init the vegetable layer models in the CScene (see CVegetableManager). NB: MOT stuff (called by CLandscapeModel), don't use it. Definition at line 3225 of file landscape.cpp. References _VegetableManager, and NL3D::CVegetableManager::createVegetableBlendLayersModels(). Referenced by NL3D::CLandscapeModel::initModel().
03226 {
03227 _VegetableManager->createVegetableBlendLayersModels(scene);
03228 }
|
|
|
Definition at line 3052 of file landscape.cpp. References NLMISC::CBlockMemory< CTessFace >::free(), TessFaceAllocator, and NL3D::CTessFacePListNode::unlinkInPList(). Referenced by NL3D::CTessFace::doMerge(), and NL3D::CPatch::release().
03053 {
03054 // for refine() mgt, must remove from refine priority list, or from the temp rootTessFaceToUpdate list.
03055 f->unlinkInPList();
03056
03057 TessFaceAllocator.free(f);
03058 }
|
|
|
Definition at line 3073 of file landscape.cpp. References NLMISC::CBlockMemory< CTessFarVertex >::free(), TessFarVertexAllocator, and v. Referenced by NL3D::CTessFace::doMerge().
03074 {
03075 TessFarVertexAllocator.free(v);
03076 }
|
|
|
Definition at line 3067 of file landscape.cpp. References NLMISC::CBlockMemory< CTessNearVertex >::free(), TessNearVertexAllocator, and v. Referenced by NL3D::CTessFace::deleteTileUv().
03068 {
03069 TessNearVertexAllocator.free(v);
03070 }
|
|
|
Definition at line 3061 of file landscape.cpp. References NLMISC::CBlockMemory< CTessVertex >::free(), TessVertexAllocator, and v. Referenced by NL3D::CTessFace::doMerge(), and NL3D::CTessFace::updateBindAndSplit().
03062 {
03063 TessVertexAllocator.free(v);
03064 }
|
|
|
Definition at line 3085 of file landscape.cpp. References NLMISC::CBlockMemory< CTileFace >::free(), and TileFaceAllocator. Referenced by NL3D::CTessFace::deleteTileFaces().
03086 {
03087 TileFaceAllocator.free(tf);
03088 }
|
|
|
Definition at line 3079 of file landscape.cpp. References NLMISC::CBlockMemory< CTileMaterial >::free(), and TileMaterialAllocator. Referenced by NL3D::CTessFace::releaseTileMaterial().
03080 {
03081 TileMaterialAllocator.free(tm);
03082 }
|
|
|
Enable automatic near lightmap computing. use setupStaticLight(). Default is disabled. NB: calling this method won't flush all texture near already computed. Definition at line 2684 of file landscape.cpp. References _AutomaticLighting.
02685 {
02686 _AutomaticLighting= enable;
02687 }
|
|
|
enable the vegetable management in landscape. Valid only if VertexShader is OK. if true, register TileBank vegetables Shape to manager. Definition at line 3120 of file landscape.cpp. References _VegetableManager, _VegetableManagerEnabled, NL3D::CPatch::deleteAllVegetableIgs(), NL3D::CTileBank::initTileVegetableDescs(), NL3D::ItZoneMap, NL3D::CPatch::recreateAllVegetableIgs(), sint, TileBank, and Zones. Referenced by NL3D::CLandscapeUser::enableVegetable().
03121 {
03122 _VegetableManagerEnabled= enable;
03123
03124 // if false, delete all Vegetable IGs.
03125 if(!_VegetableManagerEnabled)
03126 {
03127 // Landscape always create ClipBlokcs, but IGs/addInstances() are created only if isVegetableActive().
03128 // For all zones.
03129 for(ItZoneMap it= Zones.begin();it!=Zones.end();it++)
03130 {
03131 // for all patch.
03132 sint N= (*it).second->getNumPatchs();
03133 for(sint i=0;i<N;i++)
03134 {
03135 // delete vegetable Igs of this patch
03136 CPatch *pa= ((*it).second)->getPatch(i);
03137 pa->deleteAllVegetableIgs();
03138 }
03139
03140 }
03141 }
03142 // if true
03143 else
03144 {
03145 // reload all Shapes (actually load only new shapes)
03146 TileBank.initTileVegetableDescs(_VegetableManager);
03147
03148 // And recreate vegetable igs.
03149 // Landscape always create ClipBlokcs, but IGs/addInstances() are created only if isVegetableActive().
03150 // For all zones.
03151 for(ItZoneMap it= Zones.begin();it!=Zones.end();it++)
03152 {
03153 // for all patch.
03154 sint N= (*it).second->getNumPatchs();
03155 for(sint i=0;i<N;i++)
03156 {
03157 // recreate vegetable Igs of this patch
03158 CPatch *pa= ((*it).second)->getPatch(i);
03159 pa->recreateAllVegetableIgs();
03160 }
03161
03162 }
03163 }
03164
03165 }
|
|
||||||||||||||||||||
|
Definition at line 2552 of file landscape.cpp. References NL3D::CTileFarBank::getTile(), TileFarBank, and uint. Referenced by initTileBanks().
02553 {
02554 // The same tiles ?
02555 bool bSame=true;
02556
02557 // It is the same tile ?
02558 if (TileFarBank.getTile (tileNumber)->isFill (CTileFarBank::diffuse))
02559 {
02560 // Good diffuse size ?
02561 if (
02562 (TileFarBank.getTile (tileNumber)->getSize (CTileFarBank::diffuse, CTileFarBank::order0) != sizeOrder0) ||
02563 (TileFarBank.getTile (tileNumber)->getSize (CTileFarBank::diffuse, CTileFarBank::order1) != sizeOrder1) ||
02564 (TileFarBank.getTile (tileNumber)->getSize (CTileFarBank::diffuse, CTileFarBank::order2) != sizeOrder2)
02565 )
02566 {
02567 TileFarBank.getTile (tileNumber)->erasePixels (CTileFarBank::diffuse);
02568 bSame=false;
02569 }
02570 }
02571
02572 // It is the same tile ?
02573 if (TileFarBank.getTile (tileNumber)->isFill (CTileFarBank::additive))
02574 {
02575 // Good additive size ?
02576 if (
02577 (TileFarBank.getTile (tileNumber)->getSize (CTileFarBank::additive, CTileFarBank::order0) != sizeOrder0) ||
02578 (TileFarBank.getTile (tileNumber)->getSize (CTileFarBank::additive, CTileFarBank::order1) != sizeOrder1) ||
02579 (TileFarBank.getTile (tileNumber)->getSize (CTileFarBank::additive, CTileFarBank::order2) != sizeOrder2)
02580 )
02581 {
02582 TileFarBank.getTile (tileNumber)->erasePixels (CTileFarBank::additive);
02583 bSame=false;
02584 }
02585 }
02586
02587 // Return true if the tiles seem to be the sames
02588 return bSame;
02589 }
|
|
||||||||||||||||
|
This is especially for Pacs. exlude a patch to be refineAll()ed.
Definition at line 760 of file landscape.cpp. References NL3D::ItZoneMap, sint, uint, and Zones. Referenced by NL3D::CZoneLighter::buildZoneInformation(), NL3D::CZoneLighter::excludeAllPatchFromRefineAll(), and NL3D::CInstanceLighter::excludeAllPatchFromRefineAll().
|
|
|
Fill a CPatchQuadBlock, from its required PatchId. nlassert(PatchId size is less than NL_PATCH_BLOCK_MAX_QUAD) Definition at line 2359 of file landscape.cpp. References NL3D::CPatch::fillPatchQuadBlock(), nlassert, NL3D::CPatchQuadBlock::PatchBlockId, NL3D::CPatchIdent::PatchId, NL3D::CPatchBlockIdent::PatchId, sint, NL3D::CPatchIdent::ZoneId, and Zones.
02360 {
02361 sint zoneId= quadBlock.PatchBlockId.PatchId.ZoneId;
02362 sint patchId= quadBlock.PatchBlockId.PatchId.PatchId;
02363 std::map<uint16, CZone*>::const_iterator it= Zones.find(zoneId);
02364 if(it!=Zones.end())
02365 {
02366 sint N= (*it).second->getNumPatchs();
02367 // patch must exist in the zone.
02368 nlassert(patchId>=0);
02369 nlassert(patchId<N);
02370
02371 const CPatch *pa= const_cast<const CZone*>((*it).second)->getPatch(patchId);
02372 pa->fillPatchQuadBlock(quadBlock);
02373 }
02374 }
|
|
|
Definition at line 1659 of file landscape.cpp. References ItTileRdrPassSet, and TileRdrPassSet. Referenced by loadTile().
01660 {
01661 ItTileRdrPassSet it;
01662 // If already here, find it, else insert.
01663 it= (TileRdrPassSet.insert(pass)).first;
01664
01665 return const_cast<CPatchRdrPass*>(&(*it));
01666 }
|
|
|
Definition at line 1639 of file landscape.cpp. References TileTextureMap. Referenced by loadTile().
01640 {
01641 ITexture *text;
01642 text= TileTextureMap[textName];
01643 // If just inserted, RefPtr is NULL!! :)
01644 // This test too if the RefPtr is NULL... (tile released)
01645 // The object is not owned by this map. It will be own by the multiple RdrPass via CSmartPtr.
01646 // They will destroy it when no more points to them.
01647 if(!text)
01648 {
01649 TileTextureMap[textName]= text= new CTextureFile(textName);
01650 text->setWrapS(ITexture::Clamp);
01651 text->setWrapT(ITexture::Clamp);
01652 text->setUploadFormat(ITexture::DXTC5);
01653 }
01654 return text;
01655 }
|
|
||||||||||||||||
|
Force a range of tiles to be loaded in the driver...
Definition at line 1884 of file landscape.cpp. References ItTileRdrPassSet, loadTile(), NL3D::IDriver::setupTexture(), sint, NL3D::CPatchRdrPass::TextureAlpha, NL3D::CPatchRdrPass::TextureDiffuse, TileInfos, TileRdrPassSet, and uint16. Referenced by NL3D::CLandscapeUser::flushTiles().
01885 {
01886 // Load tile rdrpass, force setup the texture.
01887 for(sint tileId= tileStart; tileId<tileStart+nbTiles; tileId++)
01888 {
01889 CTileInfo *tile= TileInfos[tileId];
01890 if(tile==NULL)
01891 {
01892 loadTile(tileId);
01893 }
01894 }
01895
01896 // For all rdrpass, force setup the texture.
01897 ItTileRdrPassSet it;
01898 for(it= TileRdrPassSet.begin(); it!=TileRdrPassSet.end(); it++)
01899 {
01900 const CPatchRdrPass &pass= *it;
01901 // If present and not already setuped...
01902 if(pass.TextureDiffuse && !pass.TextureDiffuse->setupedIntoDriver())
01903 drv->setupTexture(*pass.TextureDiffuse);
01904 // If present and not already setuped...
01905 if(pass.TextureAlpha && !pass.TextureAlpha->setupedIntoDriver())
01906 drv->setupTexture(*pass.TextureAlpha);
01907 }
01908 }
|
|
|
For changing TileMaxSubdivision. force tesselation to be under tile.
Definition at line 374 of file landscape.cpp. References NL3D::ItZoneMap, and Zones. Referenced by setTileMaxSubdivision().
|
|
||||||||||||||||
|
Definition at line 2157 of file landscape.cpp. References _ULTotalFarPixels, NL3D::CPatch::getOrderS(), NL3D::CPatch::getOrderT(), height, NL_NUM_PIXELS_ON_FAR_TILE_EDGE, nlassert, NL3D::CTextureFar::removePatch(), NL3D::CPatchRdrPass::TextureDiffuse, uint, and width. Referenced by NL3D::CPatch::computeNewFar(), and NL3D::CPatch::resetRenderFar().
02158 {
02159 // Get size of the far texture
02160 uint width=(pPatch->getOrderS ()*NL_NUM_PIXELS_ON_FAR_TILE_EDGE)>>(farIndex-1);
02161 uint height=(pPatch->getOrderT ()*NL_NUM_PIXELS_ON_FAR_TILE_EDGE)>>(farIndex-1);
02162
02163 // For updateLighting: decrement total of pixels to update.
02164 _ULTotalFarPixels-= width*height;
02165 nlassert(_ULTotalFarPixels>=0);
02166
02167 // Get a pointer on the diffuse far texture
02168 CTextureFar *pTextureFar=(CTextureFar*)(&*(pass->TextureDiffuse));
02169
02170 // Remove from the patch from the texture if empty
02171 pTextureFar->removePatch (pPatch, farIndex);
02172 }
|
|
|
return the light direction setuped in enableAutomaticLighting().
Definition at line 415 of file landscape.h. References _AutomaticLightDir. Referenced by NL3D::CPatch::computeTileLightmapPixelAutomatic().
00415 {return _AutomaticLightDir;}
|
|
|
return true if AutomaticLighting is enabled.
Definition at line 413 of file landscape.h. References _AutomaticLighting. Referenced by NL3D::CPatch::computeTileLightmap(), NL3D::CPatch::computeTileLightmapEdge(), and NL3D::CPatch::computeTileLightmapPixel().
00413 {return _AutomaticLighting;}
|
|
||||||||||||||||||||
|
Get the camera 3rd person collision against the TileFaces (ie only under approx 50 m) return a [0,1] value. 0 => collision at start. 1 => no collision.
Definition at line 3714 of file landscape.cpp. References _ShadowPolyReceiver, and NL3D::CShadowPolyReceiver::getCameraCollision().
03715 {
03716 return _ShadowPolyReceiver.getCameraCollision(start, end, radius, cone);
03717 }
|
|
|
see setDLMGlobalVegetableColor() Definition at line 606 of file landscape.h. References _DLMGlobalVegetableColor. Referenced by NL3D::CLandscapeUser::getDLMGlobalVegetableColor().
00606 {return _DLMGlobalVegetableColor;}
|
|
|
see setDynamicLightingMaxAttEnd() Definition at line 597 of file landscape.h. References _DLMMaxAttEnd.
00597 {return _DLMMaxAttEnd;}
|
|
|
For bench only. return approximate ammount of memory taken by dynamic lightmap in RAM. This is sizeof(global Texture in RAM) + all patchDLMContext. NB: not so slow, but do not call in final release. Definition at line 3583 of file landscape.cpp. References _PatchDLMContextList, NL3D::CTessList< CPatchDLMContext >::begin(), NL3D::CPatchDLMContext::getMemorySize(), NL3D::CTessNodeList::Next, NL3D_LANDSCAPE_DLM_HEIGHT, NL3D_LANDSCAPE_DLM_WIDTH, and uint.
03584 {
03585 uint mem= 0;
03586 // First, set size of global texture overhead.
03587 mem= NL3D_LANDSCAPE_DLM_WIDTH * NL3D_LANDSCAPE_DLM_HEIGHT * sizeof(CRGBA);
03588
03589 // Then, for each patchContext created
03590 CPatchDLMContext *ctxPtr= _PatchDLMContextList->begin();
03591 while(ctxPtr!=NULL)
03592 {
03593 // add its memory load.
03594 mem+= ctxPtr->getMemorySize();
03595
03596 // next
03597 ctxPtr= (CPatchDLMContext*)ctxPtr->Next;
03598 }
03599
03600 return mem;
03601 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 2075 of file landscape.cpp. References _TextureFars, _ULRootTextureFar, _ULTotalFarPixels, NL3D::CTextureFar::allocatePatch(), NL3D::CPatch::getOrderS(), NL3D::CPatch::getOrderT(), height, NL3D::CTextureFar::linkBeforeUL(), NL_NUM_PIXELS_ON_FAR_TILE_EDGE, nlassert, sint, NL3D::CPatchRdrPass::TextureDiffuse, TileFarBank, NL3D::CTextureFar::tryAllocatePatch(), TSPRenderPass, uint, and width. Referenced by NL3D::CPatch::computeNewFar().
02076 {
02077 // Check args
02078 nlassert (farIndex>0);
02079
02080 // Get size of the far texture
02081 uint width=(pPatch->getOrderS ()*NL_NUM_PIXELS_ON_FAR_TILE_EDGE)>>(farIndex-1);
02082 uint height=(pPatch->getOrderT ()*NL_NUM_PIXELS_ON_FAR_TILE_EDGE)>>(farIndex-1);
02083
02084 // For updateLighting: increment total of pixels to update.
02085 _ULTotalFarPixels+= width*height;
02086
02087 // Try to allocate in every textures
02088 uint i;
02089 sint bestRdrPass= -1;
02090 sint bestSplit= INT_MAX;
02091 for(i=0;i<_TextureFars.size();i++)
02092 {
02093 CTextureFar *pTextureFar=(CTextureFar*)(&*(_TextureFars[i]->TextureDiffuse));
02094
02095 sint splitRes= pTextureFar->tryAllocatePatch(pPatch, farIndex);
02096 // if found with no split, ok, stop!
02097 if(splitRes==0)
02098 {
02099 bestRdrPass= i;
02100 break;
02101 }
02102 // else if found, but with split
02103 else if(splitRes > 0)
02104 {
02105 // Then must take the small split possible along all the texture fars.
02106 if (splitRes<bestSplit)
02107 {
02108 bestRdrPass= i;
02109 bestSplit= splitRes;
02110 }
02111 }
02112 }
02113
02114 // If no one found, must allocate a new render pass.
02115 if(bestRdrPass==-1)
02116 {
02117 bestRdrPass= _TextureFars.size();
02118
02119 // add a new render pass
02120 CPatchRdrPass *pass=new CPatchRdrPass;
02121
02122 // Fill the render pass
02123 CTextureFar *pTextureFar=new CTextureFar;
02124
02125 // Append this textureFar to the list of TextureFar to updateLighting.
02126 if(_ULRootTextureFar==NULL)
02127 _ULRootTextureFar= pTextureFar;
02128 else
02129 pTextureFar->linkBeforeUL(_ULRootTextureFar);
02130
02131 // Set the bank
02132 pTextureFar->_Bank=&TileFarBank;
02133
02134 // Set as diffuse texture for this renderpass
02135 pass->TextureDiffuse=pTextureFar;
02136
02137 // Add the render pass to the list
02138 _TextureFars.push_back(pass);
02139 }
02140
02141
02142 // Ok, add the patch to the best render pass in the _TextureFars
02143 TSPRenderPass pass= _TextureFars[bestRdrPass];
02144
02145 // Get a pointer on the diffuse far texture
02146 CTextureFar *pTextureFar=(CTextureFar*)(&*(pass->TextureDiffuse));
02147
02148 // Allocate really in it (must success since tryAllocate() has succeed)
02149 pTextureFar->allocatePatch(pPatch, farIndex, farUScale, farVScale, farUBias, farVBias, bRot);
02150
02151 // Return the renderpass
02152 return pass;
02153 }
|
|
||||||||||||
|
return the HeightField DeltaZ for the 2D position. (0,0,dZ) is returned.
Definition at line 2698 of file landscape.cpp. References _HeightField, NL3D::CLandscape::CBezierPatchZ::eval(), NL3D::CLandscape::CHeightField::Height, NL3D::CLandscape::CHeightField::OOSizeX, NL3D::CLandscape::CHeightField::OOSizeY, NL3D::CLandscape::CHeightField::OriginX, NL3D::CLandscape::CHeightField::OriginY, sint, NL3D::CLandscape::CHeightField::Width, NLMISC::CVector::x, x, NLMISC::CVector::y, y, NLMISC::CVector::z, and NL3D::CLandscape::CHeightField::ZPatchs. Referenced by NL3D::CZone::applyHeightField(), and NL3D::CLandscapeUser::getHeightFieldDeltaZ().
02699 {
02700 if(_HeightField.ZPatchs.size()==0)
02701 return CVector::Null;
02702
02703 // map to _HeightField coordinates.
02704 x-= _HeightField.OriginX;
02705 y-= _HeightField.OriginY;
02706 x*= _HeightField.OOSizeX;
02707 y*= _HeightField.OOSizeY;
02708 // get patch on the grid.
02709 sint ix, iy;
02710 ix= (sint)floor(x);
02711 iy= (sint)floor(y);
02712 // out of the grid?
02713 if( ix<0 || ix>=(sint)_HeightField.Width || iy<0 || iy>=(sint)_HeightField.Height)
02714 return CVector::Null;
02715
02716 // get patch.
02717 const CBezierPatchZ &paz= _HeightField.ZPatchs[iy*_HeightField.Width + ix];
02718
02719 // compute result.
02720 CVector ret=CVector::Null;
02721 ret.x= 0;
02722 ret.y= 0;
02723 ret.z= paz.eval(x-ix, y-iy);
02724
02725 return ret;
02726 }
|
|
||||||||||||
|
Get the lumel under the position. return 255 if invalid patchId.
Definition at line 3254 of file landscape.cpp. References NL3D::CPatch::getLumel(), nlassert, NL3D::CPatchIdent::PatchId, sint, uint16, uint8, NL3D::CPatchIdent::ZoneId, and Zones.
03255 {
03256 // \todo yoyo: TODO_ZONEID: change ZoneId in 32 bits...
03257 std::map<uint16, CZone*>::const_iterator it= Zones.find((uint16)patchId.ZoneId);
03258 if(it!=Zones.end())
03259 {
03260 sint N= (*it).second->getNumPatchs();
03261 // patch must exist in the zone.
03262 nlassert(patchId.PatchId<N);
03263 const CPatch *pa= const_cast<const CZone*>((*it).second)->getPatch(patchId.PatchId);
03264
03265 return pa->getLumel(uv);
03266 }
03267 else
03268 // Return full sun contribution as default
03269 return 255;
03270 }
|
|
|
Definition at line 3106 of file landscape.cpp. References _NoiseEnabled. Referenced by NL3D::CPatch::computeVertex().
03107 {
03108 return _NoiseEnabled;
03109 }
|
|
|
return the number of faces displayed in Driver with the vegetable manager. Out CPrimitiveProfile::NTriangles displayed by vegetable part is returned. Definition at line 3211 of file landscape.cpp. References _VegetableManager, NL3D::CVegetableManager::getNumVegetableFaceRendered(), and uint.
03212 {
03213 return _VegetableManager->getNumVegetableFaceRendered();
03214 }
|
|
|
This is especially for Pacs. Each Vertex->EndPos which is not a corner of a patch is set to the mean of its 2 shared Patchs. NB: Works with special cases of rectangular patchs and binded patchs. Definition at line 264 of file landscape.h. References _OldRefineCenter. Referenced by NL3D::CLandscapeModel::getReceiverBBox().
00264 {return _OldRefineCenter;}
|
|
|
for CPatch.
Definition at line 983 of file landscape.h. References _PatchDLMContextList.
00983 {return _PatchDLMContextList;}
|
|
|
Definition at line 394 of file landscape.h. References _PointLightDiffuseMaterial. Referenced by NL3D::CLandscapeUser::getPointLightDiffuseMaterial().
00395 {
00396 return _PointLightDiffuseMaterial;
00397 }
|
|
|
Definition at line 548 of file landscape.h. References _PZBModelPosition. Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape(), and NL3D::CLandscapeModel::receiveShadowMap().
00548 {return _PZBModelPosition;}
|
|
|
Definition at line 70 of file smart_ptr.h. References NLMISC::CRefCount::crefs, and sint.
00071 {
00072 return crefs;
00073 }
|
|
|
Definition at line 207 of file landscape.h. References _RefineMode.
00207 {return _RefineMode;}
|
|
|
Get the light color by shading table.
Definition at line 380 of file landscape.h. References _LightValue. Referenced by NL3D::CPatch::computeTileLightmapEdgePrecomputed(), NL3D::CPatch::computeTileLightmapPixelAutomatic(), NL3D::CPatch::computeTileLightmapPixelPrecomputed(), NL3D::CPatch::computeTileLightmapPrecomputed(), and NL3D::CTextureFar::rebuildPatch().
00381 {
00382 return _LightValue;
00383 }
|
|
||||||||||||
|
From the current tesselation of a patch of landscape, and a UV in this patch, return tesselated position. NB: return Null if patch not found. Definition at line 2496 of file landscape.cpp. References _OldRefineCenter, _Threshold, _TileDistNear, _VertexShaderOk, NL3D::CPatch::getTesselatedPos(), nlassert, NL3D::CPatchIdent::PatchId, sint, NLMISC::sqr(), uint16, NL3D::CPatchIdent::ZoneId, and Zones.
02497 {
02498 // First, must update globals, for CTessFace::computeTesselatedPos() to work properly.
02499
02500 // VertexProgrma mode???
02501 CLandscapeGlobals::VertexProgramEnabled= _VertexShaderOk;
02502
02503 // If VertexProgram enabled
02504 if( CLandscapeGlobals::VertexProgramEnabled )
02505 {
02506 /* because VertexProgram enabled, CTessVertex::Pos (geomorphed Pos) are not computed each frame
02507 Hence, CTessFace::computeTesselatedPos() will call CTessVertex::computeGeomPos() to have correct
02508 CTessVertex::Pos. ThereFore we must setup globals so CTessVertex::computeGeomPos() works properly.
02509 */
02510
02511 // see copy in updateGlobalsAndLockBuffers(). NB: Just copy what needed here!!!!
02512
02513 // Tile subdivsion part.
02514 CLandscapeGlobals::TileDistNear = _TileDistNear;
02515 CLandscapeGlobals::TileDistFar = CLandscapeGlobals::TileDistNear+20;
02516 CLandscapeGlobals::TileDistNearSqr = sqr(CLandscapeGlobals::TileDistNear);
02517 CLandscapeGlobals::TileDistFarSqr = sqr(CLandscapeGlobals::TileDistFar);
02518 CLandscapeGlobals::OOTileDistDeltaSqr = 1.0f / (CLandscapeGlobals::TileDistFarSqr - CLandscapeGlobals::TileDistNearSqr);
02519
02520 // RefineThreshold.
02521 CLandscapeGlobals::RefineThreshold= _Threshold;
02522 CLandscapeGlobals::OORefineThreshold= 1.0f / CLandscapeGlobals::RefineThreshold;
02523
02524 // Refine Center*.
02525 // NB: setup the last setuped refineCenter.
02526 CLandscapeGlobals::RefineCenter= _OldRefineCenter;
02527 }
02528
02529
02530 // \todo yoyo: TODO_ZONEID: change ZoneId in 32 bits...
02531 std::map<uint16, CZone*>::const_iterator it= Zones.find((uint16)patchId.ZoneId);
02532 if(it!=Zones.end())
02533 {
02534 sint N= (*it).second->getNumPatchs();
02535 // patch must exist in the zone.
02536 nlassert(patchId.PatchId<N);
02537 const CPatch *pa= const_cast<const CZone*>((*it).second)->getPatch(patchId.PatchId);
02538
02539 return pa->getTesselatedPos(uv);
02540 }
02541 else
02542 return CVector::Null;
02543 }
|
|
|
From the current tesselation of landscape, build the list of leaves faces. Warning: ptrs are only valid between 2 tesselation (2 calls of Scene::render() or 2 calls of refine*() etc...) Definition at line 2899 of file landscape.cpp. References NL3D::CPatch::appendTessellationLeaves(), sint, and Zones. Referenced by NL3D::CZoneLighter::addTriangles(), NL3D::CInstanceLighter::addTriangles(), and NL3D::CZoneLighter::buildZoneInformation().
02900 {
02901 leaves.clear();
02902
02903 std::map<uint16, CZone*>::const_iterator it;
02904 for(it= Zones.begin();it!=Zones.end();it++)
02905 {
02906 // Then trace all patch.
02907 sint N= (*it).second->getNumPatchs();
02908 for(sint i=0;i<N;i++)
02909 {
02910 const CPatch *pa= const_cast<const CZone*>((*it).second)->getPatch(i);
02911
02912 pa->appendTessellationLeaves(leaves);
02913 }
02914 }
02915
02916 }
|
|
|
for CPatch.
Definition at line 979 of file landscape.h. References _TextureDLM.
00979 {return (CTextureDLM*)(ITexture*)_TextureDLM;}
|
|
|
Get threshold.
Definition at line 205 of file landscape.h. References _Threshold. Referenced by NL3D::CLandscapeUser::getThreshold().
00205 {return _Threshold;}
|
|
|
Definition at line 622 of file landscape.h. References _TileCallback. Referenced by NL3D::CPatch::appendTileMaterialToRenderList(), NL3D::CLandscapeUser::getTileCallback(), and NL3D::CPatch::removeTileMaterialFromRenderList().
00622 { return _TileCallback; }
|
|
||||||||||||
|
Return the tile element for a patch at specific UV. UseFull for getting surface data. Return NULL if not found.
Definition at line 1865 of file landscape.cpp. References NL3D::CPatch::getTileElement(), nlassert, NL3D::CPatchIdent::PatchId, sint, uint16, NL3D::CPatchIdent::ZoneId, and Zones.
01866 {
01867 // \todo yoyo: TODO_ZONEID: change ZoneId in 32 bits...
01868 std::map<uint16, CZone*>::const_iterator it= Zones.find((uint16)patchId.ZoneId);
01869 if(it!=Zones.end())
01870 {
01871 sint N= (*it).second->getNumPatchs();
01872 // patch must exist in the zone.
01873 nlassert(patchId.PatchId<N);
01874 CPatch *pa= const_cast<CZone*>((*it).second)->getPatch(patchId.PatchId);
01875 return pa->getTileElement (uv);
01876 }
01877 else
01878 // Return not found
01879 return NULL;
01880 }
|
|
||||||||||||
|
Definition at line 1945 of file landscape.cpp. References _NFreeLightMaps, _TextureNears, _ULTotalNearPixels, NL3D::CTextureNear::getNbAvailableTiles(), NL3D::CTextureNear::getTileAndFillRect(), NL3D::NbTileLightMapByTexture, NL_TILE_LIGHTMAP_SIZE, nlassert, sint, NL3D::CPatchRdrPass::TextureDiffuse, NL3D::TextureNearSize, TSPRenderPass, and uint. Referenced by NL3D::CPatch::getTileLightMap().
01946 {
01947 sint textNum;
01948 uint lightMapId;
01949 /*
01950 NB: TextureNear are a grow only Array... TextureNear are never deleted. Why? :
01951 2/ Unused near texture may be uncahced by opengl (and maybe by windows, to disk).
01952
01953 (old reason, no longer valid, since lightmaps are unlinked from tiles.
01954 1/ There is an important issue with releasing texture nears: tiles may acces them (see getTileRenderPass())
01955 )
01956 */
01957 // 0. Alloc Near Texture if necessary.
01958 //====================================
01959 if(_NFreeLightMaps==0)
01960 {
01961 CTextureNear *text= new CTextureNear(TextureNearSize);
01962 TSPRenderPass newPass= new CPatchRdrPass;
01963
01964 newPass->TextureDiffuse= text;
01965
01966 _TextureNears.push_back(newPass);
01967 _NFreeLightMaps+= text->getNbAvailableTiles();
01968 }
01969
01970 // 1. Search the first texture which has a free tile.
01971 //==================================================
01972 CTextureNear *nearText= NULL;
01973 CPatchRdrPass *nearRdrPass= NULL;
01974 for(textNum=0;textNum<(sint)_TextureNears.size();textNum++)
01975 {
01976 nearRdrPass= _TextureNears[textNum];
01977 nearText= (CTextureNear*)(ITexture*)nearRdrPass->TextureDiffuse;
01978 if(nearText->getNbAvailableTiles()!=0)
01979 break;
01980 }
01981 nlassert(textNum<(sint)_TextureNears.size());
01982 // A empty space has been found.
01983 _NFreeLightMaps--;
01984
01985 // 2. Fill the texture with the data, and updaterect.
01986 //===================================================
01987 lightMapId= nearText->getTileAndFillRect(map);
01988 // Compute the Id.
01989 lightMapId= textNum*NbTileLightMapByTexture + lightMapId;
01990
01991
01992 // 3. updateLighting
01993 //===================================================
01994 // Increment number of pixels to update for near.
01995 _ULTotalNearPixels+= NL_TILE_LIGHTMAP_SIZE*NL_TILE_LIGHTMAP_SIZE;
01996
01997
01998 // Result:
01999 lightmapRdrPass= nearRdrPass;
02000 return lightMapId;
02001 }
|
|
||||||||||||
|
Definition at line 2003 of file landscape.cpp. References NL3D::NbTileLightMapByLine, NL3D::NbTileLightMapByTexture, NL_TILE_LIGHTMAP_SIZE, s, t, NL3D::TextureNearSize, uint, NLMISC::CVector::x, NLMISC::CVector::y, and NLMISC::CVector::z. Referenced by NL3D::CPatch::getTileLightMapUvInfo().
02004 {
02005 uint id, s,t;
02006
02007 // Scale.
02008 static const float scale10= (float)NL_TILE_LIGHTMAP_SIZE/TextureNearSize;
02009 static const float scale4= 4.f/TextureNearSize;
02010 static const float scale1= 1.f/TextureNearSize;
02011 // The size of a minilightmap, mapped onto the polygon, is still 4 pixels.
02012 uvScaleBias.z= scale4;
02013
02014 // Get the id local in the texture.
02015 id= tileLightMapId%NbTileLightMapByTexture;
02016
02017 // Commpute UVBias.
02018 // Get the coordinate of the tile, in tile number.
02019 s= id%NbTileLightMapByLine;
02020 t= id/NbTileLightMapByLine;
02021 // But the real size of a minilightmap is 10 pixels, and we must reach the pixel 1,1.
02022 uvScaleBias.x= s*scale10 + scale1;
02023 uvScaleBias.y= t*scale10 + scale1;
02024 }
|
|
|
Get Maximum Tile subdivision.
Definition at line 356 of file landscape.cpp. References _TileMaxSubdivision, and uint. Referenced by NL3D::CLandscapeUser::getTileMaxSubdivision().
00357 {
00358 return _TileMaxSubdivision;
00359 }
|
|
|
Get tile near distance.
Definition at line 201 of file landscape.h. References _TileDistNear. Referenced by NL3D::CLandscapeModel::getReceiverBBox(), and NL3D::CLandscapeUser::getTileNear().
00201 {return _TileDistNear;}
|
|
||||||||||||
|
Definition at line 1790 of file landscape.cpp. References NL3D::CLandscape::CTileInfo::AdditiveRdrPass, NL3D::CLandscape::CTileInfo::DiffuseRdrPass, loadTile(), nlassert, TileInfos, and uint16. Referenced by NL3D::CPatch::getTileRenderPass(), and getTileTexture().
01791 {
01792 CTileInfo *tile= TileInfos[tileId];
01793
01794 // If not here, create it.
01795 //========================
01796 if(tile==NULL)
01797 {
01798 // Force loading of tile.
01799 loadTile(tileId);
01800
01801 tile= TileInfos[tileId];
01802 nlassert(tile!=NULL);
01803 }
01804
01805 // Retrieve.
01806 //========================
01807 if(additiveRdrPass)
01808 {
01809 // NB: additive pass is not lighted by the lightmap, so there is no lighted version of this rednerpass.
01810 return tile->AdditiveRdrPass;
01811 }
01812 else
01813 {
01814 return tile->DiffuseRdrPass;
01815 }
01816 }
|
|
||||||||||||||||
|
Return the texture for a tile Id. UseFull for Tile edition.
Definition at line 1844 of file landscape.cpp. References getTileRenderPass(), getTileUvScaleBiasRot(), NL3D::CPatchRdrPass::TextureAlpha, NL3D::CPatchRdrPass::TextureDiffuse, uint16, and uint8.
01845 {
01846 CPatchRdrPass *pass;
01847 if(bitmapType== CTile::additive)
01848 pass= getTileRenderPass(tileId, true);
01849 else
01850 pass= getTileRenderPass(tileId, false);
01851 if(!pass)
01852 return NULL;
01853 uint8 dummy;
01854 getTileUvScaleBiasRot(tileId, bitmapType, uvScaleBias, dummy);
01855
01856 // return the wanted texture.
01857 if(bitmapType==CTile::diffuse || bitmapType==CTile::additive)
01858 return pass->TextureDiffuse;
01859 else
01860 return pass->TextureAlpha;
01861 }
|
|
||||||||||||||||||||
|
Definition at line 1820 of file landscape.cpp. References NL3D::CLandscape::CTileInfo::AdditiveUvScaleBias, NL3D::CLandscape::CTileInfo::AlphaUvScaleBias, NL3D::CLandscape::CTileInfo::DiffuseUvScaleBias, nlassert, NL3D::CLandscape::CTileInfo::RotAlpha, TileInfos, uint16, and uint8. Referenced by getTileTexture(), and NL3D::CPatch::getTileUvInfo().
01821 {
01822 CTileInfo *tile= TileInfos[tileId];
01823 // tile should not be NULL.
01824 // Because load of tiles are always done in getTileRenderPass(), and this insertion always succeed.
01825 nlassert(tile);
01826
01827 rotAlpha= 0;
01828 switch(bitmapType)
01829 {
01830 case CTile::diffuse:
01831 uvScaleBias= tile->DiffuseUvScaleBias; break;
01832 case CTile::additive:
01833 uvScaleBias= tile->AdditiveUvScaleBias; break;
01834 case CTile::alpha:
01835 uvScaleBias= tile->AlphaUvScaleBias;
01836 rotAlpha= tile->RotAlpha;
01837 break;
01838 default: break;
01839 }
01840 }
|
|
|
For a given tile Id, look into tileSet, and get the tile vegetable descriptor
Definition at line 3218 of file landscape.cpp. References NL3D::CTileBank::getTileVegetableDesc(), TileBank, and uint16. Referenced by NL3D::CPatch::generateTileVegetable().
03219 {
03220 return TileBank.getTileVegetableDesc(tileId);
03221 }
|
|
|
Get a zone pointer.
Definition at line 2218 of file landscape.cpp.
|
|
|
Get a zone pointer.
Definition at line 2206 of file landscape.cpp. Referenced by NL3D::CZoneLighter::buildZoneInformation(), checkZoneBinds(), NL3D::CZoneLighter::excludeAllPatchFromRefineAll(), NL3D::CInstanceLighter::excludeAllPatchFromRefineAll(), NL3D::CZoneLighter::processCalc(), and NL3D::CZoneLighter::processZonePointLightRT().
|
|
|
Return list of zone loaded. Definition at line 502 of file landscape.cpp. References Zones. Referenced by clear(), and NL3D::CLandscapeUser::getAllZoneLoaded().
|
|
|
init the landscape VBuffers, texture cache etc...
Definition at line 288 of file landscape.cpp. References _PatchQuadGrid, _PatchQuadGridEltSize, _PatchQuadGridSize, NL3D::CQuadGrid< CPatchIdentEx >::create(), FarMaterial, NL3D::CMaterial::initUnlit(), NL3D::CMaterial::setDstBlend(), NL3D::CMaterial::setSrcBlend(), NL3D::CMaterial::texEnvArg0Alpha(), NL3D::CMaterial::texEnvArg0RGB(), NL3D::CMaterial::texEnvArg1RGB(), NL3D::CMaterial::texEnvOpAlpha(), NL3D::CMaterial::texEnvOpRGB(), and TileMaterial. Referenced by NL3D::CLandscapeModel::CLandscapeModel().
00289 {
00290 // Fill Far mat.
00291 // Must init his BlendFunction here!!! becaus it switch between blend on/off during rendering.
00292 FarMaterial.initUnlit();
00293 FarMaterial.setSrcBlend(CMaterial::srcalpha);
00294 FarMaterial.setDstBlend(CMaterial::invsrcalpha);
00295
00296 // FarMaterial: pass trhough Alpha from diffuse.
00297 FarMaterial.texEnvOpAlpha(0, CMaterial::Replace);
00298 FarMaterial.texEnvArg0Alpha(0, CMaterial::Diffuse, CMaterial::SrcAlpha);
00299 FarMaterial.texEnvOpAlpha(1, CMaterial::Replace);
00300 FarMaterial.texEnvArg0Alpha(1, CMaterial::Diffuse, CMaterial::SrcAlpha);
00301 // FarMaterial: Add RGB from static lightmap and dynamic lightmap
00302 FarMaterial.texEnvOpRGB(0, CMaterial::Replace);
00303 FarMaterial.texEnvArg0RGB(0, CMaterial::Texture, CMaterial::SrcColor);
00304 FarMaterial.texEnvOpRGB(1, CMaterial::Add);
00305 FarMaterial.texEnvArg0RGB(1, CMaterial::Texture, CMaterial::SrcColor);
00306 FarMaterial.texEnvArg1RGB(1, CMaterial::Previous, CMaterial::SrcColor);
00307
00308
00309 // Init material for tile.
00310 TileMaterial.initUnlit();
00311
00312 // init quadGrid.
00313 _PatchQuadGrid.create(_PatchQuadGridSize, _PatchQuadGridEltSize);
00314 }
|
|
|
Enable automatic near lightmap computing. use setupStaticLight(). Default is disabled. NB: calling this method won't flush all texture near already computed. Definition at line 3619 of file landscape.cpp. References NL3D::ItZoneMap, and Zones. Referenced by NL3D::CScene::createInstance().
|
|
|
Reinit the tile bank if the bank change.
Definition at line 3629 of file landscape.cpp. References releaseTiles(), TileInfos, uint, and Zones. Referenced by CLandscape(), and NL3D::CLandscapeUser::flushTiles().
03630 {
03631 // Release the tiles
03632 releaseTiles (0, TileInfos.size());
03633 TileInfos.clear();
03634 TileInfos.resize(NL3D::NbTilesMax);
03635 fill(TileInfos.begin(), TileInfos.end(), (CTileInfo*)NULL);
03636
03637 // Refresh each zone
03638 std::map<uint16, CZone*>::iterator it;
03639 for(it= Zones.begin();it!=Zones.end();it++)
03640 {
03641 // Refresh each patch
03642 uint numPatch = (uint)it->second->getNumPatchs();
03643 uint i;
03644 for (i=0; i<numPatch; i++)
03645 it->second->changePatchTextureAndColor (i, NULL, NULL);
03646 }
03647 }
|
|
|
Build tileBank. Call this after loading the near and far tile banks.
Definition at line 2592 of file landscape.cpp. References _FarInitialized, _VegetableManager, eraseTileFarIfNotGood(), NL3D::CTileFarBank::getNumTile(), NL3D::CTileSet::getNumTile128(), NL3D::CTileSet::getNumTile256(), NL3D::CTileSetTransition::getTile(), NL3D::CTileSet::getTile128(), NL3D::CTileSet::getTile256(), NL3D::CTileBank::getTileCount(), NL3D::CTileBank::getTileSet(), NL3D::CTileBank::getTileSetCount(), NL3D::CTileSet::getTransition(), NL3D::CTileBank::initTileVegetableDescs(), NL_TILE_FAR_SIZE_ORDER0, NL_TILE_FAR_SIZE_ORDER1, NL_TILE_FAR_SIZE_ORDER2, TileBank, TileFarBank, and uint. Referenced by NL3D::CLandscapeUser::flushTiles().
02593 {
02594 // *** Check the two banks are OK
02595 _FarInitialized=false;
02596
02597 // Compatibility check
02598 bool bCompatibility=true;
02599
02600 // Same number of tiles
02601 if (TileBank.getTileCount()==TileFarBank.getNumTile())
02602 {
02603 // Same tileSet
02604 for (int tileSet=0; tileSet<TileBank.getTileSetCount(); tileSet++)
02605 {
02606 // Same tile128
02607 int tile;
02608 for (tile=0; tile<TileBank.getTileSet(tileSet)->getNumTile128(); tile++)
02609 {
02610 // tile number
02611 uint tileNumber=TileBank.getTileSet(tileSet)->getTile128(tile);
02612
02613 // erase the tiles if not good
02614 bCompatibility&=eraseTileFarIfNotGood (tileNumber, NL_TILE_FAR_SIZE_ORDER0, NL_TILE_FAR_SIZE_ORDER1, NL_TILE_FAR_SIZE_ORDER2);
02615 }
02616
02617 // Same tile256
02618 for (tile=0; tile<TileBank.getTileSet(tileSet)->getNumTile256(); tile++)
02619 {
02620 // tile number
02621 uint tileNumber=TileBank.getTileSet(tileSet)->getTile256(tile);
02622
02623 // erase the tiles if not good
02624 bCompatibility&=eraseTileFarIfNotGood (tileNumber, NL_TILE_FAR_SIZE_ORDER0<<2, NL_TILE_FAR_SIZE_ORDER1<<2, NL_TILE_FAR_SIZE_ORDER2<<2);
02625 }
02626
02627 // Same transition
02628 for (tile=0; tile<CTileSet::count; tile++)
02629 {
02630 // tile number
02631 uint tileNumber=TileBank.getTileSet(tileSet)->getTransition(tile)->getTile();
02632
02633 // erase the tiles if not good
02634 bCompatibility&=eraseTileFarIfNotGood (tileNumber, NL_TILE_FAR_SIZE_ORDER0, NL_TILE_FAR_SIZE_ORDER1, NL_TILE_FAR_SIZE_ORDER2);
02635 }
02636 }
02637
02638 // Far actived!
02639 _FarInitialized=true;
02640 }
02641
02642 // Register / Load the vegetables.
02643 TileBank.initTileVegetableDescs(_VegetableManager);
02644
02645 return bCompatibility;
02646 }
|
|
|
Definition at line 3694 of file landscape.cpp. References uint, unlockBuffers(), updateGlobalsAndLockBuffers(), updateTessBlocksFaceVector(), and Zones. Referenced by NL3D::CLandscapeUser::invalidateAllTiles().
03695 {
03696
03697 updateGlobalsAndLockBuffers(CVector::Null);
03698 for(TZoneMap::iterator it = Zones.begin(); it != Zones.end(); ++it)
03699 {
03700 if (it->second->Compiled)
03701 {
03702 for(uint k = 0; k < it->second->Patchs.size(); ++k)
03703 {
03704 it->second->Patchs[k].deleteTileUvs();
03705 it->second->Patchs[k].recreateTileUvs();
03706 }
03707 }
03708 }
03709 unlockBuffers();
03710 updateTessBlocksFaceVector();
03711 }
|
|
|
return if the vegetable management is actually activated: actually return _VerexShaderOk && _VegetableEnabled. Definition at line 3168 of file landscape.cpp. References _DriverOkForVegetable, and _VegetableManagerEnabled. Referenced by NL3D::CPatch::appendTileMaterialToRenderList(), NL3D::CPatch::recreateAllVegetableIgs(), and render().
03169 {
03170 return _VegetableManagerEnabled && _DriverOkForVegetable;
03171 }
|
|
|
Used by Patch to link/unlink from _ULRootNearPatch.
Definition at line 3394 of file landscape.cpp. References _ULRootNearPatch, and NL3D::CPatch::linkBeforeNearUL(). Referenced by NL3D::CPatch::addRefTessBlocks().
03395 {
03396 // Append this patch to the list of patch to updateLighting.
03397 if(_ULRootNearPatch==NULL)
03398 _ULRootNearPatch= patch;
03399 else
03400 patch->linkBeforeNearUL(_ULRootNearPatch);
03401 }
|
|
|
Definition at line 1670 of file landscape.cpp. References findTileRdrPass(), findTileTexture(), NL3D::CTileBank::getAbsPath(), NL3D::CTile::getRelativeFileName(), NL3D::CTile::getRotAlpha(), NL3D::CTileBank::getTile(), NL3D::CTileBank::getTileCount(), nlassert, nldebug, NL3D::CPatchRdrPass::TextureAlpha, NL3D::CPatchRdrPass::TextureDiffuse, TileBank, TileInfos, and uint16. Referenced by flushTiles(), and getTileRenderPass().
01671 {
01672 CTile *tile;
01673 CTileInfo *tileInfo;
01674 string textName;
01675
01676 // Retrieve or create texture.
01677 // ===========================
01678 // Tile Must exist.
01679 // nlassert(tileId==0xFFFF || tileId<TileBank.getTileCount());
01680 if(tileId<TileBank.getTileCount())
01681 tile= TileBank.getTile(tileId);
01682 else
01683 tile= NULL;
01684 // TileInfo must not exist.
01685 nlassert(TileInfos[tileId]==NULL);
01686 TileInfos[tileId]= tileInfo= new CTileInfo;
01687
01688 // Fill additive part.
01689 // ===================
01690 if(tile)
01691 textName= tile->getRelativeFileName(CTile::additive);
01692 else
01693 textName= "";
01694 // If no additive for this tile, rdrpass is NULL.
01695 if(textName=="")
01696 tileInfo->AdditiveRdrPass= NULL;
01697 else
01698 {
01699 // Fill rdrpass.
01700 CPatchRdrPass pass;
01701 pass.TextureDiffuse= findTileTexture(TileBank.getAbsPath()+textName);
01702
01703 // We may have an alpha part for additive.
01704 textName= tile->getRelativeFileName (CTile::alpha);
01705 if(textName!="")
01706 pass.TextureAlpha= findTileTexture(TileBank.getAbsPath()+textName);
01707
01708 // Fill tileInfo.
01709 tileInfo->AdditiveRdrPass= findTileRdrPass(pass);
01710 // Fill UV Info.
01711 // NB: for now, One Tile== One Texture, so UVScaleBias is simple.
01712 tileInfo->AdditiveUvScaleBias.x= 0;
01713 tileInfo->AdditiveUvScaleBias.y= 0;
01714 tileInfo->AdditiveUvScaleBias.z= 1;
01715 }
01716
01717
01718 // Fill diffuse part.
01719 // =======================
01720 // Fill rdrpass.
01721 CPatchRdrPass pass;
01722 // The diffuse part for a tile is inevitable.
01723 if(tile)
01724 {
01725 textName= tile->getRelativeFileName(CTile::diffuse);
01726 if(textName!="")
01727 pass.TextureDiffuse= findTileTexture(TileBank.getAbsPath()+textName);
01728 else
01729 {
01730 pass.TextureDiffuse= new CTextureCross;
01731 nldebug("Missing Tile diffuse texname: %d", tileId);
01732 }
01733 }
01734 else
01735 pass.TextureDiffuse= new CTextureCross;
01736 if(tile)
01737 {
01738 textName= tile->getRelativeFileName (CTile::alpha);
01739 if(textName!="")
01740 pass.TextureAlpha= findTileTexture(TileBank.getAbsPath()+textName);
01741 }
01742
01743
01744 // Fill tileInfo.
01745 tileInfo->DiffuseRdrPass= findTileRdrPass(pass);
01746 // Fill UV Info.
01747 // NB: for now, One Tile== One Texture, so UVScaleBias is simple.
01748 tileInfo->DiffuseUvScaleBias.x= 0;
01749 tileInfo->DiffuseUvScaleBias.y= 0;
01750 tileInfo->DiffuseUvScaleBias.z= 1;
01751 tileInfo->AlphaUvScaleBias.x= 0;
01752 tileInfo->AlphaUvScaleBias.y= 0;
01753 tileInfo->AlphaUvScaleBias.z= 1;
01754 // Retrieve the good rot alpha decal.
01755 if(tile)
01756 tileInfo->RotAlpha= tile->getRotAlpha();
01757 else
01758 tileInfo->RotAlpha= 0;
01759
01760
01761 // Increment RefCount of RenderPart.
01762 // =================================
01763 if(tileInfo->AdditiveRdrPass)
01764 tileInfo->AdditiveRdrPass->RefCount++;
01765 if(tileInfo->DiffuseRdrPass)
01766 tileInfo->DiffuseRdrPass->RefCount++;
01767
01768 }
|
|
|
load a texture for the vegetable, lookup in CPath Definition at line 3174 of file landscape.cpp. References _VegetableManager, and NL3D::CVegetableManager::loadTexture(). Referenced by NL3D::CLandscapeUser::loadVegetableTexture().
03175 {
03176 // load the texture in the manager
03177 _VegetableManager->loadTexture(textureFileName);
03178 }
|
|
|
Definition at line 862 of file landscape.cpp. References _Far0VB, _Far1VB, _TileVB, _VegetableManager, _VertexShaderOk, NL3D::CLandscapeVBAllocator::lockBuffer(), and NL3D::CVegetableManager::lockBuffers(). Referenced by render(), and updateGlobalsAndLockBuffers().
00863 {
00864 _Far0VB.lockBuffer(CLandscapeGlobals::CurrentFar0VBInfo);
00865 _Far1VB.lockBuffer(CLandscapeGlobals::CurrentFar1VBInfo);
00866 _TileVB.lockBuffer(CLandscapeGlobals::CurrentTileVBInfo);
00867
00868 // lock buffer of the vegetable manager.
00869 _VegetableManager->lockBuffers();
00870
00871 // VertexProgrma mode???
00872 CLandscapeGlobals::VertexProgramEnabled= _VertexShaderOk;
00873 }
|
|
|
Definition at line 3010 of file landscape.cpp. References _RootNewLeaves, NLMISC::CBlockMemory< CTessFace >::allocate(), NL3D::CTessFacePListNode::linkInPList(), and TessFaceAllocator. Referenced by NL3D::CPatch::makeRoots(), NL3D::CTessFace::split(), and NL3D::CTessFace::splitRectangular().
03011 {
03012 // allcoate the face.
03013 CTessFace *face= TessFaceAllocator.allocate();
03014
03015 // for refine() mgt, append the face to the list of newLeaves, so they will be tested in refine()
03016 face->linkInPList(_RootNewLeaves);
03017
03018 return face;
03019 }
|
|
|
Definition at line 3034 of file landscape.cpp. References NLMISC::CBlockMemory< CTessFarVertex >::allocate(), and TessFarVertexAllocator. Referenced by NL3D::CTessFace::split(), and NL3D::CTessFace::splitRectangular().
03035 {
03036 return TessFarVertexAllocator.allocate();
03037 }
|
|
|
Definition at line 3028 of file landscape.cpp. References NLMISC::CBlockMemory< CTessNearVertex >::allocate(), and TessNearVertexAllocator. Referenced by NL3D::CTessFace::allocTileUv().
03029 {
03030 return TessNearVertexAllocator.allocate();
03031 }
|
|
|
Definition at line 3022 of file landscape.cpp. References NLMISC::CBlockMemory< CTessVertex >::allocate(), and TessVertexAllocator. Referenced by NL3D::CTessFace::split(), NL3D::CTessFace::splitRectangular(), and NL3D::CTessFace::unbind().
03023 {
03024 return TessVertexAllocator.allocate();
03025 }
|
|
|
Definition at line 3046 of file landscape.cpp. References NLMISC::CBlockMemory< CTileFace >::allocate(), and TileFaceAllocator. Referenced by NL3D::CTessFace::buildTileFaces().
03047 {
03048 return TileFaceAllocator.allocate();
03049 }
|
|
|
Definition at line 3040 of file landscape.cpp. References NLMISC::CBlockMemory< CTileMaterial >::allocate(), and TileMaterialAllocator.
03041 {
03042 return TileMaterialAllocator.allocate();
03043 }
|
|
|
This is especially for Pacs. Each Vertex->EndPos which is not a corner of a patch is set to the mean of its 2 shared Patchs. NB: Works with special cases of rectangular patchs and binded patchs. Definition at line 2939 of file landscape.cpp. Referenced by NL3D::CLandscapeModel::profileRender().
02940 {
02941 // TODO yoyo: new Far mgt profile
02942 /*
02943 std::map<CVector2f, CTextureFarLevelInfo > levelFarMap;
02944
02945 nlinfo("***** Landscape TextureFar Profile. NumTextureFar= %d", _TextureFars.size());
02946 // Profile Texture Allocate
02947 ItSPRenderPassVector itFar;
02948 uint totalMemUsage= 0;
02949 for(itFar= _TextureFars.begin(); itFar!= _TextureFars.end(); itFar++)
02950 {
02951 CPatchRdrPass &pass= **itFar;
02952 CTextureFar *textureFar= safe_cast<CTextureFar*>((ITexture*)pass.TextureDiffuse);
02953
02954 // Info
02955 uint memUsage= textureFar->getPatchWidth()*textureFar->getPatchHeight()*NL_NUM_FAR_PATCHES_BY_TEXTURE*2;
02956 nlinfo(" * Patch Texture Size: (%d,%d) => :%d bytes for %d patchs",
02957 textureFar->getPatchWidth(), textureFar->getPatchHeight(),
02958 memUsage, NL_NUM_FAR_PATCHES_BY_TEXTURE);
02959 totalMemUsage+= memUsage;
02960
02961 // Profile Texture Far Allocated
02962 nlinfo(" * NumberOf Patch in the texture:%d", textureFar->getPatchCount());
02963
02964 // Profile currently used Patchs
02965 uint numRdrPatch= 0;
02966 CPatch *pa= pass.getRdrPatchFar0();
02967 while(pa)
02968 {
02969 numRdrPatch++;
02970 pa= pa->getNextFar0ToRdr();
02971 }
02972 pa= pass.getRdrPatchFar1();
02973 while(pa)
02974 {
02975 numRdrPatch++;
02976 pa= pa->getNextFar1ToRdr();
02977 }
02978 nlinfo(" * NumberOf Patch in frustum for this texture (Far0+Far1):%d", numRdrPatch);
02979
02980 // regroup by level
02981 CVector2f sizeLevel;
02982 sizeLevel.x= (float)textureFar->getPatchWidth();
02983 sizeLevel.y= (float)textureFar->getPatchHeight();
02984 levelFarMap[sizeLevel].NumUsedPatchs+= textureFar->getPatchCount();
02985 levelFarMap[sizeLevel].NumTextures++;
02986 }
02987
02988 nlinfo("***** Landscape TextureFar Level Profile. TotalVideoMemory= %d", totalMemUsage);
02989 std::map<CVector2f, CTextureFarLevelInfo >::iterator itLevelFar= levelFarMap.begin();
02990 while(itLevelFar!=levelFarMap.end())
02991 {
02992 nlinfo(" * Level PatchSize: (%d, %d). Total NumberOf Patch: %d. Use Percentage: %d %%",
02993 (uint)itLevelFar->first.x, (uint)itLevelFar->first.y, itLevelFar->second.NumUsedPatchs,
02994 100*itLevelFar->second.NumUsedPatchs/(itLevelFar->second.NumTextures*NL_NUM_FAR_PATCHES_BY_TEXTURE) );
02995
02996 itLevelFar++;
02997 }
02998 */
02999 }
|
|
||||||||||||||||||||||||
|
Definition at line 3681 of file landscape.cpp. References _ShadowPolyReceiver, and NL3D::CShadowPolyReceiver::render(). Referenced by NL3D::CLandscapeModel::receiveShadowMap().
03682 {
03683 /* substract the PZB from all coordinates. Must add a small Height value because
03684 The rendered Triangles may be computed with VertexProgram, but _ShadowPolyReceiver
03685 does not. => there is a small float difference at the end
03686 Even if same vertex is produced in theory, VertexProgram may cause 2 precision problems:
03687 1/ On NVidia, even with a simple matrix mul VP, the precision result is not the same
03688 2/ Our Landscape VP is not a simple matrix mul. Lot of vertex mul/add are done fpr geomorphs
03689 */
03690 _ShadowPolyReceiver.render(drv, const_cast<CMaterial&>(shadowMat), shadowMap, casterPos, CVector(0,0,0.02f)-pzb);
03691 }
|
|
||||||||||||
|
Definition at line 2048 of file landscape.cpp. References _TextureNears, NL3D::NbTileLightMapByTexture, nlassert, NL3D::CTextureNear::refillRect(), NL3D::CPatchRdrPass::TextureDiffuse, and uint. Referenced by NL3D::CPatch::updateTessBlockLighting().
02049 {
02050 uint id, textNum;
02051
02052 // Get the id local in the texture.
02053 textNum= tileLightMapId / NbTileLightMapByTexture;
02054 id= tileLightMapId % NbTileLightMapByTexture;
02055 nlassert(textNum>=0 && textNum<_TextureNears.size());
02056
02057 // get a ptr on the texture.
02058 CPatchRdrPass *nearRdrPass= _TextureNears[textNum];
02059 CTextureNear *nearText= (CTextureNear*)(ITexture*)nearRdrPass->TextureDiffuse;
02060
02061 // refill this tile
02062 nearText->refillRect(id, map);
02063 }
|
|
|
Refine/Geomorph the tesselation of the landscape. Definition at line 605 of file landscape.cpp. References _MergePriorityList, _OldRefineCenter, _OldRefineCenterSetuped, _RefineMode, _RootNewLeaves, _SplitPriorityList, _VegetableBlockList, _VegetableManager, NL3D::CTessFacePListNode::appendPList(), NL3D::CTessList< CLandscapeVegetableBlock >::begin(), H_AUTO, NL3D::CTessNodeList::Next, NL3D::CTessFacePListNode::nextInPList(), NL3D_PROFILE_LAND_ADD, NL3D_PROFILE_LAND_SET, NLMISC::OptFastFloorBegin(), NLMISC::OptFastFloorEnd(), NL3D::ProfNMerges, NL3D::ProfNRefineComputeFaces, NL3D::ProfNRefineFaces, NL3D::ProfNRefineInTileTransition, NL3D::ProfNRefineLeaves, NL3D::ProfNRefineWithLowDistance, NL3D::ProfNSplits, NL3D::ProfNSplitsPass, NL3D::CTessFacePriorityList::shift(), NL3D::CTessFacePriorityList::shiftAll(), unlockBuffers(), NL3D::CLandscapeVegetableBlock::update(), updateGlobalsAndLockBuffers(), NL3D::CVegetableManager::updateLighting(), NL3D::CTessFace::updateRefineMerge(), NL3D::CTessFace::updateRefineSplit(), and updateTessBlocksFaceVector(). Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape().
00606 {
00607 NL3D_PROFILE_LAND_SET(ProfNRefineFaces, 0);
00608 NL3D_PROFILE_LAND_SET(ProfNRefineComputeFaces, 0);
00609 NL3D_PROFILE_LAND_SET(ProfNRefineLeaves, 0);
00610 NL3D_PROFILE_LAND_SET(ProfNSplits, 0);
00611 NL3D_PROFILE_LAND_SET(ProfNMerges, 0);
00612 NL3D_PROFILE_LAND_SET(ProfNRefineInTileTransition, 0);
00613 NL3D_PROFILE_LAND_SET(ProfNRefineWithLowDistance, 0);
00614 NL3D_PROFILE_LAND_SET(ProfNSplitsPass, 0);
00615
00616 if(!_RefineMode)
00617 return;
00618
00619 // Update the priority list.
00620 // ==========================
00621 CTessFacePListNode rootSplitTessFaceToUpdate;
00622 CTessFacePListNode rootMergeTessFaceToUpdate;
00623 if( !_OldRefineCenterSetuped )
00624 {
00625 // If never refine, and setup OldRefineCetner
00626 _OldRefineCenterSetuped= true;
00627 _OldRefineCenter= refineCenter;
00628
00629 // then shift all faces
00630 _SplitPriorityList.shiftAll(rootSplitTessFaceToUpdate);
00631 _MergePriorityList.shiftAll(rootMergeTessFaceToUpdate);
00632 }
00633 else
00634 {
00635 // else, compute delta between positions
00636 CVector diff= refineCenter - _OldRefineCenter;
00637 _OldRefineCenter= refineCenter;
00638
00639 // and shift according to distance of deplacement.
00640 _SplitPriorityList.shift(diff, rootSplitTessFaceToUpdate);
00641 _MergePriorityList.shift(diff, rootMergeTessFaceToUpdate);
00642 }
00643
00644
00645 // Refine Faces which may need it.
00646 // ==========================
00647 // Update globals
00648 updateGlobalsAndLockBuffers (refineCenter);
00649 // NB: refine may change vertices in VB in visible patchs => buffers are locked.
00650
00651 // Increment the update date.
00652 CLandscapeGlobals::CurrentDate++;
00653
00654 // Because CTessFacePriorityList::insert use it.
00655 NLMISC::OptFastFloorBegin();
00656
00657 /* While there is still face in list, update them
00658 NB: updateRefine() always insert the face in _***PriorityList, so face is removed from
00659 root***TessFaceToUpdate list.
00660 NB: it is possible ( with enforced merge() ) that faces dissapears from root***TessFaceToUpdate list
00661 before they are traversed here. It is why we must use a Circular list system, and not an array of elements.
00662 Basically. TessFaces are ALWAYS in a list, either in one of the entry list in _***PriorityList, or in
00663 root***TessFaceToUpdate list.
00664
00665 It is newTessFace() and deleteTessFace() which insert/remove the nodes in the list.
00666 */
00667 // Update the Merge priority list.
00668 while( rootMergeTessFaceToUpdate.nextInPList() != &rootMergeTessFaceToUpdate )
00669 {
00670 // Get the face.
00671 CTessFace *face= static_cast<CTessFace*>(rootMergeTessFaceToUpdate.nextInPList());
00672
00673 // update the refine of this face. This may lead in deletion (merge) of other faces which are still in
00674 // root***TessFaceToUpdate, but it's work.
00675 face->updateRefineMerge();
00676 }
00677
00678
00679 // Update the Split priority list.
00680 do
00681 {
00682 NL3D_PROFILE_LAND_ADD(ProfNSplitsPass, 1);
00683
00684 // Append the new leaves, to the list of triangles to update
00685 rootSplitTessFaceToUpdate.appendPList(_RootNewLeaves);
00686
00687 // While triangle to test for split exists
00688 while( rootSplitTessFaceToUpdate.nextInPList() != &rootSplitTessFaceToUpdate )
00689 {
00690 // Get the face.
00691 CTessFace *face= static_cast<CTessFace*>(rootSplitTessFaceToUpdate.nextInPList());
00692
00693 // update the refine of this face.
00694 face->updateRefineSplit();
00695 }
00696
00697 }
00698 // do it until we are sure no more split is needed, ie no more faces are created
00699 while( _RootNewLeaves.nextInPList() != &_RootNewLeaves );
00700
00701 // Because CTessFacePriorityList::insert use it.
00702 NLMISC::OptFastFloorEnd();
00703
00704
00705 // Before unlockBuffers, test for vegetable IG creation.
00706 {
00707 H_AUTO( NL3D_Vegetable_Update );
00708
00709 // Because CLandscapeVegetableBlock::update() use OptFastFloor..
00710 NLMISC::OptFastFloorBegin();
00711
00712 // For each vegetableBlock, test IG creation
00713 CLandscapeVegetableBlock *vegetBlock= _VegetableBlockList.begin();
00714 for(;vegetBlock!=NULL; vegetBlock= (CLandscapeVegetableBlock*)vegetBlock->Next)
00715 {
00716 vegetBlock->update(refineCenter, _VegetableManager);
00717 }
00718
00719 // update lighting for vegetables
00720 _VegetableManager->updateLighting();
00721
00722 // Stop fastFloor optim.
00723 NLMISC::OptFastFloorEnd();
00724 }
00725
00726
00727 // Must realase VB Buffers
00728 unlockBuffers();
00729
00730 // refine() may cause change in faces in visible patchs.
00731 updateTessBlocksFaceVector();
00732
00733 }
|
|
|
Refine/Geomorph ALL the tesselation of the landscape, from the view point refineCenter. Even if !RefineMode.
Definition at line 737 of file landscape.cpp. References NL3D::ItZoneMap, unlockBuffers(), updateGlobalsAndLockBuffers(), updateTessBlocksFaceVector(), and Zones. Referenced by NL3D::CZoneLighter::addTriangles(), NL3D::CInstanceLighter::addTriangles(), and NL3D::CZoneLighter::buildZoneInformation().
00738 {
00739 // -1. Update globals
00740 updateGlobalsAndLockBuffers (refineCenter);
00741 // NB: refineAll may change vertices in VB in visible patchs => buffers are locked.
00742
00743 // Increment the update date.
00744 CLandscapeGlobals::CurrentDate++;
00745
00746 for(ItZoneMap it= Zones.begin();it!=Zones.end();it++)
00747 {
00748 (*it).second->refineAll();
00749 }
00750
00751 // Must realase VB Buffers
00752 unlockBuffers();
00753
00754 // refineAll() may cause change in faces in visible patchs.
00755 updateTessBlocksFaceVector();
00756 }
|
|
|
Definition at line 1772 of file landscape.cpp. References NL3D::CLandscape::CTileInfo::AdditiveRdrPass, NL3D::CLandscape::CTileInfo::DiffuseRdrPass, nlassert, NL3D::CPatchRdrPass::RefCount, TileInfos, and uint16. Referenced by releaseTiles().
01773 {
01774 CTileInfo *tileInfo;
01775 tileInfo= TileInfos[tileId];
01776 nlassert(tileInfo!=NULL);
01777
01778 // "Release" the rdr pass.
01779 if(tileInfo->AdditiveRdrPass)
01780 tileInfo->AdditiveRdrPass->RefCount--;
01781 if(tileInfo->DiffuseRdrPass)
01782 tileInfo->DiffuseRdrPass->RefCount--;
01783
01784 delete tileInfo;
01785 TileInfos[tileId]= NULL;
01786 }
|
|
|
Definition at line 2026 of file landscape.cpp. References _NFreeLightMaps, _TextureNears, _ULTotalNearPixels, NL3D::NbTileLightMapByTexture, NL_TILE_LIGHTMAP_SIZE, nlassert, NL3D::CTextureNear::releaseTile(), NL3D::CPatchRdrPass::TextureDiffuse, and uint. Referenced by NL3D::CPatch::releaseTileLightMap().
02027 {
02028 uint id, textNum;
02029
02030 // Get the id local in the texture.
02031 textNum= tileLightMapId / NbTileLightMapByTexture;
02032 id= tileLightMapId % NbTileLightMapByTexture;
02033 nlassert(textNum>=0 && textNum<_TextureNears.size());
02034
02035 // Release the tile in this texture.
02036 CPatchRdrPass *nearRdrPass= _TextureNears[textNum];
02037 CTextureNear *nearText= (CTextureNear*)(ITexture*)nearRdrPass->TextureDiffuse;
02038 nearText->releaseTile(id);
02039 _NFreeLightMaps++;
02040
02041 // updateLighting
02042 // Decrement number of pixels to update for near.
02043 _ULTotalNearPixels-= NL_TILE_LIGHTMAP_SIZE*NL_TILE_LIGHTMAP_SIZE;
02044 }
|
|
||||||||||||
|
Force a range of tiles to be loaded in the driver...
Definition at line 1912 of file landscape.cpp. References ItTileRdrPassSet, releaseTile(), sint, TileInfos, TileRdrPassSet, and uint16. Referenced by initTileBank().
01913 {
01914 // release tiles.
01915 for(sint tileId= tileStart; tileId<tileStart+nbTiles; tileId++)
01916 {
01917 CTileInfo *tile= TileInfos[tileId];
01918 if(tile!=NULL)
01919 {
01920 releaseTile(tileId);
01921 }
01922 }
01923
01924 // For all rdrpass, release one that are no more referenced.
01925 ItTileRdrPassSet it;
01926 for(it= TileRdrPassSet.begin(); it!=TileRdrPassSet.end();)
01927 {
01928 // If no more tile access the rdrpass, delete it.
01929 if((*it).RefCount==0)
01930 {
01931 ItTileRdrPassSet itDel=it++;
01932 TileRdrPassSet.erase(itDel);
01933 }
01934 else
01935 it++;
01936 }
01937
01938 // Textures are automaticly deleted by smartptr, but not their entry int the map (TileTextureMap).
01939 // => doesn't matter since findTileTexture() manages this case.
01940 // And the memory overhead is not a problem (we talk about pointers).
01941 }
|
|
|
This method remove all PointLights in all Zones, and hence reset TileLightInfluences. Definition at line 3298 of file landscape.cpp. References NL3D::ItZoneMap, NL3D::CPatch::resetTileLightInfluences(), sint, and Zones.
03299 {
03300 for(ItZoneMap it= Zones.begin();it!=Zones.end();it++)
03301 {
03302 // for all patch.
03303 sint N= (*it).second->getNumPatchs();
03304 for(sint i=0;i<N;i++)
03305 {
03306 // Clear TileLightInfluences
03307 CPatch *pa= ((*it).second)->getPatch(i);
03308 pa->resetTileLightInfluences();
03309 }
03310
03311 // Remove all PointLights.
03312 (*it).second->_PointLightArray.clear();
03313 }
03314
03315 }
|
|
|
Definition at line 3669 of file landscape.cpp. References _ShadowPolyReceiver, NL3D::CShadowPolyReceiver::removeTriangle(), and NL3D::CTessFace::ShadowMapTriId. Referenced by NL3D::CPatch::removeFaceFromTileRenderList().
03670 {
03671 if(face->ShadowMapTriId!=-1)
03672 {
03673 _ShadowPolyReceiver.removeTriangle(face->ShadowMapTriId);
03674 // set NULL Id.
03675 face->ShadowMapTriId=-1;
03676 }
03677 }
|
|
|
remove a zone by its unique Id. The zone is release()-ed (disconnected), then deleted.
Definition at line 447 of file landscape.cpp. References _PatchQuadGrid, NL3D::CQuadGrid< CPatchIdentEx >::begin(), NL3D::CQuadGrid< CPatchIdentEx >::clearSelection(), NL3D::CQuadGrid< CPatchIdentEx >::end(), NL3D::CQuadGrid< CPatchIdentEx >::erase(), NLMISC::CAABBoxExt::getAABBox(), NLMISC::CAABBox::getHalfSize(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), NL3D::CZone::getNumPatchs(), NL3D::CZone::getZoneBB(), NL3D::CZone::getZoneId(), nlassert, NL3D::CZone::release(), NL3D::CQuadGrid< CPatchIdentEx >::select(), NLMISC::CAABBox::setHalfSize(), sint, uint16, unlockBuffers(), updateGlobalsAndLockBuffers(), updateTessBlocksFaceVector(), and Zones. Referenced by clear(), NL3D::CLandscapeUser::refreshZonesAround(), and NL3D::CLandscapeUser::removeAllZones().
00448 {
00449 // -1. Update globals
00450 updateGlobalsAndLockBuffers (CVector::Null);
00451 // NB: remove a zone may change vertices in VB in visible patchs => buffers are locked.
00452
00453 // find the zone.
00454 if(Zones.find(zoneId)==Zones.end())
00455 {
00456 unlockBuffers();
00457 return false;
00458 }
00459 CZone *zone= Zones[zoneId];
00460
00461
00462 // delete patchs from this zone to the quadgrid.
00463 // use the quadgrid itself to find where patch are. do this using bbox of zone.
00464 CAABBox zoneBBForErase= zone->getZoneBB().getAABBox();
00465 // Avoid precision problems by enlarging a little bbox size of zone for erase
00466 zoneBBForErase.setHalfSize( zoneBBForErase.getHalfSize() * 1.1f);
00467 // select iterators in the area of this zone.
00468 _PatchQuadGrid.clearSelection();
00469 _PatchQuadGrid.select(zoneBBForErase.getMin(), zoneBBForErase.getMax());
00470 // for each patch, remove it if from deleted zone.
00471 CQuadGrid<CPatchIdentEx>::CIterator it;
00472 sint nPatchRemoved= 0;
00473 for(it= _PatchQuadGrid.begin(); it!= _PatchQuadGrid.end();)
00474 {
00475 // if the patch belong to the zone to remove
00476 if( (*it).ZoneId== zone->getZoneId() )
00477 {
00478 // remove from the quadgrid.
00479 it= _PatchQuadGrid.erase(it);
00480 nPatchRemoved++;
00481 }
00482 else
00483 it++;
00484 }
00485 // verify we have removed all patch in the quadGrid for this zone
00486 nlassert(nPatchRemoved==zone->getNumPatchs());
00487
00488
00489 // remove the zone.
00490 zone->release(Zones);
00491 delete zone;
00492
00493 // Must realase VB Buffers
00494 unlockBuffers();
00495
00496 // because of forceMerge() at unbind, removeZone() can cause change in faces in other (visible) zones.
00497 updateTessBlocksFaceVector();
00498
00499 return true;
00500 }
|
|
||||||||||||||||||||
|
Render the landscape. A more precise clip is made on TessBlocks. pyramid should be the same as one passed to clip(). For optimisation, this pyramid should contains only the Left/Right and Top/Bottom clip planes, in this order.
Definition at line 939 of file landscape.cpp. References _DLMGlobalVegetableColor, _Far0VB, _Far1VB, _PatchDLMContextList, _PointLightDiffuseMaterial, _PZBModelPosition, _RenderMustRefillVB, _TextureDLM, _TextureFars, _TextureNears, _TileVB, _VegetableManager, _VertexShaderOk, _VPThresholdChange, NL3D::CLandscapeVBAllocator::activate(), NLMISC::CRGBA::B, NL3D::CTessList< CPatchDLMContext >::begin(), NL3D::CPatchRdrPass::clearAllRenderList(), NL3D::CPatchDLMContext::compileLighting(), NL3D::CPatch::computeSoftwareGeomorphAndAlpha(), NL3D::drawPassTriArray(), FarMaterial, NL3D::CPatch::fillVBIfVisible(), NLMISC::CRGBA::G, NL3D::CPatch::getFar0(), NL3D::CPatch::getFar1(), NL3D::CRdrTileId::getNext(), NL3D::CPatch::getNextFar0ToRdr(), NL3D::CPatch::getNextFar1ToRdr(), NL3D::CPatchDLMContext::getPatch(), NL3D::CPatchRdrPass::getRdrPatchFar0(), NL3D::CPatchRdrPass::getRdrPatchFar1(), NL3D::CPatchRdrPass::getRdrTileRoot(), NL3D::CMaterial::getTexEnvMode(), NL3D::CPatch::getTileMaterialRefCount(), H_AFTER, H_BEFORE, NL3D::initPassTriArray(), NL3D::CPatch::isRenderClipped(), isVegetableActive(), ItSPRenderPassVector, ItTileRdrPassSet, NL3D::ItZoneMap, lockBuffers(), min, NL3D::CTessNodeList::Next, NL3D::NL3D_LandscapeGlobals_PassNTri, NL3D_MAX_TILE_PASS, NL3D_PROFILE_LAND_SET, NL3D_TESSBLOCK_NUM_CLIP_PLANE, NL3D_TILE_PASS_ADD, NL3D_TILE_PASS_LIGHTMAP, NL3D_TILE_PASS_RGB0, NL3D_TILE_PASS_RGB1, NL3D_TILE_PASS_RGB2, nlassert, nlstop, NL3D::IDriver::profileSetupedMaterials(), NL3D::ProfNFar0SetupMaterial, NL3D::ProfNFar1SetupMaterial, NL3D::ProfNPatchRdrFar0, NL3D::ProfNPatchRdrFar1, NL3D::ProfNRdrFar0, NL3D::ProfNRdrFar1, NL3D::ProfNRdrTile, NL3D::ProfNTileSetupMaterial, NLMISC::CRGBA::R, NL3D::CLandscapeVBAllocator::reallocationOccurs(), NL3D::CVegetableManager::render(), NL3D::CPatch::renderFar0(), NL3D::CPatch::renderFar1(), NL3D::CTileMaterial::renderTile(), NL3D::CTileMaterial::renderTilePassLightmap(), NL3D::CTileMaterial::renderTilePassRGB0(), NL3D::CVegetableManager::resetNumVegetableFaceRendered(), NL3D::CLandscapeVBAllocator::resetReallocation(), NL3D::CMaterial::setBlend(), NL3D::CMaterial::setBlendFunc(), NL3D::IDriver::setConstant(), NL3D::IDriver::setConstantMatrix(), NL3D::CMaterial::setTexEnvMode(), NL3D::CMaterial::setTexture(), sint, synchronizeATIVBHards(), NL3D::CMaterial::texConstantColor(), NL3D::CMaterial::texEnvArg0Alpha(), NL3D::CMaterial::texEnvArg0RGB(), NL3D::CMaterial::texEnvArg1Alpha(), NL3D::CMaterial::texEnvArg1RGB(), NL3D::CMaterial::texEnvOpAlpha(), NL3D::CMaterial::texEnvOpRGB(), NL3D::CPatchRdrPass::TextureAlpha, NL3D::CPatchRdrPass::TextureDiffuse, NL3D::CRdrTileId::TileMaterial, TileMaterial, TileRdrPassSet, uint, uint8, unlockBuffers(), updateGlobalsAndLockBuffers(), v, and Zones. Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape().
00940 {
00941 IDriver *driver= _Driver;
00942 nlassert(driver);
00943
00944 // Increment the update date for preRender.
00945 CLandscapeGlobals::CurrentRenderDate++;
00946
00947
00948 ItZoneMap it;
00949 sint i;
00950 ItTileRdrPassSet itTile;
00951 ItSPRenderPassVector itFar;
00952
00953 // Yoyo: profile.
00954 NL3D_PROFILE_LAND_SET(ProfNRdrFar0, 0);
00955 NL3D_PROFILE_LAND_SET(ProfNRdrFar1, 0);
00956 NL3D_PROFILE_LAND_SET(ProfNPatchRdrFar0, 0);
00957 NL3D_PROFILE_LAND_SET(ProfNPatchRdrFar1, 0);
00958 for(i=0;i<NL3D_MAX_TILE_PASS;i++)
00959 {
00960 NL3D_PROFILE_LAND_SET(ProfNRdrTile[i], 0);
00961 }
00962
00963
00964 // -2. Update globals
00965 //====================
00966 updateGlobalsAndLockBuffers (refineCenter);
00967 // NB: render may change vertices in VB in visible patchs => buffers are locked.
00968
00969
00970 // -1. clear all PatchRenderPass renderList
00971 //===================
00972
00973 H_BEFORE( NL3D_Landscape_Render_Clear );
00974
00975 // Fars.
00976 for(itFar= _TextureFars.begin(); itFar!= _TextureFars.end(); itFar++)
00977 {
00978 CPatchRdrPass &pass= **itFar;
00979 // clear list.
00980 pass.clearAllRenderList();
00981 }
00982
00983 // Tiles.
00984 for(itTile= TileRdrPassSet.begin(); itTile!= TileRdrPassSet.end(); itTile++)
00985 {
00986 CPatchRdrPass &pass= const_cast<CPatchRdrPass&>(*itTile);
00987 // clear list.
00988 pass.clearAllRenderList();
00989 }
00990
00991 // Lightmaps.
00992 for(sint lightRdrPass=0; lightRdrPass<(sint)_TextureNears.size(); lightRdrPass++)
00993 {
00994 CPatchRdrPass &pass= *_TextureNears[lightRdrPass];
00995 // clear list.
00996 pass.clearAllRenderList();
00997 }
00998
00999 H_AFTER( NL3D_Landscape_Render_Clear );
01000
01001 // 0. preRender pass.
01002 //===================
01003
01004 H_BEFORE( NL3D_Landscape_Render_PreRender );
01005
01006 // change Far0 / Far1.
01007 // Clip TessBlocks against pyramid and Far Limit.
01008 for(i=0; i<NL3D_TESSBLOCK_NUM_CLIP_PLANE; i++)
01009 {
01010 CTessBlock::CurrentPyramid[i]= pyramid[i];
01011 }
01012 // Update VB with change of Far0 / Far1.
01013 for(it= Zones.begin();it!=Zones.end();it++)
01014 {
01015 (*it).second->preRender();
01016 }
01017
01018 H_AFTER( NL3D_Landscape_Render_PreRender );
01019 H_BEFORE( NL3D_Landscape_Render_Refill );
01020
01021 // Reallocation Mgt. If any of the VB is reallocated, we must refill it entirely.
01022 // NB: all VBs are refilled entirely. It is not optimal (maybe 3* too slow), but reallocation are supposed
01023 // to be very rare.
01024 if( _Far0VB.reallocationOccurs() || _Far1VB.reallocationOccurs() || _TileVB.reallocationOccurs() )
01025 _RenderMustRefillVB= true;
01026
01027 // VertexProgram dependency on RefineThreshold Management. If VertexShader, and if the refineThreshold has
01028 // changed since the last time, we must refill All the VB, because data are out of date.
01029 if( _VertexShaderOk && _VPThresholdChange )
01030 {
01031 _VPThresholdChange= false;
01032 _RenderMustRefillVB= true;
01033 }
01034
01035 // If we must refill the VB (for any reason).
01036 if(_RenderMustRefillVB )
01037 {
01038 // Ok, ok, we refill All the VB with good data.
01039 _RenderMustRefillVB= false;
01040
01041 // First reset the flag, so fillVB() will effectively fill the VB.
01042 _Far0VB.resetReallocation();
01043 _Far1VB.resetReallocation();
01044 _TileVB.resetReallocation();
01045
01046 // Then recompute good VBInfo (those in CurrentVBInfo are false!!).
01047 // Do it by unlocking then re-locking Buffers.
01048 unlockBuffers();
01049 lockBuffers();
01050
01051 // Finally, fill the VB for all patchs visible.
01052 for(it= Zones.begin();it!=Zones.end();it++)
01053 {
01054 if((*it).second->ClipResult==CZone::ClipOut)
01055 continue;
01056 for(sint i=0;i<(*it).second->getNumPatchs(); i++)
01057 {
01058 CPatch *patch= (*it).second->getPatch(i);
01059 patch->fillVBIfVisible();
01060 }
01061 }
01062 }
01063
01064 H_AFTER( NL3D_Landscape_Render_Refill );
01065 H_BEFORE( NL3D_Landscape_Render_SoftGeomorph );
01066
01067 // If software GeoMorph / Alpha Transition (no VertexShader), do it now.
01068 if(!_VertexShaderOk)
01069 {
01070 // For all patch visible, compute geomoprh and alpha in software.
01071 for(it= Zones.begin();it!=Zones.end();it++)
01072 {
01073 if((*it).second->ClipResult==CZone::ClipOut)
01074 continue;
01075 for(sint i=0;i<(*it).second->getNumPatchs(); i++)
01076 {
01077 CPatch *patch= (*it).second->getPatch(i);
01078 // If visible, compute Geomorph And Alpha
01079 patch->computeSoftwareGeomorphAndAlpha();
01080 }
01081 }
01082
01083 /*
01084 Optim note: here, lot of vertices are
01085 1/ geomorphed twice (vertices on edges of patchs)
01086 2/ vertices are geomorphed, but not used (because o the Tessblock clip),
01087 because lot of vertices used by faces in small TessBlocks are still in MasterBlock.
01088
01089 Some tries have been made to solve this, but result are even worse (2 times or more), because:
01090 1/
01091 - does not really matter edges of patchs (and corner) because the majority is in interior of patch.
01092 - in this case, we need to reset all the flags which is very costly (reparse all zones...) .
01093 2/ Except for the old CTessBlockEdge management which not solve all the thing, the other solution is
01094 to test all faces not clipped (on a per TessBlock basis), to compute only vertices needed.
01095 But in this cases, result are worse, maybe because there is 6 times more tests, and with bad BTB cache.
01096 */
01097 }
01098
01099 H_AFTER( NL3D_Landscape_Render_SoftGeomorph );
01100
01101 // Must realase VB Buffers Now!! The VBuffers are now OK!
01102 // NB: no parallelism is made between 3dCard and Fill of vertices.
01103 // We Suppose Fill of vertices is rare, and so do not need to be parallelized.
01104 unlockBuffers();
01105
01106
01107 // Special for ATI: only copy all VBs to VBHard one time per frame
01108 synchronizeATIVBHards();
01109
01110
01111 // If VertexShader enabled, setup VertexProgram Constants.
01112 if(_VertexShaderOk)
01113 {
01114 // c[0..3] take the ModelViewProjection Matrix.
01115 driver->setConstantMatrix(0, IDriver::ModelViewProjection, IDriver::Identity);
01116 // c[4] take usefull constants.
01117 driver->setConstant(4, 0, 1, 0.5f, 0);
01118 // c[5] take RefineCenter
01119 driver->setConstant(5, refineCenter);
01120 // c[6] take info for Geomorph trnasition to TileNear.
01121 driver->setConstant(6, CLandscapeGlobals::TileDistFarSqr, CLandscapeGlobals::OOTileDistDeltaSqr, 0, 0);
01122 // c[8..11] take the ModelView Matrix.
01123 driver->setConstantMatrix(8, IDriver::ModelView, IDriver::Identity);
01124 // c[12] take the current landscape Center / delta Pos to apply
01125 driver->setConstant(12, _PZBModelPosition);
01126 }
01127
01128
01129 // 1. TileRender pass.
01130 //====================
01131
01132 // Yoyo: profile
01133 NL3D_PROFILE_LAND_SET(ProfNTileSetupMaterial, driver->profileSetupedMaterials() );
01134 H_BEFORE( NL3D_Landscape_Render_Tile );
01135
01136 // First, update Dynamic Lighting for Near, ie multiply Dynamic Lightmap with UserColor, and upload to texture.
01137 // ==================
01138 CPatchDLMContext *dlmCtxPtr= _PatchDLMContextList->begin();
01139 while(dlmCtxPtr!=NULL)
01140 {
01141 // do it only if the patch has some Near stuff to render, and if it is visible
01142 if(dlmCtxPtr->getPatch()->getFar0() == 0
01143 && !dlmCtxPtr->getPatch()->isRenderClipped() )
01144 {
01145 // upload lightmap into textureDLM, modulating before with patch TileColor.
01146 // NB: no-op if both src and dst are already full black.
01147 dlmCtxPtr->compileLighting(CPatchDLMContext::ModulateTileColor);
01148 }
01149
01150 // next
01151 dlmCtxPtr= (CPatchDLMContext*)dlmCtxPtr->Next;
01152 }
01153
01154
01155 // Active VB.
01156 // ==================
01157
01158 // Active the good VB, and maybe activate the VertexProgram Nb 0.
01159 _TileVB.activate(0);
01160
01161
01162 // Render.
01163 // ==================
01164 // Before any render call. Set the global driver used to render.
01165 CLandscapeGlobals::PatchCurrentDriver= driver;
01166
01167 // Render Order. Must "invert", since initial order is NOT the render order. This is done because the lightmap pass
01168 // DO NOT have to do any renderTile(), since it is computed in RGB0 pass.
01169 nlassert(NL3D_MAX_TILE_PASS==5);
01170 static sint RenderOrder[NL3D_MAX_TILE_PASS]= {NL3D_TILE_PASS_RGB0, NL3D_TILE_PASS_RGB1, NL3D_TILE_PASS_RGB2,
01171 NL3D_TILE_PASS_LIGHTMAP, NL3D_TILE_PASS_ADD};
01172 // For ALL pass..
01173 for(i=0; i<NL3D_MAX_TILE_PASS; i++)
01174 {
01175 sint passOrder= RenderOrder[i];
01176
01177
01178 // If VertexShader enabled, and if lightmap or post Add pass, must setup good VertexProgram
01179 if(_VertexShaderOk)
01180 {
01181 if(passOrder == NL3D_TILE_PASS_LIGHTMAP)
01182 {
01183 // Must activate the vertexProgram to take TexCoord2 to stage0
01184 _TileVB.activate(1);
01185 }
01186 else if(passOrder == NL3D_TILE_PASS_ADD)
01187 {
01188 // Must re-activate the standard VertexProgram
01189 _TileVB.activate(0);
01190 }
01191 }
01192
01193
01194 // Do add pass???
01195 if((passOrder==NL3D_TILE_PASS_ADD) && !doTileAddPass)
01196 continue;
01197
01198
01199 // Setup common material for this pass.
01200 //=============================
01201 // Default: Replace envmode.
01202 TileMaterial.texEnvOpRGB(0, CMaterial::Replace);
01203 TileMaterial.texEnvArg0RGB(0, CMaterial::Texture, CMaterial::SrcColor);
01204 TileMaterial.texEnvOpAlpha(0, CMaterial::Replace);
01205 TileMaterial.texEnvArg0Alpha(0, CMaterial::Texture, CMaterial::SrcAlpha);
01206 // NB: important to set Replace and not modulate, because in case of VerexProgram enabled,
01207 // Diffuse o[COL0] is undefined.
01208
01209 // Copy from stage 0 to stage 1.
01210 TileMaterial.setTexEnvMode(1, TileMaterial.getTexEnvMode(0));
01211
01212 // setup multitex / blending.
01213 if(passOrder==NL3D_TILE_PASS_RGB0)
01214 {
01215 // first pass, no blend.
01216 TileMaterial.setBlend(false);
01217 }
01218 else
01219 {
01220 TileMaterial.setBlend(true);
01221 switch(passOrder)
01222 {
01223 case NL3D_TILE_PASS_RGB1:
01224 case NL3D_TILE_PASS_RGB2:
01225 // alpha blending.
01226 TileMaterial.setBlendFunc(CMaterial::srcalpha, CMaterial::invsrcalpha);
01227
01228 // Must use a special envmode for stage1: "separateAlpha"!!.
01229 // keep the color from previous stage.
01230 TileMaterial.texEnvOpRGB(1, CMaterial::Replace);
01231 TileMaterial.texEnvArg0RGB(1, CMaterial::Previous, CMaterial::SrcColor);
01232 // take the alpha from current stage.
01233 TileMaterial.texEnvOpAlpha(1, CMaterial::Replace);
01234 TileMaterial.texEnvArg0Alpha(1, CMaterial::Texture, CMaterial::SrcAlpha);
01235 break;
01236 case NL3D_TILE_PASS_LIGHTMAP:
01237 // modulate alpha blending.
01238 TileMaterial.setBlendFunc(CMaterial::zero, CMaterial::srccolor);
01239
01240 // Setup the material envCombine so DynamicLightmap (stage 0) is added to static lightmap.
01241 TileMaterial.texEnvOpRGB(1, CMaterial::Add);
01242 TileMaterial.texEnvArg0RGB(1, CMaterial::Texture, CMaterial::SrcColor);
01243 TileMaterial.texEnvArg1RGB(1, CMaterial::Previous, CMaterial::SrcColor);
01244
01245 break;
01246 case NL3D_TILE_PASS_ADD:
01247 // Use srcalpha for src (and not ONE), since additive are blended with alpha Cte/AlphaTexture
01248 TileMaterial.setBlendFunc(CMaterial::srcalpha, CMaterial::one);
01249
01250 // for MAYBE LATER smooth night transition, setup Alpha cte of stage0, and setup alpha stage.
01251 TileMaterial.texEnvOpAlpha(0, CMaterial::Replace);
01252 TileMaterial.texEnvArg0Alpha(0, CMaterial::Constant, CMaterial::SrcAlpha);
01253 // Temp, just setup alpha to 1.
01254 TileMaterial.texConstantColor(0, CRGBA(255, 255, 255, 255));
01255
01256 // Must use a special envmode for stage1: "separateAlpha"!!.
01257 // NB: it still works if The RdrPass has no texture.
01258 // keep the color from previous stage.
01259 TileMaterial.texEnvOpRGB(1, CMaterial::Replace);
01260 TileMaterial.texEnvArg0RGB(1, CMaterial::Previous, CMaterial::SrcColor);
01261 // modulate the alpha of current stage with previous
01262 TileMaterial.texEnvOpAlpha(1, CMaterial::Modulate);
01263 TileMaterial.texEnvArg0Alpha(1, CMaterial::Texture, CMaterial::SrcAlpha);
01264 TileMaterial.texEnvArg1Alpha(1, CMaterial::Previous, CMaterial::SrcAlpha);
01265
01266 break;
01267 default:
01268 nlstop;
01269 };
01270 }
01271 // Reset the textures (so there is none in Addtive pass or in Lightmap).
01272 TileMaterial.setTexture(0, NULL);
01273 TileMaterial.setTexture(1, NULL);
01274 TileMaterial.setTexture(2, NULL);
01275
01276
01277 // Render All material RdrPass.
01278 //=============================
01279 // Special code for Lightmap and RGB0, for faster render.
01280 if(passOrder==NL3D_TILE_PASS_RGB0)
01281 {
01282 // RGB0 pass.
01283 ItTileRdrPassSet itTile;
01284 for(itTile= TileRdrPassSet.begin(); itTile!= TileRdrPassSet.end(); itTile++)
01285 {
01286 // Get a ref on the render pass. Const cast work because we only modify attribut from CPatchRdrPass
01287 // that don't affect the operator< of this class
01288 CPatchRdrPass &pass= const_cast<CPatchRdrPass&>(*itTile);
01289
01290 // Enlarge PassTriArray as needed
01291 initPassTriArray(pass);
01292
01293 // Setup Diffuse texture of the tile.
01294 TileMaterial.setTexture(0, pass.TextureDiffuse);
01295
01296 // Add triangles to array
01297 CRdrTileId *tileToRdr= pass.getRdrTileRoot(passOrder);
01298 while(tileToRdr)
01299 {
01300 // renderSimpleTriangles() with the material setuped.
01301 tileToRdr->TileMaterial->renderTilePassRGB0();
01302 tileToRdr= (CRdrTileId*)tileToRdr->getNext();
01303 }
01304 // Render triangles.
01305 drawPassTriArray(TileMaterial);
01306 }
01307 }
01308 else if(passOrder==NL3D_TILE_PASS_LIGHTMAP)
01309 {
01310 // Lightmap Pass.
01311 /* \todo yoyo: TODO_CLOUD: setup stage2, and setup texcoord generation. COMPLEX because of interaction
01312 with Dynamic LightMap
01313 */
01314
01315 // Setup the Dynamic Lightmap into stage 0.
01316 TileMaterial.setTexture(0, _TextureDLM);
01317
01318 // if vertex shader not used.
01319 if(!_VertexShaderOk)
01320 {
01321 // special setup such that stage0 takes Uv2.
01322 driver->mapTextureStageToUV(0, 2);
01323 }
01324 // else VertexProgram map itself the good vertex Attribute to UV0.
01325
01326
01327 // Render All the lightmaps.
01328 for(sint lightRdrPass=0; lightRdrPass<(sint)_TextureNears.size(); lightRdrPass++)
01329 {
01330 CPatchRdrPass &pass= *_TextureNears[lightRdrPass];
01331
01332 // Enlarge PassTriArray as needed
01333 initPassTriArray(pass);
01334
01335 // Setup Lightmap into stage1. Because we share UV with pass RGB0. So we use UV1.
01336 // Also, now stage0 is used for DynamicLightmap
01337 TileMaterial.setTexture(1, pass.TextureDiffuse);
01338
01339 // Add triangles to array
01340 CRdrTileId *tileToRdr= pass.getRdrTileRoot(passOrder);
01341 while(tileToRdr)
01342 {
01343 // renderSimpleTriangles() with the material setuped.
01344 tileToRdr->TileMaterial->renderTilePassLightmap();
01345 tileToRdr= (CRdrTileId*)tileToRdr->getNext();
01346 }
01347 // Render triangles.
01348 drawPassTriArray(TileMaterial);
01349 }
01350
01351 // if vertex shader not used.
01352 if(!_VertexShaderOk)
01353 {
01354 // Reset special stage/UV setup to normal behavior
01355 driver->mapTextureStageToUV(0, 0);
01356 }
01357 }
01358 else
01359 {
01360 // RGB1, RGB2, and ADD pass.
01361
01362 // Render Base, Transitions or Additives.
01363
01364 ItTileRdrPassSet itTile;
01365 for(itTile= TileRdrPassSet.begin(); itTile!= TileRdrPassSet.end(); itTile++)
01366 {
01367 // Get a ref on the render pass. Const cast work because we only modify attribut from CPatchRdrPass
01368 // that don't affect the operator< of this class
01369 CPatchRdrPass &pass= const_cast<CPatchRdrPass&>(*itTile);
01370
01371 // Enlarge PassTriArray as needed
01372 initPassTriArray(pass);
01373
01374 // Add triangles to array
01375 CRdrTileId *tileToRdr= pass.getRdrTileRoot(passOrder);
01376 while(tileToRdr)
01377 {
01378 // renderSimpleTriangles() with the material setuped.
01379 tileToRdr->TileMaterial->renderTile(passOrder);
01380 tileToRdr= (CRdrTileId*)tileToRdr->getNext();
01381 }
01382
01383 // Pass not empty ?
01384 if(NL3D_LandscapeGlobals_PassNTri>0)
01385 {
01386 // Setup material.
01387 // Setup Diffuse texture of the tile.
01388 TileMaterial.setTexture(0, pass.TextureDiffuse);
01389
01390 // If transition tile, must enable the alpha for this pass.
01391 // NB: Additive pass may have pass.TextureAlpha==NULL
01392 TileMaterial.setTexture(1, pass.TextureAlpha);
01393 }
01394
01395 // Render triangles.
01396 drawPassTriArray(TileMaterial);
01397 }
01398 }
01399 }
01400
01401 // Yoyo: profile
01402 NL3D_PROFILE_LAND_SET(ProfNTileSetupMaterial, driver->profileSetupedMaterials()-ProfNTileSetupMaterial );
01403 H_AFTER( NL3D_Landscape_Render_Tile );
01404
01405 // 2. Far0Render pass.
01406 //====================
01407
01408 // Yoyo: profile
01409 NL3D_PROFILE_LAND_SET(ProfNFar0SetupMaterial, driver->profileSetupedMaterials() );
01410 H_BEFORE( NL3D_Landscape_Render_DLM );
01411
01412 // First, update Dynamic Lighting for Far, ie multiply Dynamic Lightmap with TextureFar, and upload to texture.
01413 // ==================
01414 dlmCtxPtr= _PatchDLMContextList->begin();
01415 while(dlmCtxPtr!=NULL)
01416 {
01417 // do it only if the patch has some Far stuff to render, and if it is visible
01418 if( (dlmCtxPtr->getPatch()->getFar0()>0 || dlmCtxPtr->getPatch()->getFar1()>0)
01419 && !dlmCtxPtr->getPatch()->isRenderClipped() )
01420 {
01421 // upload lightmap into textureDLM, modulating before with patch TextureFar.
01422 // NB: no-op if both src and dst are already full black.
01423 dlmCtxPtr->compileLighting(CPatchDLMContext::ModulateTextureFar);
01424 }
01425
01426 // next
01427 dlmCtxPtr= (CPatchDLMContext*)dlmCtxPtr->Next;
01428 }
01429
01430 H_AFTER( NL3D_Landscape_Render_DLM );
01431 H_BEFORE( NL3D_Landscape_Render_Far0 );
01432
01433 // Active VB.
01434 // ==================
01435
01436 // Active the good VB, and maybe activate the std VertexProgram.
01437 _Far0VB.activate(0);
01438
01439
01440 // Render.
01441 // ==================
01442
01443 // Setup common material.
01444 FarMaterial.setBlend(false);
01445 // set the DLM texture.
01446 FarMaterial.setTexture(1, _TextureDLM);
01447
01448 // Render All material RdrPass0.
01449 itFar=_TextureFars.begin();
01450 while (itFar!=_TextureFars.end())
01451 {
01452 CPatchRdrPass &pass= **itFar;
01453
01454 // Enlarge PassTriArray as needed
01455 initPassTriArray(pass);
01456
01457 // Setup the material.
01458 FarMaterial.setTexture(0, pass.TextureDiffuse);
01459 // If the texture need to be updated, do it now.
01460 if(pass.TextureDiffuse && pass.TextureDiffuse->touched())
01461 driver->setupTexture(*pass.TextureDiffuse);
01462
01463 // Add triangles to array
01464 CPatch *patchToRdr= pass.getRdrPatchFar0();
01465 while(patchToRdr)
01466 {
01467 // renderSimpleTriangles() with the material setuped.
01468 patchToRdr->renderFar0();
01469 patchToRdr= patchToRdr->getNextFar0ToRdr();
01470 }
01471 // Render triangles.
01472 drawPassTriArray(FarMaterial);
01473
01474 // Next render pass
01475 itFar++;
01476 }
01477
01478 // Yoyo: profile
01479 NL3D_PROFILE_LAND_SET(ProfNFar0SetupMaterial, driver->profileSetupedMaterials()-ProfNFar0SetupMaterial );
01480 H_AFTER( NL3D_Landscape_Render_Far0 );
01481
01482
01483 // 3. Far1Render pass.
01484 //====================
01485
01486 // Yoyo: profile
01487 NL3D_PROFILE_LAND_SET(ProfNFar1SetupMaterial, driver->profileSetupedMaterials() );
01488 H_BEFORE( NL3D_Landscape_Render_Far1 );
01489
01490 // Active VB.
01491 // ==================
01492
01493 // Active the good VB, and maybe activate the std VertexProgram.
01494 _Far1VB.activate(0);
01495
01496
01497 // Render
01498 // ==================
01499
01500 // Setup common material.
01501 FarMaterial.setBlend(true);
01502 // set the DLM texture.
01503 FarMaterial.setTexture(1, _TextureDLM);
01504
01505
01506 // Render All material RdrPass1.
01507 itFar=_TextureFars.begin();
01508 while (itFar!=_TextureFars.end())
01509 {
01510 CPatchRdrPass &pass= **itFar;
01511
01512 // Enlarge PassTriArray as needed
01513 initPassTriArray(pass);
01514
01515 // Setup the material.
01516 FarMaterial.setTexture(0, pass.TextureDiffuse);
01517 // If the texture need to be updated, do it now.
01518 if(pass.TextureDiffuse && pass.TextureDiffuse->touched())
01519 driver->setupTexture(*pass.TextureDiffuse);
01520
01521 // Add triangles to array
01522 CPatch *patchToRdr= pass.getRdrPatchFar1();
01523 while(patchToRdr)
01524 {
01525 // renderSimpleTriangles() with the material setuped.
01526 patchToRdr->renderFar1();
01527 patchToRdr= patchToRdr->getNextFar1ToRdr();
01528 }
01529 // Render triangles.
01530 drawPassTriArray(FarMaterial);
01531
01532 // Next render pass
01533 itFar++;
01534 }
01535
01536 // Yoyo: profile
01537 NL3D_PROFILE_LAND_SET(ProfNFar1SetupMaterial, driver->profileSetupedMaterials()-ProfNFar1SetupMaterial );
01538 H_AFTER( NL3D_Landscape_Render_Far1 );
01539
01540
01541 // 4. "Release" texture materials.
01542 //================================
01543 FarMaterial.setTexture(0, NULL);
01544 FarMaterial.setTexture(1, NULL);
01545 FarMaterial.setTexture(2, NULL);
01546 FarMaterial.setTexture(3, NULL);
01547 TileMaterial.setTexture(0, NULL);
01548 TileMaterial.setTexture(1, NULL);
01549 TileMaterial.setTexture(2, NULL);
01550 TileMaterial.setTexture(3, NULL);
01551
01552 // To ensure no use but in render()..
01553 CLandscapeGlobals::PatchCurrentDriver= NULL;
01554
01555 // Desactive the vertex program (if anyone)
01556 if(_VertexShaderOk)
01557 driver->activeVertexProgram (NULL);
01558
01559
01560 // 5. Vegetable Management.
01561 //================================
01562
01563 // First, update Dynamic Lighting for Vegetable, ie just copy.
01564 // ==================
01565 if(isVegetableActive())
01566 {
01567 /* Actually we modulate the DLM with an arbitrary constant for this reason:
01568 Color of vegetable (ie their material) are NOT modulated with DLM.
01569 Doing this without using PixelShader / additional UVs seems to be impossible.
01570 And add new UVs (+700K in AGP) just for this is not worth the effort.
01571
01572 We prefer using a constant to simulate the "global vegetable color", which is a big trick.
01573
01574 Additionally, the vegetable take the diffuse lighting of landscape, which is
01575 false because it replaces the diffuse lighting it should have (ie with his own Normal and
01576 his own "global vegetable color")
01577
01578 We can't do anything for "correct normal vegetable", but it is possible to replace landscape
01579 material with vegetable material, by dividing _DLMGlobalVegetableColor by LandscapeDiffuseMaterial.
01580 This is a very approximate result because of CRGBA clamp, but it is acceptable.
01581 */
01582 CRGBA vegetDLMCte;
01583 // the constant is _DLMGlobalVegetableColor / PointLightDiffuseMaterial
01584 uint v;
01585 v= (_DLMGlobalVegetableColor.R*256) / (_PointLightDiffuseMaterial.R+1);
01586 vegetDLMCte.R= (uint8)min(v, 255U);
01587 v= (_DLMGlobalVegetableColor.G*256) / (_PointLightDiffuseMaterial.G+1);
01588 vegetDLMCte.G= (uint8)min(v, 255U);
01589 v= (_DLMGlobalVegetableColor.B*256) / (_PointLightDiffuseMaterial.B+1);
01590 vegetDLMCte.B= (uint8)min(v, 255U);
01591
01592 // Parse all patch which have some vegetables
01593 dlmCtxPtr= _PatchDLMContextList->begin();
01594 while(dlmCtxPtr!=NULL)
01595 {
01596 // do it only if the patch has some vegetable stuff to render, and if it is visible
01597 // NB: we may have some vegetable stuff to render if the patch has some TileMaterial created.
01598 if(dlmCtxPtr->getPatch()->getTileMaterialRefCount()>0
01599 && !dlmCtxPtr->getPatch()->isRenderClipped() )
01600 {
01601 // NB: no-op if both src and dst are already full black.
01602 dlmCtxPtr->compileLighting(CPatchDLMContext::ModulateConstant, vegetDLMCte);
01603 }
01604
01605 // next
01606 dlmCtxPtr= (CPatchDLMContext*)dlmCtxPtr->Next;
01607 }
01608 }
01609
01610
01611 // profile.
01612 _VegetableManager->resetNumVegetableFaceRendered();
01613
01614 // render all vegetables, only if driver support VertexProgram.
01615 // ==================
01616 if(isVegetableActive())
01617 {
01618 // Use same plane as TessBlock for faster clipping.
01619 vector<CPlane> vegetablePyramid;
01620 vegetablePyramid.resize(NL3D_TESSBLOCK_NUM_CLIP_PLANE);
01621 for(i=0;i<NL3D_TESSBLOCK_NUM_CLIP_PLANE;i++)
01622 {
01623 vegetablePyramid[i]= pyramid[i];
01624 }
01625 _VegetableManager->render(refineCenter, frontVector, vegetablePyramid, _TextureDLM, driver);
01626 }
01627
01628 }
|
|
|
Definition at line 363 of file landscape.cpp. References NL3D::ItZoneMap, and Zones. Referenced by setTileNear().
|
|
|
For Vegetable Dynamic ligthing only: this is an approximate color of all vegetables. Default is (180, 180, 180). Definition at line 3605 of file landscape.cpp. References _DLMGlobalVegetableColor. Referenced by NL3D::CLandscapeUser::setDLMGlobalVegetableColor().
03606 {
03607 _DLMGlobalVegetableColor= gvc;
03608 }
|
|
|
A driver is needed for VB allocation. The VB will be allocated only the first time the landscape is clipped. Because no VB are created for invisible patchs. call setDriver() before any clip(). Definition at line 563 of file landscape.cpp. References _DriverOkForVegetable, _VertexShaderOk, NL3D_LANDSCAPE_VEGETABLE_MAX_AGP_VERTEX_MAX, nlassert, and uint. Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape().
00564 {
00565 nlassert(drv);
00566 if(_Driver != drv)
00567 {
00568 _Driver= drv;
00569
00570 // Does the driver support VertexShader???
00571 // only if VP supported by GPU.
00572 _VertexShaderOk= (_Driver->isVertexProgramSupported() && !_Driver->isVertexProgramEmulated());
00573
00574
00575 // Does the driver has sufficient requirements for Vegetable???
00576 // only if VP supported by GPU, and Only if max vertices allowed.
00577 _DriverOkForVegetable= _VertexShaderOk && (_Driver->getMaxVerticesByVertexBufferHard()>=(uint)NL3D_LANDSCAPE_VEGETABLE_MAX_AGP_VERTEX_MAX);
00578
00579 }
00580 }
|
|
|
Set PointLight Max Attenuation End landscape support. Every pointLight AttEnd is clamped to this value. Default is 30.f. Definition at line 3575 of file landscape.cpp. References _DLMMaxAttEnd.
03576 {
03577 maxAttEnd= max(maxAttEnd, 1.f);
03578 _DLMMaxAttEnd= maxAttEnd;
03579 }
|
|
|
set the HeightField data. NB: take lot of place in memory. only one is possible. You should setup this heightfield around the zones which will be loaded. It is applied only when a zone is loaded, so you should setup it 2km around the user, each time you move too far from a previous place (eg 160m from last setup). Definition at line 2784 of file landscape.cpp. References _HeightField, NL3D::CHeightMap::getHeight(), NL3D::CHeightMap::getWidth(), NL3D::CHeightMap::getZ(), NL3D::CLandscape::CHeightField::Height, NL3D::CLandscape::CBezierPatchZ::makeInteriors(), NL3D::CLandscape::CHeightField::OOSizeX, NL3D::CLandscape::CHeightField::OOSizeY, NL3D::CHeightMap::OriginX, NL3D::CLandscape::CHeightField::OriginX, NL3D::CHeightMap::OriginY, NL3D::CLandscape::CHeightField::OriginY, sint, NL3D::CHeightMap::SizeX, NL3D::CLandscape::CHeightField::SizeX, NL3D::CHeightMap::SizeY, NL3D::CLandscape::CHeightField::SizeY, NL3D::CLandscape::CBezierPatchZ::Tangents, uint, v, NL3D::CLandscape::CBezierPatchZ::Vertices, w, NL3D::CLandscape::CHeightField::Width, x, y, and NL3D::CLandscape::CHeightField::ZPatchs. Referenced by NL3D::CLandscapeUser::setHeightField().
02785 {
02786 if(hf.getWidth()<2)
02787 return;
02788 if(hf.getHeight()<2)
02789 return;
02790
02791 // Fill basics.
02792 _HeightField.OriginX= hf.OriginX;
02793 _HeightField.OriginY= hf.OriginY;
02794 _HeightField.SizeX= hf.SizeX;
02795 _HeightField.SizeY= hf.SizeY;
02796 _HeightField.OOSizeX= 1/hf.SizeX;
02797 _HeightField.OOSizeY= 1/hf.SizeY;
02798 uint w= hf.getWidth()-1;
02799 uint h= hf.getHeight()-1;
02800 _HeightField.Width= w;
02801 _HeightField.Height= h;
02802 _HeightField.ZPatchs.resize(w * h);
02803
02804 // compute patchs
02805 sint x,y;
02806
02807 // compute vertices / tangents on each patch
02808 for(y=0;y<(sint)h;y++)
02809 {
02810 for(x=0;x<(sint)w;x++)
02811 {
02812 CBezierPatchZ &paz= _HeightField.ZPatchs[y*w+x];
02813 // vertices.
02814 paz.Vertices[0]= hf.getZ(x, y);
02815 paz.Vertices[1]= hf.getZ(x, y+1);
02816 paz.Vertices[2]= hf.getZ(x+1, y+1);
02817 paz.Vertices[3]= hf.getZ(x+1, y);
02818 }
02819 }
02820
02821 // compute tangents
02822 for(y=0;y<(sint)h;y++)
02823 {
02824 for(x=0;x<(sint)w;x++)
02825 {
02826 CBezierPatchZ &paz= _HeightField.ZPatchs[y*w+x];
02827 sint tg;
02828 // For each tangent, what vertex (relative to x,y) we must take.
02829 struct CDeltaPos
02830 {
02831 sint ox,oy;
02832 sint dx1,dy1;
02833 sint dx2,dy2;
02834 };
02835 static CDeltaPos deltas[8]= {
02836 {0,0, 0,1, 0,-1} ,
02837 {0,1, 0,0, 0,2} ,
02838 {0,1, 1,1, -1,1} ,
02839 {1,1, 0,1, 2,1} ,
02840 {1,1, 1,0, 1,2} ,
02841 {1,0, 1,1, 1,-1} ,
02842 {1,0, 0,0, 2,0} ,
02843 {0,0, 1,0, -1,0} ,
02844 };
02845
02846 // compute each tangent of this patch.
02847 for(tg=0; tg<8;tg++)
02848 {
02849 sint x0,y0;
02850 sint x1,y1;
02851 sint x2,y2;
02852 x0= x+deltas[tg].ox; y0= y+deltas[tg].oy;
02853 x1= x+deltas[tg].dx1; y1= y+deltas[tg].dy1;
02854 x2= x+deltas[tg].dx2; y2= y+deltas[tg].dy2;
02855
02856 // borders case.
02857 if(x2<0 || x2>=(sint)hf.getWidth() || y2<0 || y2>=(sint)hf.getHeight())
02858 {
02859 float v,dv;
02860 // base of tangents.
02861 v= hf.getZ(x0,y0);
02862 // target tangents.
02863 dv= hf.getZ(x1,y1) - v;
02864 // result of tangent.
02865 paz.Tangents[tg]= v+dv/3;
02866 }
02867 // middle case.
02868 else
02869 {
02870 float v,dv;
02871 // base of tangents.
02872 v= hf.getZ(x0,y0);
02873 // target tangents.
02874 dv= hf.getZ(x1,y1) - v;
02875 // add mirror target tangent.
02876 dv+= -(hf.getZ(x2,y2) - v);
02877 dv/=2;
02878 // result of tangent.
02879 paz.Tangents[tg]= v+dv/3;
02880 }
02881 }
02882 }
02883 }
02884
02885 // compute interiors.
02886 for(y=0;y<(sint)h;y++)
02887 {
02888 for(x=0;x<(sint)w;x++)
02889 {
02890 CBezierPatchZ &paz= _HeightField.ZPatchs[y*w+x];
02891 paz.makeInteriors();
02892 }
02893 }
02894
02895 }
|
|
|
Enable the noise or not. NB: only new tesselation computed is modified, so you should call it only at init time.
Definition at line 3100 of file landscape.cpp. References _NoiseEnabled.
03101 {
03102 _NoiseEnabled= enable;
03103 }
|
|
|
Setup the equivalent material diffuse component used for both Static and Dynamic PointLights. Default is White. Definition at line 3612 of file landscape.cpp. References _PointLightDiffuseMaterial. Referenced by NL3D::CLandscapeUser::setPointLightDiffuseMaterial().
03613 {
03614 _PointLightDiffuseMaterial= diffuse;
03615 }
|
|
|
update the Light factor for all pointLights in All zones, according to scene LightGroups and AnimatedLights.
Definition at line 3319 of file landscape.cpp. References NL3D::ItZoneMap, and Zones. Referenced by NL3D::CLandscapeModel::traverseHrc().
|
|
|
Set the ModelPosition (for Precision ZBuffer purpose). NB: the model Pos may be floor-ed (for greater float precision). Should be setup to the camera position each frame. NB: if vertexProgram is used, it is as faster as before (because of geomorph done each frame, and because of VP MAD instruction). NB: if vertexProgram is not used, it is a little slower, because of the substraction. Definition at line 2920 of file landscape.cpp. References _PZBModelPosition. Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape().
02921 {
02922 _PZBModelPosition= pos;
02923 }
|
|
|
Definition at line 206 of file landscape.h. References _RefineMode.
00206 {_RefineMode= enabled;}
|
|
|
Set threshold for subdivsion quality. The lower is threshold, the more the landscape is subdivided. Default: 0.001.
Definition at line 318 of file landscape.cpp. References _Threshold, and _VPThresholdChange. Referenced by NL3D::CZoneLighter::addTriangles(), NL3D::CInstanceLighter::addTriangles(), NL3D::CZoneLighter::buildZoneInformation(), and NL3D::CLandscapeUser::setThreshold().
00319 {
00320 thre= max(thre, 0.f);
00321 if(thre != _Threshold)
00322 {
00323 _Threshold= thre;
00324 _VPThresholdChange= true;
00325 }
00326 }
|
|
|
Definition at line 620 of file landscape.h. References _TileCallback. Referenced by NL3D::CLandscapeUser::setTileCallback().
00620 { _TileCallback = cb; }
|
|
|
Set Maximum Tile subdivision. Valid values must be in [0..4] (assert). Default is 0 (for now :) ).
Definition at line 344 of file landscape.cpp. References _TileMaxSubdivision, forceMergeAtTileLevel(), nlassert, and uint. Referenced by NL3D::CZoneLighter::addTriangles(), NL3D::CInstanceLighter::addTriangles(), NL3D::CZoneLighter::buildZoneInformation(), and NL3D::CLandscapeUser::setTileMaxSubdivision().
00345 {
00346 nlassert(tileDiv>=0 && tileDiv<=4);
00347
00348 if(tileDiv!=_TileMaxSubdivision)
00349 {
00350 _TileMaxSubdivision= tileDiv;
00351 // Force at Tile==0. Nex refine will split correctly.
00352 forceMergeAtTileLevel();
00353 }
00354 }
|
|
|
Set tile near distance. Default 50.f. maximized to length of Far alpha transition).
Definition at line 330 of file landscape.cpp. References _FarTransition, _TileDistNear, and resetRenderFarAndDeleteVBFV(). Referenced by NL3D::CLandscapeUser::setTileNear().
00331 {
00332 tileNear= max(tileNear, _FarTransition);
00333
00334 if(tileNear!=_TileDistNear)
00335 {
00336 _TileDistNear= tileNear;
00337 resetRenderFarAndDeleteVBFV();
00338 }
00339
00340 }
|
|
|
For automatic near lightmap computing (if enabled): setup the lightdir
Definition at line 2690 of file landscape.cpp. References _AutomaticLightDir, and NLMISC::CVector::normalize().
02691 {
02692 _AutomaticLightDir= lightDir;
02693 _AutomaticLightDir.normalize();
02694 }
|
|
|
Debug purpose only : setup the colors of the patch of all the currently loaded zones so that it shows which tiles have vegetable disabled, or are above, below water. User provides a table with 4 colors for each state : color 0 = above water color 1 = underwater color 2 = intersect water color 3 = vegetable disabled Definition at line 3238 of file landscape.cpp. References Zones.
|
|
|
set the frequency of lighting update. If freq==1, ALL patchs are updated each second. e.g: if 1/20, then every 20 seconds, all patchs are updated. If you set 0, no update will be done at all (this is the default setup!!). Definition at line 3386 of file landscape.cpp. References _ULFrequency. Referenced by NL3D::CLandscapeUser::setUpdateLightingFrequency().
03387 {
03388 freq= max(freq, 0.f);
03389 _ULFrequency= freq;
03390 }
|
|
||||||||||||||||
|
Setup the light color use for static illumination.
Definition at line 2650 of file landscape.cpp. References _LightValue, NLMISC::CRGBA::A, NLMISC::CRGBA::B, NLMISC::clamp(), NLMISC::CRGBA::G, NLMISC::CRGBA::R, r, and sint. Referenced by CLandscape(), and NL3D::CLandscapeUser::setupStaticLight().
02651 {
02652 sint nMultiply=(sint)(256.f*multiply);
02653 for (int i=0; i<256; i++)
02654 {
02655 sint max=0;
02656 sint r=(((nMultiply*diffuse.R*i)>>8)+ambiant.R*(256-i))>>8;
02657 if (r>max)
02658 max=r;
02659 sint g=(((nMultiply*diffuse.G*i)>>8)+ambiant.G*(256-i))>>8;
02660 if (g>max)
02661 max=g;
02662 sint b=(((nMultiply*diffuse.B*i)>>8)+ambiant.B*(256-i))>>8;
02663 if (b>max)
02664 max=b;
02665 // Not << 8 but << 7 because the _LightValue color table represent a ramp from 0 to 512
02666 r <<= 7;
02667 g <<= 7;
02668 b <<= 7;
02669 max=std::max(max, 256);
02670 r/=max;
02671 g/=max;
02672 b/=max;
02673 clamp (r, 0, 255);
02674 clamp (g, 0, 255);
02675 clamp (b, 0, 255);
02676 _LightValue[i].R=r;
02677 _LightValue[i].G=g;
02678 _LightValue[i].B=b;
02679 _LightValue[i].A=255;
02680 }
02681 }
|
|
||||||||||||||||
|
setup lighting ambient and diffuse for vegetable. Definition at line 3181 of file landscape.cpp. References _VegetableManager, and NL3D::CVegetableManager::setDirectionalLight(). Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape(), and NL3D::CLandscapeUser::setupVegetableLighting().
03182 {
03183 // set the directional light to the manager
03184 _VegetableManager->setDirectionalLight(ambient, diffuse, directionalLight);
03185 }
|
|
|
set the vegetable manager Time (in seconds) NB: MOT stuff (called by CLandscapeModel), don't use it. Definition at line 3196 of file landscape.cpp. References _VegetableManager, and NL3D::CVegetableManager::setTime(). Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape().
03197 {
03198 // setup vegetable manager
03199 _VegetableManager->setTime(time);
03200 }
|
|
|
set the frequency of Vegetable lighting update. If freq==1, ALL lighted igs are updated each second. e.g: if 1/20, then every 20 seconds, all Igs are updated. If you set 0, no update will be done at all (this is the default setup!!). Definition at line 3232 of file landscape.cpp. References _VegetableManager, and NL3D::CVegetableManager::setUpdateLightingFrequency(). Referenced by NL3D::CLandscapeUser::setVegetableUpdateLightingFrequency().
03233 {
03234 _VegetableManager->setUpdateLightingFrequency(freq);
03235 }
|
|
|
set the vegetable manager System Time (in seconds) for update lighting NB: MOT stuff (called by CLandscapeModel), don't use it. Definition at line 3203 of file landscape.cpp. References _VegetableManager, and NL3D::CVegetableManager::setUpdateLightingTime(). Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape().
03204 {
03205 // setup vegetable manager
03206 _VegetableManager->setUpdateLightingTime(time);
03207 }
|
|
||||||||||||||||||||
|
set the vegetable Wind for animation. All thoses variables may be modified each frame without penalty.
Definition at line 3188 of file landscape.cpp. References _VegetableManager, and NL3D::CVegetableManager::setWind(). Referenced by NL3D::CLandscapeUser::setVegetableWind().
03189 {
03190 // setup vegetable manager
03191 _VegetableManager->setWind(windDir, windFreq, windPower, windBendMin);
03192 }
|
|
|
Definition at line 888 of file landscape.cpp. References _Far0VB, _Far1VB, _TileVB, and NL3D::CLandscapeVBAllocator::synchronizeATIVBHard(). Referenced by render().
|
|
|
Used by Patch to link/unlink from _ULRootNearPatch.
Definition at line 3404 of file landscape.cpp. References _ULNearCurrentTessBlockId, _ULRootNearPatch, NL3D::CPatch::getNextNearUL(), and NL3D::CPatch::unlinkNearUL(). Referenced by NL3D::CPatch::clearTessBlocks().
03405 {
03406 // If I unlink the patch which is the current root
03407 if(_ULRootNearPatch==patch)
03408 {
03409 // switch to next
03410 _ULRootNearPatch= patch->getNextNearUL();
03411 // if still the same, it means that the circular list is now empty
03412 if(_ULRootNearPatch==patch)
03413 _ULRootNearPatch= NULL;
03414 // reset tessBlock counter.
03415 _ULNearCurrentTessBlockId= 0;
03416 }
03417
03418 // unlink the patch from list
03419 patch->unlinkNearUL();
03420 }
|
|
|
Definition at line 877 of file landscape.cpp. References _Far0VB, _Far1VB, _TileVB, _VegetableManager, NL3D::CLandscapeVBAllocator::unlockBuffer(), and NL3D::CVegetableManager::unlockBuffers(). Referenced by addZone(), averageTesselationVertices(), NL3D::CZone::changePatchTextureAndColor(), clip(), computeDynamicLighting(), invalidateAllTiles(), refine(), refineAll(), removeZone(), render(), and updateLightingAll().
00878 {
00879 _Far0VB.unlockBuffer();
00880 _Far1VB.unlockBuffer();
00881 _TileVB.unlockBuffer();
00882
00883 // unlock buffer of the vegetable manager.
00884 _VegetableManager->unlockBuffers();
00885 }
|
|
|
Definition at line 799 of file landscape.cpp. References _DriverOkForVegetable, _Far0VB, _Far1VB, _FarTransition, _PZBModelPosition, _Threshold, _TileDistNear, _TileMaxSubdivision, _TileVB, _VegetableManager, lockBuffers(), NLMISC::sqr(), NL3D::CVegetableManager::updateDriver(), and NL3D::CLandscapeVBAllocator::updateDriver(). Referenced by addZone(), averageTesselationVertices(), NL3D::CZone::changePatchTextureAndColor(), clip(), computeDynamicLighting(), invalidateAllTiles(), refine(), refineAll(), removeZone(), render(), and updateLightingAll().
00800 {
00801 // Setup CLandscapeGlobals static members...
00802
00803 // Far limits.
00804 CLandscapeGlobals::FarTransition= _FarTransition;
00805
00806 // Tile subdivsion part.
00807 CLandscapeGlobals::TileMaxSubdivision= _TileMaxSubdivision;
00808 CLandscapeGlobals::TileDistNear = _TileDistNear;
00809 CLandscapeGlobals::TileDistFar = CLandscapeGlobals::TileDistNear+20;
00810 CLandscapeGlobals::TileDistNearSqr = sqr(CLandscapeGlobals::TileDistNear);
00811 CLandscapeGlobals::TileDistFarSqr = sqr(CLandscapeGlobals::TileDistFar);
00812 CLandscapeGlobals::OOTileDistDeltaSqr = 1.0f / (CLandscapeGlobals::TileDistFarSqr - CLandscapeGlobals::TileDistNearSqr);
00813
00814 // Tile Pixel size part.
00815 // \todo yoyo: choose according to wanted tile pixel size.
00816 CLandscapeGlobals::TilePixelSize= 128.0f;
00817 CLandscapeGlobals::TilePixelBias128= 0.5f/CLandscapeGlobals::TilePixelSize;
00818 CLandscapeGlobals::TilePixelScale128= 1-1/CLandscapeGlobals::TilePixelSize;
00819 CLandscapeGlobals::TilePixelBias256= 0.5f/(CLandscapeGlobals::TilePixelSize*2);
00820 CLandscapeGlobals::TilePixelScale256= 1-1/(CLandscapeGlobals::TilePixelSize*2);
00821
00822 // RefineThreshold.
00823 CLandscapeGlobals::RefineThreshold= _Threshold;
00824
00825 if (_Threshold == 0.0f)
00826 CLandscapeGlobals::OORefineThreshold = FLT_MAX;
00827 else
00828 CLandscapeGlobals::OORefineThreshold = 1.0f / CLandscapeGlobals::RefineThreshold;
00829
00830 // Refine Center*.
00831 CLandscapeGlobals::RefineCenter= refineCenter;
00832 CLandscapeGlobals::TileFarSphere.Center= CLandscapeGlobals::RefineCenter;
00833 CLandscapeGlobals::TileFarSphere.Radius= CLandscapeGlobals::TileDistFar;
00834 CLandscapeGlobals::TileNearSphere.Center= CLandscapeGlobals::RefineCenter;
00835 CLandscapeGlobals::TileNearSphere.Radius= CLandscapeGlobals::TileDistNear;
00836
00837 // PZBModelPosition
00838 CLandscapeGlobals::PZBModelPosition= _PZBModelPosition;
00839
00840 // VB Allocators.
00841 CLandscapeGlobals::CurrentFar0VBAllocator= &_Far0VB;
00842 CLandscapeGlobals::CurrentFar1VBAllocator= &_Far1VB;
00843 CLandscapeGlobals::CurrentTileVBAllocator= &_TileVB;
00844
00845 // Must check driver, and create VB infos,locking buffers.
00846 if(_Driver)
00847 {
00848 _Far0VB.updateDriver(_Driver);
00849 _Far1VB.updateDriver(_Driver);
00850 _TileVB.updateDriver(_Driver);
00851
00852 // must do the same for _VegetableManager.
00853 if(_DriverOkForVegetable)
00854 _VegetableManager->updateDriver(_Driver);
00855
00856 lockBuffers ();
00857 }
00858 }
|
|
|
update the lighting of patch, within a certain amount of time. called by CLandscapeModel Definition at line 3330 of file landscape.cpp. References _ULFrequency, _ULPrecTime, _ULPrecTimeInit, _ULTime, updateLightingTextureFar(), and updateLightingTextureNear(). Referenced by NL3D::CLandscapeModel::clipAndRenderLandscape().
03331 {
03332 _ULTime= time;
03333
03334 // first time in this method??
03335 if(!_ULPrecTimeInit)
03336 {
03337 _ULPrecTimeInit= true;
03338 _ULPrecTime= _ULTime;
03339 }
03340 // compute delta time from last update.
03341 float dt= float(_ULTime - _ULPrecTime);
03342 _ULPrecTime= _ULTime;
03343
03344
03345 // If not disabled
03346 if(_ULFrequency)
03347 {
03348 // Do it for near and far in 2 distinct ways.
03349 updateLightingTextureFar(dt * _ULFrequency);
03350 updateLightingTextureNear(dt * _ULFrequency);
03351 }
03352
03353 }
|
|
|
update the lighting of ALL patch (slow method). NB: work even if UpdateLightingFrequency==0 Additionaly, vegetables are also ALL updated. Definition at line 3357 of file landscape.cpp. References _VegetableManager, NLMISC::OptFastFloorBegin(), NLMISC::OptFastFloorEnd(), unlockBuffers(), updateGlobalsAndLockBuffers(), NL3D::CVegetableManager::updateLightingAll(), updateLightingTextureFar(), and updateLightingTextureNear(). Referenced by NL3D::CLandscapeUser::updateLightingAll().
03358 {
03359 // Do it for near and far in 2 distinct ways.
03360 //================
03361 updateLightingTextureFar(1);
03362 updateLightingTextureNear(1);
03363
03364
03365 // update lighting for vegetables
03366 //================
03367
03368 // Must lock buffers for update Lighting of vegetables.
03369 updateGlobalsAndLockBuffers (CVector::Null);
03370
03371 // Because updateLighting() may use OptFastFloor..
03372 NLMISC::OptFastFloorBegin();
03373
03374 // update ALL lighting for vegetables
03375 _VegetableManager->updateLightingAll();
03376
03377 // Stop fastFloor optim.
03378 NLMISC::OptFastFloorEnd();
03379
03380 // Must realase VB Buffers
03381 unlockBuffers();
03382 }
|
|
|
Update All Far texture, given a ratio along total lumels.
Definition at line 3424 of file landscape.cpp. References _ULFarPixelsToUpdate, _ULRootTextureFar, _ULTotalFarPixels, NL3D::CTextureFar::endPatchULTouch(), NL3D::CTextureFar::getNextUL(), min, NL3D::CTextureFar::startPatchULTouch(), and NL3D::CTextureFar::touchPatchULAndNext(). Referenced by updateLighting(), and updateLightingAll().
03425 {
03426 // compute number of pixels to update.
03427 _ULFarPixelsToUpdate+= ratio * _ULTotalFarPixels;
03428 // maximize, so at max, it computes all patchs, just one time.
03429 _ULFarPixelsToUpdate= min(_ULFarPixelsToUpdate, (float)_ULTotalFarPixels);
03430
03431 // Test Profile Yoyo
03432 /*extern bool YOYO_LandULTest;
03433 if(YOYO_LandULTest)
03434 {
03435 nlinfo("YOYO_UL Far: %dK, %dK", (sint)_ULFarPixelsToUpdate/1024, (sint)_ULTotalFarPixels/1024);
03436 }*/
03437
03438 // while there is still some pixels to update.
03439 while(_ULFarPixelsToUpdate > 0 && _ULRootTextureFar)
03440 {
03441 // update patch (if not null) in the textureFar.
03442 _ULFarPixelsToUpdate-= _ULRootTextureFar->touchPatchULAndNext();
03443
03444 // last patch in the texture??
03445 if( _ULRootTextureFar->endPatchULTouch() )
03446 {
03447 // yes, go to next texture.
03448 _ULRootTextureFar= _ULRootTextureFar->getNextUL();
03449 // reset to 0th patch.
03450 _ULRootTextureFar->startPatchULTouch();
03451 }
03452 }
03453
03454 // Now, _ULFarPixelsToUpdate should be <=0. (most of the time < 0)
03455 }
|
|
|
Update All Near texture, given a ratio along total lumels.
Definition at line 3459 of file landscape.cpp. References _ULNearCurrentTessBlockId, _ULNearPixelsToUpdate, _ULRootNearPatch, _ULTotalNearPixels, NL3D::CPatch::getNextNearUL(), NL3D::CPatch::getNumNearTessBlocks(), min, and NL3D::CPatch::updateTessBlockLighting(). Referenced by updateLighting(), and updateLightingAll().
03460 {
03461 // compute number of pixels to update.
03462 _ULNearPixelsToUpdate+= ratio * _ULTotalNearPixels;
03463 // maximize, so at max, it computes all patchs, just one time.
03464 _ULNearPixelsToUpdate= min(_ULNearPixelsToUpdate, (float)_ULTotalNearPixels);
03465
03466
03467 // while there is still some pixels to update.
03468 while(_ULNearPixelsToUpdate > 0 && _ULRootNearPatch)
03469 {
03470 // update tessBlock (if lightmap exist for this tessBlock) in the patch.
03471 _ULNearPixelsToUpdate-= _ULRootNearPatch->updateTessBlockLighting(_ULNearCurrentTessBlockId);
03472 // Next tessBlock to process.
03473 _ULNearCurrentTessBlockId++;
03474
03475 // last tessBlock in the patch??
03476 if(_ULNearCurrentTessBlockId>=_ULRootNearPatch->getNumNearTessBlocks())
03477 {
03478 // yes, go to next patch.
03479 _ULRootNearPatch= _ULRootNearPatch->getNextNearUL();
03480 // reset to 0th tessBlock.
03481 _ULNearCurrentTessBlockId=0;
03482 }
03483 }
03484
03485 }
|
|
|
Definition at line 896 of file landscape.cpp. References _TessBlockModificationRoot, NL3D::CTessBlock::getNextToModify(), NL3D::CTessBlock::getPatch(), NL3D::CPatch::recreateTessBlockFaceVector(), and NL3D::CTessBlock::removeFromModifyList(). Referenced by addZone(), averageTesselationVertices(), NL3D::CZone::changePatchTextureAndColor(), clip(), invalidateAllTiles(), refine(), refineAll(), and removeZone().
00897 {
00898 // while some tessBlock to update remains.
00899 CTessBlock *tb;
00900 while( (tb=_TessBlockModificationRoot.getNextToModify()) !=NULL )
00901 {
00902 // Get the patch which owns this TessBlock.
00903 CPatch *patch= tb->getPatch();
00904
00905 // If this patch is visible, recreate faceVector for his tessBlock.
00906 patch->recreateTessBlockFaceVector(*tb);
00907
00908 // remove from list.
00909 tb->removeFromModifyList();
00910 }
00911 }
|
|
|
Definition at line 629 of file landscape.h. |
|
|
Definition at line 67 of file smart_ptr.h. |
|
|
Definition at line 628 of file landscape.h. |
|
|
Definition at line 630 of file landscape.h. |
|
|
Definition at line 792 of file landscape.h. Referenced by CLandscape(), getAutomaticLightDir(), and setupAutomaticLightDir(). |
|
|
Definition at line 791 of file landscape.h. Referenced by CLandscape(), enableAutomaticLighting(), and getAutomaticLighting(). |
|
|
an approximate value used to simulate diffuse material of vegetables
Definition at line 988 of file landscape.h. Referenced by CLandscape(), getDLMGlobalVegetableColor(), render(), and setDLMGlobalVegetableColor(). |
|
|
Max AttEnd.
Definition at line 985 of file landscape.h. Referenced by CLandscape(), computeDynamicLighting(), getDynamicLightingMaxAttEnd(), and setDynamicLightingMaxAttEnd(). |
|
|
Definition at line 712 of file landscape.h. |
|
|
Tells if the current dirver support vegetable.
Definition at line 913 of file landscape.h. Referenced by CLandscape(), isVegetableActive(), setDriver(), and updateGlobalsAndLockBuffers(). |
|
|
Definition at line 660 of file landscape.h. |
|
|
Definition at line 713 of file landscape.h. Referenced by clear(), lockBuffers(), render(), synchronizeATIVBHards(), unlockBuffers(), and updateGlobalsAndLockBuffers(). |
|
|
Definition at line 714 of file landscape.h. Referenced by clear(), lockBuffers(), render(), synchronizeATIVBHards(), unlockBuffers(), and updateGlobalsAndLockBuffers(). |
|
|
Definition at line 783 of file landscape.h. Referenced by CLandscape(), and initTileBanks(). |
|
|
Definition at line 705 of file landscape.h. Referenced by CLandscape(), setTileNear(), and updateGlobalsAndLockBuffers(). |
|
|
Definition at line 853 of file landscape.h. Referenced by getHeightFieldDeltaZ(), and setHeightField(). |
|
|
Definition at line 789 of file landscape.h. Referenced by getStaticLight(), and setupStaticLight(). |
|
|
The priority list of faces which may need to merge.
Definition at line 896 of file landscape.h. Referenced by CLandscape(), NL3D::CTessFace::doMerge(), refine(), NL3D::CTessFace::split(), NL3D::CTessFace::splitRectangular(), and NL3D::CTessFace::updateRefineMerge(). |
|
|
Definition at line 765 of file landscape.h. Referenced by CLandscape(), getTileLightMap(), and releaseTileLightMap(). |
|
|
Definition at line 887 of file landscape.h. Referenced by CLandscape(), getNoiseMode(), and setNoiseMode(). |
|
|
OldRefineCenter setuped in prec refine().
Definition at line 898 of file landscape.h. Referenced by CLandscape(), getOldRefineCenter(), getTesselatedPos(), and refine(). |
|
|
The priority list of faces which may need to merge.
Definition at line 899 of file landscape.h. Referenced by CLandscape(), and refine(). |
|
|
List of DLM Context.
Definition at line 981 of file landscape.h. Referenced by CLandscape(), computeDynamicLighting(), getDynamicLightingMemoryLoad(), getPatchDLMContextList(), render(), and ~CLandscape(). |
|
|
The QuadGrid of patch.
Definition at line 866 of file landscape.h. Referenced by addZone(), buildPatchBlocksInBBox(), buildTrianglesInBBox(), clear(), computeDynamicLighting(), init(), and removeZone(). |
|
|
private version of buildPatchBlocksInBBox, searching only for one patch. Definition at line 101 of file landscape.cpp. Referenced by init(). |
|
|
private version of buildPatchBlocksInBBox, searching only for one patch. Definition at line 99 of file landscape.cpp. Referenced by init(). |
|
|
The diffuse material of landscape, used for StaticPointLights and DynamicPointLights.
Definition at line 991 of file landscape.h. Referenced by CLandscape(), computeDynamicLighting(), getPointLightDiffuseMaterial(), render(), and setPointLightDiffuseMaterial(). |
|
|
Definition at line 929 of file landscape.h. Referenced by CLandscape(), getPZBModelPosition(), render(), setPZBModelPosition(), and updateGlobalsAndLockBuffers(). |
|
|
Definition at line 704 of file landscape.h. Referenced by CLandscape(), getRefineMode(), refine(), and setRefineMode(). |
|
|
Definition at line 719 of file landscape.h. Referenced by CLandscape(), NL3D::CZone::refreshTesselationGeometry(), and render(). |
|
|
newTessFace() append the face to _RootNewLeaves.
Definition at line 901 of file landscape.h. Referenced by newTessFace(), and refine(). |
|
|
Definition at line 998 of file landscape.h. Referenced by appendToShadowPolyReceiver(), getCameraCollision(), receiveShadowMap(), and removeFromShadowPolyReceiver(). |
|
|
The priority list of faces which may need to split.
Definition at line 894 of file landscape.h. Referenced by CLandscape(), NL3D::CTessFace::doMerge(), refine(), and NL3D::CTessFace::updateRefineSplit(). |
|
|
Definition at line 663 of file landscape.h. Referenced by averageTesselationVertices(), clip(), and updateTessBlocksFaceVector(). |
|
|
The dynamic lightmap Texture.
Definition at line 977 of file landscape.h. Referenced by CLandscape(), getTextureDLM(), render(), and ~CLandscape(). |
|
|
Definition at line 782 of file landscape.h. Referenced by clear(), getFarRenderPass(), and render(). |
|
|
Definition at line 764 of file landscape.h. Referenced by getTileLightMap(), refillTileLightMap(), releaseTileLightMap(), and render(). |
|
|
Definition at line 703 of file landscape.h. Referenced by CLandscape(), getTesselatedPos(), getThreshold(), setThreshold(), and updateGlobalsAndLockBuffers(). |
|
|
Definition at line 633 of file landscape.h. Referenced by CLandscape(), getTileCallback(), and setTileCallback(). |
|
|
Definition at line 702 of file landscape.h. Referenced by CLandscape(), getTesselatedPos(), getTileNear(), setTileNear(), and updateGlobalsAndLockBuffers(). |
|
|
Definition at line 706 of file landscape.h. Referenced by CLandscape(), getTileMaxSubdivision(), setTileMaxSubdivision(), and updateGlobalsAndLockBuffers(). |
|
|
Definition at line 715 of file landscape.h. Referenced by clear(), lockBuffers(), render(), synchronizeATIVBHards(), unlockBuffers(), and updateGlobalsAndLockBuffers(). |
|
|
Current number of far pixels to update. If negative, I have some advance.
Definition at line 946 of file landscape.h. Referenced by CLandscape(), and updateLightingTextureFar(). |
|
|
Frequency of update.
Definition at line 940 of file landscape.h. Referenced by CLandscape(), setUpdateLightingFrequency(), and updateLighting(). |
|
|
Current tessBlock id in the current patch processed.
Definition at line 958 of file landscape.h. Referenced by CLandscape(), unlinkPatchFromNearUL(), and updateLightingTextureNear(). |
|
|
Current number of near pixels to update. If negative, I have some advance.
Definition at line 954 of file landscape.h. Referenced by CLandscape(), and updateLightingTextureNear(). |
|
|
Used by Patch to link/unlink from _ULRootNearPatch.
Definition at line 936 of file landscape.h. Referenced by updateLighting(). |
|
|
Used by Patch to link/unlink from _ULRootNearPatch.
Definition at line 937 of file landscape.h. Referenced by CLandscape(), and updateLighting(). |
|
|
The current patch rendered.
Definition at line 956 of file landscape.h. Referenced by CLandscape(), linkPatchToNearUL(), unlinkPatchFromNearUL(), and updateLightingTextureNear(). |
|
|
The current TextureFar rendered.
Definition at line 948 of file landscape.h. Referenced by CLandscape(), clearFarRenderPass(), getFarRenderPass(), and updateLightingTextureFar(). |
|
|
Used by Patch to link/unlink from _ULRootNearPatch.
Definition at line 938 of file landscape.h. Referenced by updateLighting(). |
|
|
Far UpdateLighting.
Definition at line 944 of file landscape.h. Referenced by CLandscape(), freeFarRenderPass(), getFarRenderPass(), and updateLightingTextureFar(). |
|
|
Near UpdateLighting.
Definition at line 952 of file landscape.h. Referenced by CLandscape(), getTileLightMap(), releaseTileLightMap(), and updateLightingTextureNear(). |
|
|
List of VegetableBlock, to be tested for creation each frame.
Definition at line 916 of file landscape.h. Referenced by refine(). |
|
|
The VegetableManager. (ptr only for include speed).
Definition at line 908 of file landscape.h. Referenced by NL3D::CPatch::addRefTessBlocks(), CLandscape(), NL3D::CPatch::clearTessBlocks(), createVegetableBlendLayersModels(), enableVegetable(), NL3D::CPatch::generateTileVegetable(), getNumVegetableFaceRendered(), initTileBanks(), loadVegetableTexture(), lockBuffers(), refine(), render(), setupVegetableLighting(), setVegetableTime(), setVegetableUpdateLightingFrequency(), setVegetableUpdateLightingTime(), setVegetableWind(), unlockBuffers(), updateGlobalsAndLockBuffers(), updateLightingAll(), and ~CLandscape(). |
|
|
Tells if the Vegetable Managemnt is enabled.
Definition at line 911 of file landscape.h. Referenced by CLandscape(), enableVegetable(), and isVegetableActive(). |
|
|
Definition at line 717 of file landscape.h. Referenced by CLandscape(), getTesselatedPos(), lockBuffers(), render(), and setDriver(). |
|
|
Definition at line 708 of file landscape.h. Referenced by CLandscape(), render(), and setThreshold(). |
|
|
Definition at line 79 of file smart_ptr.h. Referenced by NLMISC::CRefCount::CRefCount(), NLMISC::CRefCount::getRefCount(), and NLMISC::CRefCount::~CRefCount(). |
|
|
Definition at line 772 of file landscape.h. |
|
|
Referenced by NLMISC::CRefCount::CRefCount(). |
|
|
Definition at line 147 of file landscape.h. Referenced by addZone(), CLandscape(), and NL3D::CLandscapeModel::CLandscapeModel(). |
|
|
Definition at line 80 of file smart_ptr.h. Referenced by NLMISC::CRefCount::CRefCount(), and NLMISC::CRefCount::~CRefCount(). |
|
|
Definition at line 638 of file landscape.h. Referenced by deleteTessFace(), and newTessFace(). |
|
|
Definition at line 641 of file landscape.h. Referenced by deleteTessFarVertex(), and newTessFarVertex(). |
|
|
Definition at line 640 of file landscape.h. Referenced by deleteTessNearVertex(), and newTessNearVertex(). |
|
|
Definition at line 639 of file landscape.h. Referenced by deleteTessVertex(), and newTessVertex(). |
|
|
|
Definition at line 643 of file landscape.h. Referenced by deleteTileFace(), and newTileFace(). |
|
|
Definition at line 146 of file landscape.h. Referenced by NL3D::CPatchDLMContext::computeTextureFar(), eraseTileFarIfNotGood(), getFarRenderPass(), initTileBanks(), and NL3D::CLandscapeUser::loadBankFiles(). |
|
|
Definition at line 761 of file landscape.h. Referenced by flushTiles(), getTileRenderPass(), getTileUvScaleBiasRot(), initTileBank(), loadTile(), releaseTile(), and releaseTiles(). |
|
|
Definition at line 769 of file landscape.h. |
|
|
Definition at line 642 of file landscape.h. Referenced by deleteTileMaterial(), and newTileMaterial(). |
|
|
Definition at line 759 of file landscape.h. Referenced by findTileRdrPass(), flushTiles(), releaseTiles(), and render(). |
|
|
Definition at line 757 of file landscape.h. Referenced by findTileTexture(). |
|
1.3.6