NL3D::CLandscapeVegetableBlock Class Reference

#include <landscape_vegetable_block.h>

Inheritance diagram for NL3D::CLandscapeVegetableBlock:

NL3D::CTessNodeList

Detailed Description

A block of vegetable IG (one IG per distance type). NB: there is one CLandscapeVegetableBlock per landscape TessBlock.
Author:
Lionel Berenguier

Nevrax France

Date:
2001

Definition at line 63 of file landscape_vegetable_block.h.

Public Member Functions

 CLandscapeVegetableBlock ()
 Constructor.

void init (const CVector &center, CVegetableManager *vegetManager, CVegetableClipBlock *vegetableClipBlock, CPatch *patch, uint ts, uint tt, CTessList< CLandscapeVegetableBlock > &list)
 build the vegetable block, create sortBlocks, and append to list.

void release (CVegetableManager *vegeManager, CTessList< CLandscapeVegetableBlock > &list)
 release all IGs, reset the Vegetable block and remove from list. call before destruction.

void update (const CVector &viewCenter, CVegetableManager *vegeManager)

Data Fields

CTessNodeListNext
CTessNodeListPrec

Private Member Functions

void createVegetableIGForDistType (uint i, CVegetableManager *vegeManager, CLandscapeVegetableBlockCreateContext &vbCreateCtx)

Private Attributes

CVector _Center
 The center of this object, to compute distance.

uint8 _CurDistType
 The current distance type. 0 means all IG are created. NL3D_VEGETABLE_BLOCK_NUMDIST means none.

CPatch_Patch
 Which patch owns this block.

uint8 _Ts
 Coordinate of the lower-left tile. 2x2 tile vegetables are generated.

uint8 _Tt
 Coordinate of the lower-left tile. 2x2 tile vegetables are generated.

CVegetableClipBlock_VegetableClipBlock
 To which VegetableClipBlock we must add vegetables IGs.

CVegetableInstanceGroup_VegetableIG [NL3D_TESSBLOCK_TILESIZE][NL3D_VEGETABLE_BLOCK_NUMDIST]
CVegetableSortBlock_VegetableSortBlock [NL3D_TESSBLOCK_TILESIZE]
 The sortBlocks generated by this vegetable block, one for each tilematerial.


Constructor & Destructor Documentation

NL3D::CLandscapeVegetableBlock::CLandscapeVegetableBlock  ) 
 

Constructor.

Definition at line 71 of file landscape_vegetable_block.cpp.

References _CurDistType, _VegetableClipBlock, _VegetableIG, _VegetableSortBlock, NL3D_TESSBLOCK_TILESIZE, NL3D_VEGETABLE_BLOCK_NUMDIST, and uint.

00072 {
00073         _VegetableClipBlock= NULL;
00074         _CurDistType= NL3D_VEGETABLE_BLOCK_NUMDIST;
00075 
00076         for(uint j=0;j<NL3D_TESSBLOCK_TILESIZE;j++)
00077         {
00078                 _VegetableSortBlock[j]= NULL;
00079                 for(uint i=0;i<NL3D_VEGETABLE_BLOCK_NUMDIST;i++)
00080                 {
00081                         _VegetableIG[j][i]= NULL;
00082                 }
00083         }
00084 }


Member Function Documentation

void NL3D::CLandscapeVegetableBlock::createVegetableIGForDistType uint  i,
CVegetableManager vegeManager,
CLandscapeVegetableBlockCreateContext vbCreateCtx
[private]
 

Definition at line 227 of file landscape_vegetable_block.cpp.

References _Patch, _Ts, _Tt, _VegetableIG, _VegetableSortBlock, NL3D::CVegetableManager::createIg(), NL3D::CVegetableManager::deleteIg(), NL3D::CPatch::generateTileVegetable(), NL3D_TESSBLOCK_TILESIZE, nlassert, sint, and uint.

Referenced by update().

00229 {
00230         // check
00231         nlassert(NL3D_TESSBLOCK_TILESIZE==4);
00232         nlassert(_VegetableIG[0][i]==NULL);
00233         nlassert(_VegetableIG[1][i]==NULL);
00234         nlassert(_VegetableIG[2][i]==NULL);
00235         nlassert(_VegetableIG[3][i]==NULL);
00236 
00237         // Create vegetables instances per tile_material.
00238         sint    tms,tmt;
00239         // for all tiles
00240         nlassert(NL3D_TESSBLOCK_TILESIZE==4);
00241         for(tmt= _Tt; tmt<_Tt+2; tmt++)
00242         {
00243                 for(tms= _Ts; tms<_Ts+2; tms++)
00244                 {
00245                         uint    tileId= tms-_Ts + (tmt-_Tt)*2;
00246 
00247                         // create the instance group in the good sortBlock
00248                         CVegetableInstanceGroup         *vegetIg= vegeManager->createIg(_VegetableSortBlock[tileId]);
00249                         _VegetableIG[tileId][i]= vegetIg;
00250 
00251                         // generate 
00252                         _Patch->generateTileVegetable(vegetIg, i, tms, tmt, vbCreateCtx);
00253 
00254                         // If the ig is empty, delete him. This optimize rendering because no unusefull ig are 
00255                         // tested for rendering. This speed up some 1/10 of ms...
00256                         if(vegetIg->isEmpty())
00257                         {
00258                                 vegeManager->deleteIg(vegetIg);
00259                                 _VegetableIG[tileId][i]= NULL;
00260                         }
00261 
00262                         // NB: vegtable SortBlock is updated in CLandscapeVegetableBlock::update() after
00263                 }
00264         }
00265 
00266 }

void NL3D::CLandscapeVegetableBlock::init const CVector center,
CVegetableManager vegetManager,
CVegetableClipBlock vegetableClipBlock,
CPatch patch,
uint  ts,
uint  tt,
CTessList< CLandscapeVegetableBlock > &  list
 

build the vegetable block, create sortBlocks, and append to list.

Definition at line 89 of file landscape_vegetable_block.cpp.

References _Patch, _Ts, _Tt, _VegetableClipBlock, _VegetableSortBlock, NL3D::CTessList< T >::append(), NL3D::CVegetableManager::createSortBlock(), NL3D::CBezierPatch::eval(), NL3D::CPatch::getOrderS(), NL3D::CPatch::getOrderT(), NL3D_PATCH_TILE_RADIUS, NL3D_TESSBLOCK_TILESIZE, nlassert, s, sint, t, uint, and NL3D::CPatch::unpackIntoCache().

Referenced by NL3D::CPatch::createVegetableBlock().

00091 {
00092         nlassert(patch);
00093         _Center= center;
00094         _VegetableClipBlock= vegetableClipBlock;
00095         _Patch= patch;
00096         _Ts= ts;
00097         _Tt= tt;
00098 
00099         // Create the Vegetable SortBlocks
00100         sint    tms,tmt;
00101         // for all tiles
00102         nlassert(NL3D_TESSBLOCK_TILESIZE==4);
00103         for(tmt= _Tt; tmt<_Tt+2; tmt++)
00104         {
00105                 for(tms= _Ts; tms<_Ts+2; tms++)
00106                 {
00107                         // compute approximate center of the tile.
00108                         float   s= (tms + 0.5f) / _Patch->getOrderS();
00109                         float   t= (tmt + 0.5f) / _Patch->getOrderT();
00110                         CBezierPatch    *bpatch= _Patch->unpackIntoCache();
00111                         CVector center= bpatch->eval(s, t);
00112 
00113                         // create the sortBlock. NB: very approximate SortBlock radius....
00114                         _VegetableSortBlock[(tmt-_Tt)*2 + (tms-_Ts)]= vegetManager->createSortBlock(_VegetableClipBlock, center, NL3D_PATCH_TILE_RADIUS);
00115                 }
00116         }
00117 
00118         // append to list.
00119         vblist.append(this);
00120 }

void NL3D::CLandscapeVegetableBlock::release CVegetableManager vegeManager,
CTessList< CLandscapeVegetableBlock > &  list
 

release all IGs, reset the Vegetable block and remove from list. call before destruction.

Definition at line 124 of file landscape_vegetable_block.cpp.

References _CurDistType, _VegetableIG, _VegetableSortBlock, NL3D::CVegetableManager::deleteIg(), NL3D::CVegetableManager::deleteSortBlock(), NL3D_TESSBLOCK_TILESIZE, NL3D_VEGETABLE_BLOCK_NUMDIST, NL3D::CTessList< T >::remove(), and uint.

00125 {
00126         // release all Igs, and all Sbs.
00127         for(uint j=0;j<NL3D_TESSBLOCK_TILESIZE;j++)
00128         {
00129                 // release IGs first.
00130                 for(uint i=0;i<NL3D_VEGETABLE_BLOCK_NUMDIST;i++)
00131                 {
00132                         if(_VegetableIG[j][i])
00133                         {
00134                                 vegeManager->deleteIg(_VegetableIG[j][i]);
00135                                 _VegetableIG[j][i]= NULL;
00136                         }
00137                 }
00138 
00139                 // release SB
00140                 if(_VegetableSortBlock[j])
00141                 {
00142                         vegeManager->deleteSortBlock(_VegetableSortBlock[j]);
00143                         _VegetableSortBlock[j]= NULL;
00144                 }
00145         }
00146 
00147         // reset state.
00148         _CurDistType= NL3D_VEGETABLE_BLOCK_NUMDIST;
00149 
00150         // remove from list.
00151         vblist.remove(this);
00152 }

void NL3D::CLandscapeVegetableBlock::update const CVector viewCenter,
CVegetableManager vegeManager
 

update state of the vegetableBlock. If distance type change, then create / delete any wanted Ig. Warning! IG creation Use OptFastFloor()! So call must be enclosed with a OptFastFloorBegin()/OptFastFloorEnd().

Definition at line 155 of file landscape_vegetable_block.cpp.

References _CurDistType, _Patch, _Ts, _Tt, _VegetableIG, _VegetableSortBlock, createVegetableIGForDistType(), NL3D::CVegetableManager::deleteIg(), NL3D::CLandscapeVegetableBlockCreateContext::init(), NL3D_TESSBLOCK_TILESIZE, uint, and NL3D::CVegetableSortBlock::updateSortBlock().

Referenced by NL3D::CLandscape::refine().

00156 {
00157         float   sqrDist= (viewCenter-_Center).sqrnorm();
00158 
00159         // compute new distance type. Incremental mode.
00160         uint    newDistType= _CurDistType;
00161         while(sqrDist<CLVBSqrDistLUT::Array[newDistType])
00162         {
00163                 newDistType--;
00164         }
00165         while(newDistType<NL3D_VEGETABLE_BLOCK_NUMDIST && sqrDist>CLVBSqrDistLUT::Array[newDistType+1])
00166         {
00167                 newDistType++;
00168         }
00169         /*
00170                 NB: to test but may be better than 
00171                         newDistType= floor()(delta.norm() / NL3D_VEGETABLE_BLOCK_ELTDIST);
00172         */
00173 
00174 
00175         // Change of distance type??
00176         if(newDistType!=_CurDistType)
00177         {
00178                 // Erase or create IGs.
00179                 if(newDistType>_CurDistType)
00180                 {
00181                         // For all tiles
00182                         for(uint j=0;j<NL3D_TESSBLOCK_TILESIZE;j++)
00183                         {
00184                                 // Erase no more needed Igs.
00185                                 for(uint i=_CurDistType; i<newDistType; i++)
00186                                 {
00187                                         if(_VegetableIG[j][i])
00188                                         {
00189                                                 vegeManager->deleteIg(_VegetableIG[j][i]);
00190                                                 _VegetableIG[j][i]= NULL;
00191                                         }
00192                                 }
00193 
00194                                 // update the sort block for this tile
00195                                 _VegetableSortBlock[j]->updateSortBlock(*vegeManager);
00196                         }
00197                 }
00198                 else
00199                 {
00200                         // Create a context for creation.
00201                         CLandscapeVegetableBlockCreateContext   ctx;
00202                         ctx.init(_Patch, _Ts, _Tt);
00203 
00204                         // create new Igs, for all tiles
00205                         for(uint i=newDistType; i<_CurDistType; i++)
00206                         {
00207                                 createVegetableIGForDistType(i, vegeManager, ctx);
00208                         }
00209 
00210                         // For all tiles
00211                         for(uint j=0;j<NL3D_TESSBLOCK_TILESIZE;j++)
00212                         {
00213                                 // update the sort block for this tile
00214                                 _VegetableSortBlock[j]->updateSortBlock(*vegeManager);
00215                         }
00216                 }
00217 
00218                 // copy new dist type.
00219                 _CurDistType= newDistType;
00220         }
00221 
00222 
00223 }


Field Documentation

CVector NL3D::CLandscapeVegetableBlock::_Center [private]
 

The center of this object, to compute distance.

Definition at line 90 of file landscape_vegetable_block.h.

uint8 NL3D::CLandscapeVegetableBlock::_CurDistType [private]
 

The current distance type. 0 means all IG are created. NL3D_VEGETABLE_BLOCK_NUMDIST means none.

Definition at line 98 of file landscape_vegetable_block.h.

Referenced by CLandscapeVegetableBlock(), release(), and update().

CPatch* NL3D::CLandscapeVegetableBlock::_Patch [private]
 

Which patch owns this block.

Definition at line 94 of file landscape_vegetable_block.h.

Referenced by createVegetableIGForDistType(), init(), and update().

uint8 NL3D::CLandscapeVegetableBlock::_Ts [private]
 

Coordinate of the lower-left tile. 2x2 tile vegetables are generated.

Definition at line 96 of file landscape_vegetable_block.h.

Referenced by createVegetableIGForDistType(), init(), and update().

uint8 NL3D::CLandscapeVegetableBlock::_Tt [private]
 

Coordinate of the lower-left tile. 2x2 tile vegetables are generated.

Definition at line 96 of file landscape_vegetable_block.h.

Referenced by createVegetableIGForDistType(), init(), and update().

CVegetableClipBlock* NL3D::CLandscapeVegetableBlock::_VegetableClipBlock [private]
 

To which VegetableClipBlock we must add vegetables IGs.

Definition at line 92 of file landscape_vegetable_block.h.

Referenced by CLandscapeVegetableBlock(), and init().

CVegetableInstanceGroup* NL3D::CLandscapeVegetableBlock::_VegetableIG[NL3D_TESSBLOCK_TILESIZE][NL3D_VEGETABLE_BLOCK_NUMDIST] [private]
 

The instance groups generated by this vegetable block, one for each distance type. and one per each tilematerial

Definition at line 107 of file landscape_vegetable_block.h.

Referenced by CLandscapeVegetableBlock(), createVegetableIGForDistType(), release(), and update().

CVegetableSortBlock* NL3D::CLandscapeVegetableBlock::_VegetableSortBlock[NL3D_TESSBLOCK_TILESIZE] [private]
 

The sortBlocks generated by this vegetable block, one for each tilematerial.

Definition at line 102 of file landscape_vegetable_block.h.

Referenced by CLandscapeVegetableBlock(), createVegetableIGForDistType(), init(), release(), and update().

CTessNodeList* NL3D::CTessNodeList::Next [inherited]
 

Definition at line 44 of file tess_list.h.

Referenced by NL3D::CVegetableManager::addInstance(), NL3D::CLandscape::computeDynamicLighting(), NL3D::CPatch::computeGeomorphAlphaFar1VertexListVB(), NL3D::CPatch::computeGeomorphFar0VertexListVB(), NL3D::CPatch::computeGeomorphTileVertexListVB(), NL3D::CPatch::computeGeomorphVertexList(), NL3D::CPatch::debugAllocationMarkIndicesFarList(), NL3D::CPatch::debugAllocationMarkIndicesNearList(), NL3D::CPatch::fillFar0DLMUvOnlyVertexListVB(), NL3D::CPatch::fillFar0VertexListVB(), NL3D::CPatch::fillFar1DLMUvOnlyVertexListVB(), NL3D::CPatch::fillFar1VertexListVB(), NL3D::CPatch::fillTileVertexListVB(), NL3D::CLandscape::getDynamicLightingMemoryLoad(), NL3D::CTessBlock::refillFaceVectorFar0(), NL3D::CTessBlock::refillFaceVectorFar1(), NL3D::CTessBlock::refillFaceVectorTile(), NL3D::CLandscape::refine(), NL3D::CVegetableManager::render(), NL3D::CLandscape::render(), NL3D::CPatch::updateFar0VBAlloc(), NL3D::CPatch::updateFar1VBAlloc(), NL3D::CVegetableSortBlock::updateSortBlock(), and NL3D::CPatch::updateTileVBAlloc().

CTessNodeList* NL3D::CTessNodeList::Prec [inherited]
 

Definition at line 43 of file tess_list.h.

Referenced by NL3D::CTessNodeList::CTessNodeList().


The documentation for this class was generated from the following files:
Generated on Tue Mar 16 06:49:17 2004 for NeL by doxygen 1.3.6