#include <quad_grid_clip_cluster.h>
Public Member Functions | |
void | clip (CClipTrav *clipTrav) |
CQuadGridClipClusterQTreeNode () | |
void | init (CQuadGridClipCluster *owner, uint level, bool rootNode, const NLMISC::CAABBox &pivot) |
void | insertModel (const NLMISC::CAABBox &worldBBox, uint distSetup, CTransformShape *model) |
void | noFrustumClip (CClipTrav *clipTrav) |
void | profileNumChildren (uint distLevel, uint &result) const |
void | resetSons (CClipTrav *clipTrav) |
~CQuadGridClipClusterQTreeNode () | |
Data Fields | |
NLMISC::CAABBox | BBox |
NLMISC::CAABBoxExt | BBoxExt |
bool | Empty |
bool | LeafNode |
CQuadGridClipClusterListDist | ListNode |
CQuadGridClipCluster * | Owner |
NLMISC::CAABBox | PivotBBox |
bool | RootNode |
CQuadGridClipClusterQTreeNode * | Sons [4] |
|
Definition at line 111 of file quad_grid_clip_cluster.cpp. References Empty, LeafNode, RootNode, and Sons.
|
|
Definition at line 174 of file quad_grid_clip_cluster.cpp. References ListNode, NL3D::CQuadGridClipClusterListDist::Models, nlassert, Sons, and uint.
|
|
Definition at line 193 of file quad_grid_clip_cluster.cpp. References NL3D::CQuadGridClipCluster::_DistMax, NL3D::CQuadGridClipCluster::_NumDist, BBoxExt, NL3D::CTravCameraScene::CamPos, NLMISC::clamp(), NLMISC::CAABBoxExt::clipBack(), NLMISC::CAABBoxExt::clipFront(), NL3D::CQuadGridClipClusterListDist::clipSons(), Empty, NL3D::CClipTrav::ForceNoFrustumClip, NLMISC::CAABBoxExt::getCenter(), NLMISC::CAABBoxExt::getRadius(), H_AFTER, H_AUTO, H_BEFORE, LeafNode, ListNode, noFrustumClip(), sint, Sons, and NL3D::CClipTrav::WorldPyramid. Referenced by NL3D::CQuadGridClipCluster::clip().
00194 { 00195 // if empty (test important for branch and leave clusters) 00196 if(Empty) 00197 return; 00198 00199 H_BEFORE( NL3D_QuadClip_NodeClip ); 00200 00201 // Then clip against pyramid 00202 bool unspecified= false; 00203 bool visible= true; 00204 for(sint i=0;i<(sint)clipTrav->WorldPyramid.size();i++) 00205 { 00206 // We are sure that pyramid has normalized plane normals. 00207 if(!BBoxExt.clipBack(clipTrav->WorldPyramid[i])) 00208 { 00209 visible= false; 00210 break; 00211 } 00212 // else test is the bbox is partially or fully in the plane 00213 else if(!unspecified) 00214 { 00215 // if clipFront AND clipBack, it means partially. 00216 if(BBoxExt.clipFront(clipTrav->WorldPyramid[i])) 00217 unspecified= true; 00218 } 00219 } 00220 00221 H_AFTER( NL3D_QuadClip_NodeClip ); 00222 00223 // if visible, parse sons 00224 if(visible) 00225 { 00226 // clip sons or cluster sons 00227 if(unspecified) 00228 { 00229 if( LeafNode) 00230 { 00231 // clip DistMax. 00232 CVector c= BBoxExt.getCenter(); 00233 float dist= (c - clipTrav->CamPos).norm(); 00234 dist-= BBoxExt.getRadius(); 00235 sint minDistSetup= (sint)floor(Owner->_NumDist*dist/Owner->_DistMax); 00236 // NB if too far, set _NumDist (ie will clip only the infinite objects ones) 00237 clamp(minDistSetup, 0, (sint)Owner->_NumDist); 00238 00239 // clip the sons individually 00240 H_AUTO( NL3D_QuadClip_SonsClip ); 00241 ListNode.clipSons(minDistSetup); 00242 } 00243 else 00244 { 00245 // clip cluster sons 00246 Sons[0]->clip(clipTrav); 00247 Sons[1]->clip(clipTrav); 00248 Sons[2]->clip(clipTrav); 00249 Sons[3]->clip(clipTrav); 00250 } 00251 } 00252 else 00253 { 00254 // udpdate the sons, but don't clip, because we know they are fully visible. 00255 clipTrav->ForceNoFrustumClip= true; 00256 00257 // show all cluster sons or sons 00258 noFrustumClip(clipTrav); 00259 00260 // reset flag 00261 clipTrav->ForceNoFrustumClip= false; 00262 } 00263 } 00264 } |
|
Definition at line 125 of file quad_grid_clip_cluster.cpp. References NL3D::CQuadGridClipCluster::_NumDistTotal, NLMISC::CAABBox::getCenter(), NLMISC::CAABBox::getHalfSize(), NLMISC::CAABBox::getMax(), NLMISC::CAABBox::getMin(), LeafNode, level, ListNode, NL3D::CQuadGridClipClusterListDist::Models, NL3D_QCC_LEFT_DOWN, NL3D_QCC_LEFT_UP, NL3D_QCC_RIGHT_DOWN, NL3D_QCC_RIGHT_UP, PivotBBox, RootNode, NLMISC::CAABBox::setCenter(), NLMISC::CAABBox::setSize(), Sons, uint, NLMISC::CVector::x, and NLMISC::CVector::y. Referenced by NL3D::CQuadGridClipCluster::CQuadGridClipCluster().
00126 { 00127 Owner= owner; 00128 RootNode= rootNode; 00129 PivotBBox= pivot; 00130 00131 // If not a leaf, create sons 00132 if(level>0) 00133 { 00134 LeafNode= false; 00135 00136 // split pivot for sons 00137 CAABBox pivotSon; 00138 pivotSon.setSize(PivotBBox.getHalfSize()); 00139 float xMin= PivotBBox.getMin().x/2; 00140 float yMin= PivotBBox.getMin().y/2; 00141 float xMax= PivotBBox.getMax().x/2; 00142 float yMax= PivotBBox.getMax().y/2; 00143 float xCenter= PivotBBox.getCenter().x/2; 00144 float yCenter= PivotBBox.getCenter().y/2; 00145 // LeftDown 00146 pivotSon.setCenter( CVector(xMin+xCenter,yMin+yCenter,0) ); 00147 Sons[NL3D_QCC_LEFT_DOWN]= new CQuadGridClipClusterQTreeNode; 00148 Sons[NL3D_QCC_LEFT_DOWN]->init(owner, level-1, false, pivotSon); 00149 // RightDown 00150 pivotSon.setCenter( CVector(xMax+xCenter,yMin+yCenter,0) ); 00151 Sons[NL3D_QCC_RIGHT_DOWN]= new CQuadGridClipClusterQTreeNode; 00152 Sons[NL3D_QCC_RIGHT_DOWN]->init(owner, level-1, false, pivotSon); 00153 // LeftUp 00154 pivotSon.setCenter( CVector(xMin+xCenter,yMax+yCenter,0) ); 00155 Sons[NL3D_QCC_LEFT_UP]= new CQuadGridClipClusterQTreeNode; 00156 Sons[NL3D_QCC_LEFT_UP]->init(owner, level-1, false, pivotSon); 00157 // RithgUp 00158 pivotSon.setCenter( CVector(xMax+xCenter,yMax+yCenter,0) ); 00159 Sons[NL3D_QCC_RIGHT_UP]= new CQuadGridClipClusterQTreeNode; 00160 Sons[NL3D_QCC_RIGHT_UP]->init(owner, level-1, false, pivotSon); 00161 } 00162 else 00163 { 00164 LeafNode= true; 00165 } 00166 00167 // Create the distMax list only if root or leaf. No models in interleaved branches. 00168 if( LeafNode) 00169 ListNode.Models.resize(Owner->_NumDistTotal); 00170 } |
|
Definition at line 301 of file quad_grid_clip_cluster.cpp. References BBox, BBoxExt, Empty, NLMISC::CAABBox::extend(), NLMISC::CAABBox::getCenter(), NLMISC::CAABBox::getHalfSize(), NL3D::CQuadGridClipClusterListDist::insertModel(), LeafNode, ListNode, NL3D_QCC_LEFT_DOWN, NL3D_QCC_LEFT_UP, NL3D_QCC_RIGHT_DOWN, NL3D_QCC_RIGHT_UP, PivotBBox, Sons, uint, NLMISC::CVector::x, and NLMISC::CVector::y. Referenced by NL3D::CQuadGridClipCluster::addModel().
00302 { 00303 // if leaf node, insert the model in the list 00304 if( LeafNode ) 00305 { 00306 if(Empty) 00307 { 00308 Empty= false; 00309 BBox= worldBBox; 00310 } 00311 else 00312 { 00313 // extend the bbox with 2 corners of the incoming bbox (sufficient for an AABBox). 00314 BBox.extend( worldBBox.getCenter() + worldBBox.getHalfSize() ); 00315 BBox.extend( worldBBox.getCenter() - worldBBox.getHalfSize() ); 00316 } 00317 00318 // insert in list 00319 ListNode.insertModel(distSetup, model); 00320 } 00321 // else, recurs insert in branch 00322 else 00323 { 00324 // choose what son according to pivot. 00325 CQuadGridClipClusterQTreeNode *selectSon; 00326 if( worldBBox.getCenter().y<PivotBBox.getCenter().y ) 00327 { 00328 if( worldBBox.getCenter().x<PivotBBox.getCenter().x ) 00329 selectSon= Sons[NL3D_QCC_LEFT_DOWN]; 00330 else 00331 selectSon= Sons[NL3D_QCC_RIGHT_DOWN]; 00332 } 00333 else 00334 { 00335 if( worldBBox.getCenter().x<PivotBBox.getCenter().x ) 00336 selectSon= Sons[NL3D_QCC_LEFT_UP]; 00337 else 00338 selectSon= Sons[NL3D_QCC_RIGHT_UP]; 00339 } 00340 00341 // insert in this cluster 00342 selectSon->insertModel(worldBBox, distSetup, model); 00343 00344 // extend my boox according to this son cluster. 00345 if(Empty) 00346 { 00347 Empty= false; 00348 BBox= selectSon->BBox; 00349 } 00350 else 00351 { 00352 // extend the bbox with 2 corners of the son bbox (sufficient for an AABBox). 00353 BBox.extend( selectSon->BBox.getCenter() + selectSon->BBox.getHalfSize() ); 00354 BBox.extend( selectSon->BBox.getCenter() - selectSon->BBox.getHalfSize() ); 00355 } 00356 } 00357 00358 // update bboxExt 00359 BBoxExt= BBox; 00360 } |
|
Definition at line 268 of file quad_grid_clip_cluster.cpp. References NL3D::CQuadGridClipCluster::_DistMax, NL3D::CQuadGridClipCluster::_NumDist, BBoxExt, NL3D::CTravCameraScene::CamPos, NLMISC::clamp(), NL3D::CQuadGridClipClusterListDist::clipSons(), Empty, NLMISC::CAABBoxExt::getCenter(), NLMISC::CAABBoxExt::getRadius(), H_AUTO_USE, LeafNode, ListNode, sint, and Sons. Referenced by clip().
00269 { 00270 // if empty (test important for branch and leave clusters) 00271 if(Empty) 00272 return; 00273 00274 // clip the sons 00275 if( LeafNode) 00276 { 00277 // clip DistMax. 00278 CVector c= BBoxExt.getCenter(); 00279 float dist= (c - clipTrav->CamPos).norm(); 00280 dist-= BBoxExt.getRadius(); 00281 sint minDistSetup= (sint)floor(Owner->_NumDist*dist/Owner->_DistMax); 00282 // NB if too far, set _NumDist (ie will clip only the infinite objects ones) 00283 clamp(minDistSetup, 0, (sint)Owner->_NumDist); 00284 00285 // clip the sons 00286 H_AUTO_USE( NL3D_QuadClip_SonsShowNoClip ); 00287 ListNode.clipSons(minDistSetup); 00288 } 00289 else 00290 { 00291 // forceShow of cluster sons 00292 Sons[0]->noFrustumClip(clipTrav); 00293 Sons[1]->noFrustumClip(clipTrav); 00294 Sons[2]->noFrustumClip(clipTrav); 00295 Sons[3]->noFrustumClip(clipTrav); 00296 } 00297 } |
|
Definition at line 377 of file quad_grid_clip_cluster.cpp. References ListNode, NL3D::CQuadGridClipClusterListDist::Models, Sons, and uint. Referenced by NL3D::CQuadGridClipCluster::profileNumChildren().
00378 { 00379 if(distLevel<ListNode.Models.size()) 00380 result+= ListNode.Models[distLevel].size(); 00381 // Add cluster sons 00382 if(Sons[0]) 00383 { 00384 Sons[0]->profileNumChildren(distLevel, result); 00385 Sons[1]->profileNumChildren(distLevel, result); 00386 Sons[2]->profileNumChildren(distLevel, result); 00387 Sons[3]->profileNumChildren(distLevel, result); 00388 } 00389 } |
|
Definition at line 363 of file quad_grid_clip_cluster.cpp. References ListNode, NL3D::CQuadGridClipClusterListDist::resetSons(), and Sons. Referenced by NL3D::CQuadGridClipCluster::resetSons().
|
|
Definition at line 75 of file quad_grid_clip_cluster.h. Referenced by NL3D::CQuadGridClipCluster::getBBox(), and insertModel(). |
|
Definition at line 76 of file quad_grid_clip_cluster.h. Referenced by clip(), insertModel(), and noFrustumClip(). |
|
Definition at line 77 of file quad_grid_clip_cluster.h. Referenced by clip(), CQuadGridClipClusterQTreeNode(), insertModel(), NL3D::CQuadGridClipCluster::isEmpty(), and noFrustumClip(). |
|
Definition at line 82 of file quad_grid_clip_cluster.h. Referenced by clip(), CQuadGridClipClusterQTreeNode(), init(), insertModel(), and noFrustumClip(). |
|
Definition at line 72 of file quad_grid_clip_cluster.h. Referenced by clip(), init(), insertModel(), noFrustumClip(), profileNumChildren(), resetSons(), and ~CQuadGridClipClusterQTreeNode(). |
|
Definition at line 66 of file quad_grid_clip_cluster.h. |
|
Definition at line 85 of file quad_grid_clip_cluster.h. Referenced by init(), and insertModel(). |
|
Definition at line 80 of file quad_grid_clip_cluster.h. Referenced by CQuadGridClipClusterQTreeNode(), and init(). |
|
Definition at line 69 of file quad_grid_clip_cluster.h. Referenced by clip(), CQuadGridClipClusterQTreeNode(), init(), insertModel(), noFrustumClip(), profileNumChildren(), resetSons(), and ~CQuadGridClipClusterQTreeNode(). |