// octree.h #ifndef _3DTERRAIN_OCTTREE_H_ #define _3DTERRAIN_OCTTREE_H_ #include "octnode.h" #include // ÄÚµùÀÇ ÆíÀǸ¦ À§ÇØ Á¤ÀÇÇÑ µ¥ÀÌÅÍ Å¸ÀÔ typedef CWzHashTable< COctNode*, WzOctIndex > WzHashQctNode; typedef CWzArray< COctNode* > WzAryQctNode; typedef CWzArray< DWORD > WzAryDWORD; class COctree { public: COctree(); virtual ~COctree(); virtual void Clear(); public: BOOL Create( BvAABB aabbRegion); void Destroy(); /// @name --- ¿ÁÆ®¸® ±¸Á¶ protected: CWzHashTable m_htOctNodes; ///< ¿ÁÆ®¸® ³ëµåµéÀ» ÀúÀå int m_iCountNode; ///< Àüü ³ëµå °³¼ö public: int GetNodeCount(){return m_iCountNode;} WzOctIndex CreateOctNode( WzOctIndex woiParent, int iChildIndex, BvAABB aabbNew); void DestroyOctNode( WzOctIndex woiIndex); COctNode* GetOctNode( WzOctIndex woiIndex) { return ( m_htOctNodes.Get( woiIndex + 1)); } // +1 ÇÏ´Â ÀÌÀ¯´Â Root node ÀÇ 0 À» À߸øµÈ °ªÀ¸·Î ÀνÄÇϱ⠶§¹® COctNode* GetRootNode() { return ( GetOctNode( 0)); } /// @name --- Object Ãß°¡/»èÁ¦/Æ÷ÇÔ¿©ºÎ °ü·Ã public: virtual WzOctIndex GetOctIndexToAddObject( const WzBoundingVolume *pwbv, WzOctIndex woiFrom = 0); virtual WzOctIndex GetOctIndexToSearch( WzOctIndex woi); virtual WzOctIndex AddObject( ENUM_DATATYPE_OCTNODE dto, DWORD dwObject, WzOctIndex woiIndex); virtual WzOctIndex AddObject( ENUM_DATATYPE_OCTNODE dto, DWORD dwObject, const WzBoundingVolume *pwbv); virtual BOOL RemoveObject( ENUM_DATATYPE_OCTNODE dto, DWORD dwObject, WzOctIndex woiIndex); virtual BOOL RemoveObject( ENUM_DATATYPE_OCTNODE dto, DWORD dwObject, const WzBoundingVolume *pwbv); virtual BOOL IsContainable( WzOctIndex woiIndex, const WzBoundingVolume *pwbv); /// @name --- ºñ¾î ÀÖ´Â Node »èÁ¦Çϱâ protected: CWzList m_lstNodeDelete; public: virtual void InsertNodeDeleteList( WzOctIndex woi); ///< Á¦°ÅµÉ ³ëµå¿¡ Ãß°¡ virtual void DeleteNodeInDeleteList(); ///< Á¦°ÅµÉ ³ëµåµé Á¦°Å Enumerate_IntersectFrustum ¿¡¼­ ÀÚµ¿È£ÃâµÊ /// @name --- °Ë»öÇϱâ public: virtual CWzArray* New_ArrayToEnumerate(); ///< ¿ÜºÎ¿¡¼­ ¸¸µé¾îÁø CWzArray ´Â ¾Æ·¡ÀÇ Enumerate_ ½Ã¸®Áî¿¡¼­ ¾µ ¼ö ¾ø°í ÀÌ ÇÔ¼ö·Î ¸¸µé¾î¾ß ÇÑ´Ù. virtual void Delete_ArrayToEnumerate( CWzArray *parDelete); virtual int Enumerate_IntersectRay_MultiType( std::vector& type_array, WzRay* ray_ptr, CWzArray* result_ptr ); virtual int Enumerate_IntersectRay( ENUM_DATATYPE_OCTNODE dto, WzRay *pwr, CWzArray *parResult); ///< ±¤¼±°ú ±³Â÷ÇÏ´Â °Í ¾ò±â virtual int Enumerate_IntersectBoundingVolume( ENUM_DATATYPE_OCTNODE dto, WzBoundingVolume *pwbv, CWzArray *parResult); ///< BV¿Í ±³Â÷ÇÏ´Â °Í ¾ò±â virtual int Enumerate_IntersectFrustum( ENUM_DATATYPE_OCTNODE dto, WzFrustum *pwf, CWzArray *parResult); ///< Frustum °ú ±³Â÷ÇÏ´Â °Í ¾ò±â virtual int Enumerate_All( ENUM_DATATYPE_OCTNODE dto, CWzArray *parResult); // ¸ðµç ³ëµå ¾ò±â virtual void RemoveAllEnumeratedList( CWzArray *parResult); ///< ¿ÜºÎ¿¡¼­ Enumerate ÇÑ List ÀÇ °æ¿ì RemoveAll µµ DLL ¿¡¼­ ÇØ¾ß ÇÑ´Ù. /** @addtogroup the occlusion culling * * Occlusion culling ±â´ÉÀ» ÀÌ¿ëÇϱâ À§ÇÑ ÄÚµå. * @{ */ public: void AddVisibleNode(COctNode* data) { m_aryVisibleNode.Add(data); } void AddVisibleTMNode(COctNode* data) { m_aryVisibleTMNode.Add(data); } void AddVisibleObject(DWORD data) { m_aryVisibleObj.Add(data); } void AddVisibleOcclusion(DWORD data) { m_aryVisibleOcc.Add(data); } void AddVisibleTerrain(DWORD data) { m_aryVisibleTMesh.Add(data); } void AddVisibleSound(DWORD data) { m_aryVisibleSnd.Add(data); } void AddVisibleUnit(DWORD data) { m_aryVisibleUnit.Add(data); } virtual int GetNumVisibleNode() { return m_aryVisibleNode.GetCount(); } virtual int GetNumVisibleTMNode() { return m_aryVisibleTMNode.GetCount(); } virtual int GetNumVisibleObject() { return m_aryVisibleObj.GetCount(); } virtual int GetNumVisibleOcclusion() { return m_aryVisibleOcc.GetCount(); } virtual int GetNumVisibleTerrain() { return m_aryVisibleTMesh.GetCount(); } virtual int GetNumVisibleSound() { return m_aryVisibleSnd.GetCount(); } virtual int GetNumVisibleUnit() { return m_aryVisibleUnit.GetCount(); } virtual float GetRangeForOcclusion() { return m_fRangeForOcclusion; } virtual COctNode *GetVisibleNode(int index) { return m_aryVisibleNode.Get(index); } virtual COctNode *GetVisibleTMNode(int index) { return m_aryVisibleTMNode.Get(index); } virtual DWORD GetVisibleObject(int index) { return m_aryVisibleObj.Get(index); } virtual DWORD GetVisibleOcclusion(int index) { return m_aryVisibleOcc.Get(index); } virtual DWORD GetVisibleTerrain(int index) { return m_aryVisibleTMesh.Get(index); } virtual DWORD GetVisibleSound(int index) { return m_aryVisibleSnd.Get(index); } virtual DWORD GetVisibleUnit(int index) { return m_aryVisibleUnit.Get(index); } /** OcclusionÀÇ À¯È¿ °Å¸®°ªÀ» Á¤ÇÑ´Ù. */ virtual void SetRangeForOcclusion(float range) { m_fRangeForOcclusion = range; } /** Frustum°ú ±³Â÷ÇÏ´Â °Í ¾ò±â. */ virtual int CullNode( CDrawBase *pDraw, WzFrustum *pwf, WzVector *pwvViewer); protected: int m_nNumVisibleNode; ///< °¡½ÃÀûÀÎ ³ëµåÀÇ °¹¼ö float m_fRangeForOcclusion; ///< Occlusion½Ã À¯È¿ÇÑ occluderÀÇ ¹üÀ§°ª public: WzAryQctNode m_aryVisibleNode; ///< Frustum¾È¿¡ ÀÖ´Â ³ëµå ¸ñ·Ï WzAryQctNode m_aryVisibleTMNode; ///< Frustum¾È¿¡ ÀÖ´Â ÁöÇüÀ» Æ÷ÇÔÇÑ ³ëµå ¸ñ·Ï WzAryDWORD m_aryVisibleOcc; ///< Frustum¾È¿¡ ÀÖ´Â Occlusion Æò¸é ¸ñ·Ï WzAryDWORD m_aryVisibleTMesh; ///< Frustum¾È¿¡ ÀÖ´Â ÁöÇü ¸ñ·Ï WzAryDWORD m_aryVisibleObj; ///< º¸Frustum¾È¿¡ ÀÖ´Â ¿ÀºêÁ§Æ® ¸ñ·Ï WzAryDWORD m_aryVisibleSnd; ///< Frustum¾È¿¡ ÀÖ´Â »ç¿îµå ¿µ¿ª ¸ñ·Ï WzAryDWORD m_aryVisibleUnit; ///< Frustum¾È¿¡ ÀÖ´Â À¯´Ö ¸ñ·Ï /** @} */ // end of the occlusion culling }; #endif // _3DTERRAIN_OCTTREE_H_