// NeL - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#ifndef NL_QUAD_GRID_CLIP_CLUSTER_H
#define NL_QUAD_GRID_CLIP_CLUSTER_H
#include "nel/misc/types_nl.h"
#include "nel/3d/clip_trav.h"
#include "nel/misc/aabbox.h"
#include "nel/3d/fast_ptr_list.h"
namespace NL3D
{
class CQuadGridClipCluster;
// ***************************************************************************
class CQuadGridClipClusterListDist
{
public:
// An entry for each distance setup.
std::vector > Models;
public:
// If 0 clipSons of all dist Setup, esle start from minDistSetup
void clipSons(uint minDistSetup);
// insert a model in this listDist at the good place
void insertModel(uint distSetup, CTransformShape *model);
// erase all models and relink to rootCluster
void resetSons(CClipTrav *clipTrav);
};
// ***************************************************************************
class CQuadGridClipClusterQTreeNode
{
public:
CQuadGridClipCluster *Owner;
// 4 Sons
CQuadGridClipClusterQTreeNode *Sons[4];
// List of objects inserted in this node
CQuadGridClipClusterListDist ListNode;
// The BBox of this node.
NLMISC::CAABBox BBox;
NLMISC::CAABBoxExt BBoxExt;
bool Empty;
// Am i the root?
bool RootNode;
// Am i a leaf?
bool LeafNode;
// The reference 2D BBox pivot to know how to insert models
NLMISC::CAABBox PivotBBox;
public:
CQuadGridClipClusterQTreeNode();
~CQuadGridClipClusterQTreeNode();
// init me and sons
void init(CQuadGridClipCluster *owner, uint level, bool rootNode, const NLMISC::CAABBox &pivot);
// clip the cluster or his sons
void clip(CClipTrav *clipTrav);
// No cluster clip
void noFrustumClip(CClipTrav *clipTrav);
// insert a model in this listDist at the good place
void insertModel(const NLMISC::CAABBox &worldBBox, uint distSetup, CTransformShape *model);
// erase all models and relink to rootCluster
void resetSons(CClipTrav *clipTrav);
// count numchildren and add sons
void profileNumChildren(uint distLevel, uint &result) const;
};
// ***************************************************************************
/**
* A cluster of object for fast BBox clip.
* \author Lionel Berenguier
* \author Nevrax France
* \date 2001
*/
class CQuadGridClipCluster
{
public:
// For insertion in the QuadGridClipManager
CFastPtrListNode ListNode;
public:
/// Constructor
CQuadGridClipCluster(uint numDist, float distMax, const NLMISC::CAABBox &pivot);
~CQuadGridClipCluster();
void addModel(const NLMISC::CAABBox &worldBBox, CTransformShape *model);
// NB: the BBox is not recomputed.
void removeModel(CTransformShape *model);
void clip(CClipTrav *clipTrav);
// NB it is possible that profileNumChildren()==0 and isEmpty()==false!!
bool isEmpty() const {return _Root.Empty;}
const NLMISC::CAABBox &getBBox() const {return _Root.BBox;}
sint profileNumChildren(uint distLevel) const;
void resetSons(CClipTrav *clipTrav);
protected:
friend class CQuadGridClipClusterQTreeNode;
// The max distance tested
float _DistMax;
// The number of distance not infinite.
uint _NumDist;
// _NumDist+1 (the infinite distance)
uint _NumDistTotal;
// The Root of QuadTree.
CQuadGridClipClusterQTreeNode _Root;
};
} // NL3D
#endif // NL_QUAD_GRID_CLIP_CLUSTER_H
/* End of quad_grid_clip_cluster.h */