/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2006.12.04 * ³» ¿ë : ³×ºñÇÊµå ³ëµå * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "Box.h" class cRay; class NiFrustumPlanes; class cSceneNode; class cNaviFieldBranchNode; class cNaviFieldLeafNode; class cNaviFieldBuffer; #ifdef MAP_EDITOR class cNaviFieldNodePaintingInfo; class cNaviFieldNodePainting; #endif /// ³×ºñÇÊµå ³ëµå class cNaviFieldNode { public: cNaviFieldNode( cNaviFieldBranchNode* parent, unsigned int xi, unsigned int yi, unsigned int cellCount ); virtual ~cNaviFieldNode(); /// µ¿±âÈ­ virtual void SyncHeight() = 0; /// Äøµ virtual void Cull( tArray* visibleArray, NiFrustumPlanes& frustum ) = 0; /// °¡½Ã ¹è¿­¿¡ Ãß°¡ virtual void AddToVisibleArray( tArray* visibleArray ) = 0; /// ¹ÝÁ÷¼±¿¡ ´ëÇÑ Ãæµ¹ °Ë»ç virtual bool CollideRay( NiPoint3* contact, float* distance, const cRay& ray ) = 0; /// °æ°è »óÀÚ¸¦ ¸®ÅÏ const cBox& GetBoundBox() const; public: /// ºÎ¸ð cNaviFieldBranchNode* mParent; /// °æ°è »óÀÚ cBox mBoundBox; NiPoint3 mCenter; float mRadius; }; inline const cBox& cNaviFieldNode::GetBoundBox() const { return mBoundBox; } /// ³×ºñÇÊµå °¡Áö ³ëµå class cNaviFieldBranchNode : public cNaviFieldNode { friend class cNaviFieldLeafNode; public: cNaviFieldBranchNode( cNaviFieldBranchNode* parent, unsigned int xi, unsigned int yi, unsigned int cellCount ); ~cNaviFieldBranchNode(); /// µ¿±âÈ­ void SyncHeight(); /// Äøµ void Cull( tArray* visibleArray, NiFrustumPlanes& frustum ); /// °¡½Ã ¹è¿­¿¡ Ãß°¡ void AddToVisibleArray( tArray* visibleArray ); /// ¹ÝÁ÷¼±¿¡ ´ëÇÑ Ãæµ¹ °Ë»ç bool CollideRay( NiPoint3* contact, float* distance, const cRay& ray ); protected: /// °æ°è »óÀÚ¸¦ °»½Å void UpdateBoundUpward(); public: /// ÀÚ½Ä ¹è¿­ cNaviFieldNode* mChild[4]; }; /// ³×ºñÇÊµå ¸®ÇÁ ³ëµå class cNaviFieldLeafNode : public cNaviFieldNode { friend class cNaviField; friend class cNaviFieldBranchNode; friend class cNaviFieldNodeCompareForRendering; #ifdef MAP_EDITOR friend class cNaviFieldNodePainting; #endif public: cNaviFieldLeafNode( cNaviFieldBranchNode* parent, unsigned int xi, unsigned int yi, unsigned int gridSize ); ~cNaviFieldLeafNode(); /// µ¿±âÈ­ void SyncHeight(); /// Äøµ void Cull( tArray* visibleArray, NiFrustumPlanes& frustum ); /// °¡½Ã ¹è¿­¿¡ Ãß°¡ void AddToVisibleArray( tArray* visibleArray ); /// ¹ÝÁ÷¼±¿¡ ´ëÇÑ Ãæµ¹ °Ë»ç bool CollideRay( NiPoint3* contact, float* distance, const cRay& ray ); /// ÁöÇü¿¡ ¸ÂÃã bool SyncToNaviField( const NiPoint3& pos, float innerRadius, float radius ); /// ¿ÀºêÁ§Æ®¿¡ ¸ÂÃã bool SyncToObject( const NiPoint3& pos, float innerRadius, float radius, float z ); #ifdef MAP_EDITOR /// »öÄ¥ bool Color( const NiPoint3& pos, float radius, float red, float green, float blue, unsigned char value ); #endif private: /// °æ°è »óÀÚ¸¦ °»½Å void UpdateBoundUpward(); /// ±âÇÏ Á¤º¸¸¦ °»½Å void UpdateColors(); #ifdef MAP_EDITOR /// º¯°æÀü Á¤º¸¸¦ ¹é¾÷ /// Undo, Redo¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ ¼öÁýÇÑ´Ù. bool BackupPainting( cNaviFieldNodePaintingInfo* info, const NiPoint3& pos, float radius ); /// ³×ºñÇʵåÀÇ »ö»ó¸Ê°ú µ¿±âÈ­ ¹× °»½Å void UpdatePainting( cNaviFieldNodePaintingInfo* info, const NiPoint3& pos, float radius ); /// Undo, Redo void Undo( const cNaviFieldNodePainting& doing ); void Redo( const cNaviFieldNodePainting& doing ); #endif /// Á¤Á¡ ¹üÀ§¸¦ °è»ê bool CalcRange( unsigned int* xbegin, unsigned int* ybegin, unsigned int* xend, unsigned int* yend, const NiPoint3& pos, float radius ); private: /// ÁÂÇ¥ (³×ºñÇÊµå ±×¸®µå »óÀÇ À§Ä¡) unsigned int mXIndex; unsigned int mYIndex; /// ¹öÆÛ cNaviFieldBuffer* mBuffer; private: /// ¸®ÇÁ ³ëµåÀÇ ±×¸®µå Å©±â static unsigned int mCellCount; static unsigned int mLineCount; }; /// ³×ºñÇÊµå ³ëµå ºñ±³ ÇÔ¼öÀÚ class cNaviFieldNodeCompareForRendering { public: bool operator () ( const cNaviFieldLeafNode* left, const cNaviFieldLeafNode* right ) const { cNaviFieldBuffer* lbuff = left->mBuffer; cNaviFieldBuffer* rbuff = right->mBuffer; return lbuff < rbuff; }; };