/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2006.12.04 * ³» ¿ë : ÁöÇü ³ëµå * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "Box.h" #include "Terrain.h" class cLightSceneNode; class cTerrainBranchNode; class cTerrainLeafNode; class cTerrainTexture; class cTerrainBuffer; /// ÁöÇü ³ëµå class cTerrainNode { public: cTerrainNode( unsigned int xi, unsigned int yi, unsigned int cellCount ); virtual ~cTerrainNode(); /// ·Îµù virtual bool Load( cFileLoader& loader ) = 0; virtual void AddToLoadArray( cTerrainNode** loadArray, unsigned int& count ) = 0; /// Äøµ virtual void Cull() = 0; virtual void AddToVisibleArray() = 0; /// Ãæµ¹ °Ë»ç virtual bool CollideSphere() = 0; /// °æ°è »óÀÚ const cBox& GetBoundBox() const; /// ÁßÁ¡ const NiPoint3& GetCenter() const; public: /// °æ°è cBox mBoundBox; NiPoint3 mCenter; float mRadius; protected: /// Äøµ¿ë static NiFrustumPlanes* mFrustum; static tArray* mVisibleArray; /// Ãæµ¹ °Ë»ç¿ë static const cSphere* mSphere; static tArray* mPickedArray; }; inline const cBox& cTerrainNode::GetBoundBox() const { return mBoundBox; } inline const NiPoint3& cTerrainNode::GetCenter() const { return mCenter; } /// ÁöÇü °¡Áö ³ëµå class cTerrainBranchNode : public cTerrainNode { public: cTerrainBranchNode( unsigned int xi, unsigned int yi, unsigned int cellCount ); virtual ~cTerrainBranchNode(); /// ·Îµù bool Load( cFileLoader& loader ); void AddToLoadArray( cTerrainNode** loadArray, unsigned int& count ); /// Äøµ void Cull(); void AddToVisibleArray(); /// Ãæµ¹ °Ë»ç bool CollideSphere(); public: /// ÀÚ½Ä ¹è¿­ cTerrainNode* mChild[4]; }; /// ÁöÇü ¸®ÇÁ ³ëµå class cTerrainLeafNode : public cTerrainNode { friend class cTerrain; friend class cTerrainBranchNode; friend class cTerrainNodeCompareForRendering; friend class cLightSceneNode; public: cTerrainLeafNode( unsigned int xi, unsigned int yi, unsigned int cellCount ); virtual ~cTerrainLeafNode(); /// Áö¿ò void Clear(); /// ·Îµù bool Load( cFileLoader& loader ); void AddToLoadArray( cTerrainNode** loadArray, unsigned int& count ); /// Äøµ void Cull(); void AddToVisibleArray(); /// Ãæµ¹ °Ë»ç bool CollideSphere(); /// Á¶¸í void SetLight( cLightSceneNode* light, unsigned int indexByLight ); const cLightSceneNode* GetLight() const; private: /// ÅØ½ºÃ³ void SetTextures( cTerrainTexture* tex0, cTerrainTexture* tex1, cTerrainTexture* tex2 ); void CalcTextureValue(); void UpdateLODInfo(); private: /// ÁÂÇ¥ (ÁöÇü ±×¸®µå »óÀÇ À§Ä¡) unsigned int mXIndex; unsigned int mYIndex; /// °¡½Ã ¿©ºÎ bool mVisible; /// ¹öÆÛ cTerrainBuffer* mBuffer; /// µðÅ×ÀÏ ÅØ½ºÃ³ cTerrainTexture* mTexture0; cTerrainTexture* mTexture1; cTerrainTexture* mTexture2; unsigned int mTextureValue0; unsigned int mTextureValue1; /// Á¶¸í cLightSceneNode* mLight; unsigned int mIndexByLight; /// Level of detail unsigned int mLod; unsigned int mCrackIndex; cTerrainLeafNode* mSiblingLeafNode[4]; private: /// ¹öÀü static unsigned int mVersion; /// ¸®ÇÁ ³ëµåÀÇ ±×¸®µå Å©±â // static unsigned int mCellCount[TERRAIN_LOD_COUNT]; // static unsigned int mLineCount[TERRAIN_LOD_COUNT]; }; inline const cLightSceneNode* cTerrainLeafNode::GetLight() const { return mLight; } /// ÁöÇü ³ëµå ºñ±³ ÇÔ¼öÀÚ class cTerrainNodeCompareForRendering { public: bool operator () ( const void* left, const void* right ) const { cTerrainLeafNode* lnode = (cTerrainLeafNode*)left; cTerrainLeafNode* rnode = (cTerrainLeafNode*)right; cTerrainBuffer* lbuff = lnode->mBuffer; cTerrainBuffer* rbuff = rnode->mBuffer; if( lbuff == rbuff ) { unsigned int ltex = lnode->mTextureValue0; unsigned int rtex = rnode->mTextureValue0; if( ltex == rtex ) { ltex = lnode->mTextureValue1; rtex = rnode->mTextureValue1; if( ltex == rtex ) { if( lnode->mYIndex == rnode->mYIndex ) { return lnode->mXIndex < rnode->mXIndex; } return lnode->mYIndex < rnode->mYIndex; } return ltex < rtex; } return ltex < rtex; } return lbuff < rbuff; }; };