/** @file QuadTree.h @brief 四叉树只用做按照四叉树结构构造包围盒层级树,本身不用做场景管理
*	Copyright (c) 2007,第九城市游戏研发中心
*	All rights reserved.
*
*	当前版本:0.70
*	作    者:Shi Yazheng
*	完成日期:2008-01-19
*	描	  述:完成 用四叉树构造包围盒层级树
*			  
*
*	取代版本:0.69	(有bug)
*	作    者:Shi Yazheng
*	完成日期:2008-01-18
*	描	  述:作废 根据视锥创建可视列表功能
*			  增加 根据四叉树构造包围盒层级树功能
*
*	取代版本:0.6 (未测试)
*	作    者:Shi Yazheng
*	完成日期:2008-01-16
*	描	  述:完成 物件集填加 及 根据视锥创建可视列表
*
*	取代版本:0.1
*	作    者:Zhaixufeng
*	完成日期:2007-09-26
*/ #ifndef QUADTREE_H #define QUADTREE_H #ifndef CODE_INGAME // 每个四叉树节点可拥有的子节点数 #define QUAD_NUM 4 // 最小节点边长 #define MIN_EDGE_LENGTH 6 class CTerrain; #include "tinyxml.h" /// 四叉树节点定义 struct MAIN_ENTRY stQuadNode { /// 父节点 stQuadNode* pParent; /// 四孩子节点 stQuadNode* pChild[QUAD_NUM]; // child node 0-LU 1-RU 2-LB 3-RB /// 叶子标志 bool bIsLeaf; // leaf signal /// 层次级别 int iLevel; // level index int iLength; // 节点边长 /// 包围盒 NiBoxBV boundingBox; /// 可编辑对象集, 依层级存放于叶子节点,初始保存于根节点 //vector< CEditableBaseObj* > objsArray; /// vector< NiAVObject* > niObjsArray; vector iEntityIDArray; /// 默认构造 stQuadNode() : pParent( 0 ), bIsLeaf( false ), iLevel( 0 ) { memset(pChild, 0, sizeof(void*)*QUAD_NUM); } /** *
功能说明:获取某子节点. *
可访问性: *
注 释:如果该节点已存在,返回该节点。如果不存在则创建后再返回。 * @param iWhich[in] 子节点编号 * @return 获取的子节点 */ stQuadNode* GetChild(int iWhich); /** *
功能说明:将一个 CEditableBaseObj对象添加到四叉树节点中 *
可访问性: *
注 释:将pObj添加到从空间上能完全容纳该pObj,并且iLevel最大的节点中。 * @param pObj[in] 被添加的CEditableBaseObj对象指针 * @return 接受 pObj 加入objArray的四叉树节点 */ //stQuadNode* AttachObject(CEditableBaseObj* pObj); stQuadNode* AttachObject(NiAVObject* pObj, int iEntityID); /// 计算某子节点的包围盒。该子节点可以不存在。 NiBoxBV GetChildAABB(int iWhich); /// 用当前四叉树节点(及所有子节点)构件场景图 NiNodePtr BuildSceneGraph(); // 根据视锥对quadTree进行剔除,创建可视列表 // 函数作废。使用quadTree构建包围盒层级树,交由引擎进行可视剔除 //void BuilderVisibleSet(NiFrustumPlanes* pFrustum, NiVisibleArray *pVisible); // 按照 xml 方式获取节点 TiXmlElement* GetAsXMLElement(); }; /// 四叉树 class MAIN_ENTRY CQuadTree { public: /// 构造 CQuadTree( const NiPoint3& kCenter, const NiPoint3& kExtends); /// 析构 ~CQuadTree() { this->_Destroy(); } /// 将物件添加到四叉树中 stQuadNode* AttachObject(NiAVObject* pObj, int iID); /// 用四叉树构造场景图 NiNodePtr BuildSceneGraph(); TiXmlElement* GetAsXMLElement(); protected: /// 销毁所有节点 void _Destroy(); /// 销毁节点及其所有子节点 void _DestroyNode( stQuadNode*& pNode ); /// 根节点 stQuadNode* m_pRoot; }; #endif #endif