NL3D::CVegetableSortBlock Class Reference

#include <vegetable_sort_block.h>

Inheritance diagram for NL3D::CVegetableSortBlock:

NL3D::CTessNodeList

Detailed Description

A block of vegetable instance groups. CVegetableSortBlock are sorted in Z order. NB: for speed and convenience, only the RdrPass NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT is sorted. A block have a number of quadrants (8). Each quadrant has an array of triangles to render. Internal to VegetableManager. Just an Handle for public.
Author:
Lionel Berenguier

Nevrax France

Date:
2001

Definition at line 56 of file vegetable_sort_block.h.

Public Member Functions

 CVegetableSortBlock ()
 Constructor.

const CVectorgetCenter () const
void updateSortBlock (CVegetableManager &vegetManager)

Data Fields

CTessNodeListNext
CTessNodeListPrec

Private Attributes

bool _Dirty
CTessList< CVegetableInstanceGroup_InstanceGroupList
CVegetableClipBlock_Owner
bool _UnderWater
bool ZSortHardMode
Fast sorting.
CVector _Center
 center of the sort block.

uint _NIndices
 number of indeices= numTriangles*3.

uint _NTriangles
 number of triangles.

uint _QuadrantId
 current quadrant used. computed at each render.

float _Radius
 approximate Radius of the sort block.

NLMISC::CObjectVector< uint32,
false > 
_SortedTriangleArray
uint32_SortedTriangleIndices [NL3D_VEGETABLE_NUM_QUADRANT]
 start ptr.

float _SortKey
 Positive value used for sort. (square of distance to viewer + threshold). temp computed at each render().


Friends

class CSortVSB
class CVegetableBlendLayerModel
class CVegetableClipBlock
class CVegetableManager


Constructor & Destructor Documentation

NL3D::CVegetableSortBlock::CVegetableSortBlock  ) 
 

Constructor.

Definition at line 46 of file vegetable_sort_block.cpp.

References _NIndices, _NTriangles, _UnderWater, and ZSortHardMode.

00047 {
00048         ZSortHardMode= true;
00049         _NTriangles= 0;
00050         _NIndices= 0;
00051         _Dirty= false;
00052         _UnderWater= false;
00053 }


Member Function Documentation

const CVector& NL3D::CVegetableSortBlock::getCenter  )  const [inline]
 

Definition at line 64 of file vegetable_sort_block.h.

00064 {return _Center;}

void NL3D::CVegetableSortBlock::updateSortBlock CVegetableManager vegetManager  ) 
 

After adding some instance to any instance group of a sorted block, you must recall this method NB: CVegetableManager::addInstance() and CVegetableManager::deleteIg() flag this SB as Dirty, when needed only. if !Dirty, updateSortBlock() is a no-op. /see CVegetableManager::addInstance() CVegetableManager::deleteIg() Warning! Use OptFastFloor()! So call must be enclosed with a OptFastFloorBegin()/OptFastFloorEnd().

Definition at line 74 of file vegetable_sort_block.cpp.

References _InstanceGroupList, _NIndices, _NTriangles, NL3D::CVegetableInstanceGroup::_RdrPass, _SortedTriangleArray, _SortedTriangleIndices, NL3D::CVegetableInstanceGroup::_TriangleQuadrantOrders, NL3D::CTessList< CVegetableInstanceGroup >::begin(), NLMISC::CObjectVector< uint32, false >::clear(), NL3D::CSortTri::Dist, NLMISC::CObjectVector< uint32, false >::getPtr(), H_AUTO, NL3D::CTessNodeList::Next, NL3D_VEGETABLE_NUM_QUADRANT, NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT, nlassert, NL3D::CVegetableInstanceGroup::CVegetableRdrPass::NTriangles, NLMISC::CObjectVector< uint32, false >::resize(), NL3D::CVegetableInstanceGroup::CVegetableRdrPass::TriangleIndices, NL3D::CSortTri::TriIndex, uint, and uint32.

Referenced by NL3D::CLandscapeVegetableBlock::update().

00075 {
00076         H_AUTO( NL3D_Vegetable_Update_SortBlock );
00077 
00078         // if nothing to update (ie instance added/deleted do not impact me).
00079         if(!_Dirty)
00080         {
00081                 // nothing to do.
00082                 return;
00083         }
00084         else
00085         {
00086                 // Ok clean me now.
00087                 _Dirty= false;
00088         }
00089 
00090         // compute number of triangles.
00091         _NTriangles= 0;
00092         CVegetableInstanceGroup         *ptrIg= _InstanceGroupList.begin();
00093         while(ptrIg)
00094         {
00095                 // add only zsort rdrPass triangles.
00096                 _NTriangles+= ptrIg->_RdrPass[NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT].NTriangles;
00097 
00098                 // next Ig in the SortBlock
00099                 ptrIg= (CVegetableInstanceGroup*)(ptrIg->Next);
00100         }
00101         // compute number of indices
00102         _NIndices= _NTriangles*3;
00103 
00104 
00105         // if no triangles, clear and go
00106         if(_NTriangles == 0)
00107         {
00108                 // reset the array of indices.
00109                 _SortedTriangleArray.clear();
00110                 // bye
00111                 return;
00112         }
00113         else
00114         {
00115                 // else, re-allocate the array
00116                 _SortedTriangleArray.resize(_NIndices * NL3D_VEGETABLE_NUM_QUADRANT);
00117         }
00118 
00119         // resize an array for sorting.
00120         nlassert(_NTriangles < 65536);
00121         static  std::vector<CSortTri>   triSort;
00122         static  std::vector<uint32>             triIndices;
00123         // don't use resize because fill with default values. size() is the capacity here.
00124         if(triSort.size()<_NTriangles)
00125         {
00126                 triSort.resize(_NTriangles);
00127                 triIndices.resize(_NIndices);
00128         }
00129 
00130         // fill indices with all ig info.
00131         //-------------
00132         {
00133                 uint32          *triIdxPtr= &triIndices[0];
00134                 // for all igs in the sortBlock.
00135                 ptrIg= _InstanceGroupList.begin();
00136                 while(ptrIg)
00137                 {
00138                         CVegetableInstanceGroup::CVegetableRdrPass      &vegetRdrPass= ptrIg->_RdrPass[NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT];
00139                         uint32          *triSrcPtr= vegetRdrPass.TriangleIndices.getPtr();
00140 
00141                         // add only zsort rdrPass triangles.
00142                         for(uint i=0; i<vegetRdrPass.NTriangles; i++)
00143                         {
00144                                 // fill the triangle indices.
00145                                 *(triIdxPtr++)= *(triSrcPtr++);
00146                                 *(triIdxPtr++)= *(triSrcPtr++);
00147                                 *(triIdxPtr++)= *(triSrcPtr++);
00148                         }
00149 
00150                         // next Ig in the SortBlock
00151                         ptrIg= (CVegetableInstanceGroup*)(ptrIg->Next);
00152                 }
00153         }
00154 
00155         // Sort for all quadrants
00156         //-------------
00157         for(uint quadrant=0; quadrant<NL3D_VEGETABLE_NUM_QUADRANT; quadrant++)
00158         {
00159                 // ReFill SortTris with Start Data
00160                 //-------------
00161                 CSortTri        *triPtr= &triSort[0];
00162                 uint            triId= 0;
00163                 // for all igs in the sortBlock.
00164                 ptrIg= _InstanceGroupList.begin();
00165                 while(ptrIg)
00166                 {
00167                         CVegetableInstanceGroup::CVegetableRdrPass      &vegetRdrPass= ptrIg->_RdrPass[NL3D_VEGETABLE_RDRPASS_UNLIT_2SIDED_ZSORT];
00168 
00169                         // add only zsort rdrPass triangles.
00170                         for(uint i=0; i<vegetRdrPass.NTriangles; i++, triPtr++, triId++)
00171                         {
00172                                 // QSort.
00173                                 triPtr->Dist = ptrIg->_TriangleQuadrantOrders[quadrant][i];
00174 
00175                                 // copy tri info
00176                                 triPtr->TriIndex= triId;
00177                         }
00178 
00179                         // next Ig in the SortBlock
00180                         ptrIg= (CVegetableInstanceGroup*)(ptrIg->Next);
00181                 }
00182 
00183                 // sort the array according to distance
00184                 //-------------
00185                 // QSort.
00186                 sort(triSort.begin(), triSort.begin()+_NTriangles);
00187 
00188 
00189                 // Fill result.
00190                 //-------------
00191                 // init quadrant ptr.
00192                 _SortedTriangleIndices[quadrant]= _SortedTriangleArray.getPtr() + quadrant * _NIndices;
00193 
00194                 // fill the indices.
00195                 uint32  *pIdx= _SortedTriangleIndices[quadrant];
00196                 for(uint i=0; i<_NTriangles; i++)
00197                 {
00198                         uint32  idTriIdx= triSort[i].TriIndex * 3;
00199                         *(pIdx++)= triIndices[idTriIdx+0];
00200                         *(pIdx++)= triIndices[idTriIdx+1];
00201                         *(pIdx++)= triIndices[idTriIdx+2];
00202                 }
00203         }
00204 }


Friends And Related Function Documentation

friend class CSortVSB [friend]
 

Definition at line 78 of file vegetable_sort_block.h.

friend class CVegetableBlendLayerModel [friend]
 

Definition at line 80 of file vegetable_sort_block.h.

friend class CVegetableClipBlock [friend]
 

Definition at line 79 of file vegetable_sort_block.h.

friend class CVegetableManager [friend]
 

Definition at line 77 of file vegetable_sort_block.h.


Field Documentation

CVector NL3D::CVegetableSortBlock::_Center [private]
 

center of the sort block.

Definition at line 96 of file vegetable_sort_block.h.

Referenced by NL3D::CVegetableManager::addInstance(), NL3D::CVegetableManager::createSortBlock(), and NL3D::CVegetableManager::render().

bool NL3D::CVegetableSortBlock::_Dirty [private]
 

Definition at line 88 of file vegetable_sort_block.h.

Referenced by NL3D::CVegetableManager::addInstance(), and NL3D::CVegetableManager::deleteIg().

CTessList<CVegetableInstanceGroup> NL3D::CVegetableSortBlock::_InstanceGroupList [private]
 

Definition at line 118 of file vegetable_sort_block.h.

Referenced by NL3D::CVegetableManager::addInstance(), NL3D::CVegetableManager::createIg(), NL3D::CVegetableManager::deleteIg(), NL3D::CVegetableManager::deleteSortBlock(), NL3D::CVegetableManager::render(), and updateSortBlock().

uint NL3D::CVegetableSortBlock::_NIndices [private]
 

number of indeices= numTriangles*3.

Definition at line 113 of file vegetable_sort_block.h.

Referenced by CVegetableSortBlock(), and updateSortBlock().

uint NL3D::CVegetableSortBlock::_NTriangles [private]
 

number of triangles.

Definition at line 111 of file vegetable_sort_block.h.

Referenced by CVegetableSortBlock(), NL3D::CVegetableManager::render(), NL3D::CVegetableBlendLayerModel::render(), and updateSortBlock().

CVegetableClipBlock* NL3D::CVegetableSortBlock::_Owner [private]
 

Definition at line 84 of file vegetable_sort_block.h.

Referenced by NL3D::CVegetableManager::createIg(), NL3D::CVegetableManager::createSortBlock(), and NL3D::CVegetableManager::deleteSortBlock().

uint NL3D::CVegetableSortBlock::_QuadrantId [private]
 

current quadrant used. computed at each render.

Definition at line 103 of file vegetable_sort_block.h.

Referenced by NL3D::CVegetableManager::render(), and NL3D::CVegetableBlendLayerModel::render().

float NL3D::CVegetableSortBlock::_Radius [private]
 

approximate Radius of the sort block.

Definition at line 98 of file vegetable_sort_block.h.

Referenced by NL3D::CVegetableManager::addInstance(), NL3D::CVegetableManager::createSortBlock(), and NL3D::CVegetableManager::render().

NLMISC::CObjectVector<uint32, false> NL3D::CVegetableSortBlock::_SortedTriangleArray [private]
 

Quadrants. the big array of indices, for the NL3D_VEGETABLE_NUM_QUADRANT quadrants.

Definition at line 107 of file vegetable_sort_block.h.

Referenced by updateSortBlock().

uint32* NL3D::CVegetableSortBlock::_SortedTriangleIndices[NL3D_VEGETABLE_NUM_QUADRANT] [private]
 

start ptr.

Definition at line 109 of file vegetable_sort_block.h.

Referenced by NL3D::CVegetableBlendLayerModel::render(), and updateSortBlock().

float NL3D::CVegetableSortBlock::_SortKey [private]
 

Positive value used for sort. (square of distance to viewer + threshold). temp computed at each render().

Definition at line 101 of file vegetable_sort_block.h.

Referenced by NL3D::CSortVSB::operator<(), and NL3D::CVegetableManager::render().

bool NL3D::CVegetableSortBlock::_UnderWater [private]
 

Definition at line 91 of file vegetable_sort_block.h.

Referenced by NL3D::CVegetableManager::addInstance(), CVegetableSortBlock(), and NL3D::CVegetableManager::render().

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(), updateSortBlock(), and NL3D::CPatch::updateTileVBAlloc().

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

Definition at line 43 of file tess_list.h.

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

bool NL3D::CVegetableSortBlock::ZSortHardMode [private]
 

Definition at line 122 of file vegetable_sort_block.h.

Referenced by NL3D::CVegetableManager::addInstance(), NL3D::CVegetableManager::createIg(), CVegetableSortBlock(), and NL3D::CVegetableBlendLayerModel::render().


The documentation for this class was generated from the following files:
Generated on Tue Mar 16 08:22:39 2004 for NeL by doxygen 1.3.6