/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2006.12.04 * ³» ¿ë : ÁöÇü ³ëµå * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "Box.h" #include "Terrain.h" class cRay; class cSceneNode; class cLightSceneNode; class cTerrainBranchNode; class cTerrainLeafNode; class cTerrainTexture; class cTerrainBuffer; #ifdef MAP_EDITOR class cTerrainNodeBuildingInfo; class cTerrainNodeBuilding; class cTerrainNodePaintingInfo; class cTerrainNodePainting; class cTerrainNodeDetailingInfo; class cTerrainNodeDetailing; #endif enum eTerrainViewMode; /// ÁöÇü ³ëµå class cTerrainNode { friend class cTerrain; public: cTerrainNode( cTerrainBranchNode* parent, unsigned int xi, unsigned int yi, unsigned int cellCount ); virtual ~cTerrainNode(); /// ·Îµù virtual bool Load( cFileLoader& loader ) = 0; #ifdef MAP_EDITOR /// ÀúÀå virtual bool Save( cFileSaver& saver ) = 0; #endif /// µ¿±âÈ­ virtual void SyncHeight() = 0; virtual void SyncAlpha() = 0; virtual void SyncPaintAlpha() = 0; virtual void SyncColor() = 0; /// Äøµ virtual void Cull() = 0; virtual void AddToVisibleArray() = 0; /// Ãæµ¹ °Ë»ç virtual bool CollideRay() = 0; /// ±¸¿Í Ãæµ¹ÇÏ´Â ³ëµåµéÀ» ¼öÁý /// ¹Ù¿îµù ¹Ú½º·Î °Ë»çÇÑ´Ù. virtual bool CollideSphere() = 0; /// °æ°è »óÀÚ const cBox& GetBoundBox() const; /// ÁßÁ¡ const NiPoint3& GetCenter(); protected: /// °æ°è »óÀÚ¸¦ °»½Å virtual void UpdateBoundUpward() = 0; public: /// ºÎ¸ð cTerrainBranchNode* mParent; /// °æ°è cBox mBoundBox; NiPoint3 mCenter; float mRadius; protected: /// Äøµ¿ë static NiFrustumPlanes* mFrustum; static tArray* mVisibleArray; /// Ãæµ¹ °Ë»ç¿ë static const cRay* mRay; static float* mDistance; static NiPoint3* mContact; static const cSphere* mSphere; static tArray* mPickedArray; }; inline const cBox& cTerrainNode::GetBoundBox() const { return mBoundBox; } inline const NiPoint3& cTerrainNode::GetCenter() { return mCenter; } /// ÁöÇü °¡Áö ³ëµå class cTerrainBranchNode : public cTerrainNode { friend class cTerrainLeafNode; public: cTerrainBranchNode( cTerrainBranchNode* parent, unsigned int xi, unsigned int yi, unsigned int cellCount ); ~cTerrainBranchNode(); /// ·Îµù bool Load( cFileLoader& loader ); #ifdef MAP_EDITOR /// ÀúÀå bool Save( cFileSaver& saver ); #endif /// µ¿±âÈ­ void SyncHeight(); void SyncAlpha(); void SyncPaintAlpha(); void SyncColor(); /// Äøµ void Cull(); void AddToVisibleArray(); /// Ãæµ¹ °Ë»ç bool CollideRay(); bool CollideSphere(); protected: /// °æ°è »óÀÚ¸¦ °»½Å void UpdateBoundUpward(); public: /// ÀÚ½Ä ¹è¿­ cTerrainNode* mChild[4]; }; /// ÁöÇü ¸®ÇÁ ³ëµå class cTerrainLeafNode : public cTerrainNode { friend class cTerrain; friend class cTerrainBranchNode; friend class cTerrainNodeCompareForRendering; friend class cLightSceneNode; #ifdef MAP_EDITOR friend class cTerrainNodeBuilding; friend class cTerrainNodePainting; friend class cTerrainNodeDetailing; #endif public: cTerrainLeafNode( cTerrainBranchNode* parent, unsigned int xi, unsigned int yi, unsigned int cellCount ); ~cTerrainLeafNode(); /// Áö¿ò void Clear(); /// ·Îµù bool Load( cFileLoader& loader ); #ifdef MAP_EDITOR /// ÀúÀå bool Save( cFileSaver& saver ); #endif /// µ¿±âÈ­ void SyncHeight(); void SyncAlpha(); void SyncPaintAlpha(); void SyncColor(); /// Äøµ void Cull(); /// °¡½Ã ¿©ºÎ void SetVisible( bool visible ); /// °¡½Ã ¹è¿­¿¡ Ãß°¡ void AddToVisibleArray(); /// Ãæµ¹ °Ë»ç bool CollideRay(); bool CollideSphere(); /// Á¶¸í void SetLight( cLightSceneNode* light, unsigned int indexByLight ); const cLightSceneNode* GetLight() const; #ifdef MAP_EDITOR /// ¿Ã¸² bool Raise( const NiPoint3& pos, float innerRadius, float outerRadius, float maxValue ); /// ³·Ãã bool Lower( const NiPoint3& pos, float innerRadius, float outerRadius, float maxValue ); /// ÆòÆòÇÏ°Ô ¸¸µê bool Flatten( const NiPoint3& pos, float innerRadius, float outerRadius, float maxValue ); /// ºÎµå·´°Ô ¸¸µê /// ratio´Â [0.1, 1] ¹üÀ§ÀÇ °ªÀ» °¡Á®¾ß ÇÑ´Ù. bool Smooth( const NiPoint3& pos, float outerRadius, float ratio ); #endif /// MAP_EDITOR /// ³×ºñ¸Þ½Ã¿¡ ¸ÂÃã bool SyncToNaviMesh( const NiPoint3& pos, float innerRadius, float outerRadius ); /// ÇÈÅ· ³ôÀÌ¿¡ ¸ÂÃã bool SyncToPickHeight( const NiPoint3& pos, float innerRadius, float outerRadius, float z ); #ifdef MAP_EDITOR /// µðÅ×ÀÏ bool PaintAlpha( const NiPoint3& pos, float innerRadius, float outerRadius, const NiPoint3& alpha ); bool BlurAlpha( const NiPoint3& pos, float outerRadius, float ratio ); bool SharpenAlpha( const NiPoint3& pos, float outerRadius, float ratio ); /// »öÄ¥ bool Color( const NiPoint3& pos, float innerRadius, float outerRadius, const NiColor& color ); bool Brush( const NiPoint3& pos, float innerRadius, float outerRadius, const NiColor& color, float opacity ); bool Lighter( const NiPoint3& pos, float innerRadius, float outerRadius ); bool Darker( const NiPoint3& pos, float innerRadius, float outerRadius ); bool BlurColor( const NiPoint3& pos, float outerRadius, float ratio ); #endif /// MAP_EDITOR /// ÅØ½ºÃ³ unsigned int GetTextureIndex0() const; unsigned int GetTextureIndex1() const; unsigned int GetTextureIndex2() const; unsigned int GetTextureValue0() const; unsigned int GetTextureValue1() const; LPDIRECT3DTEXTURE9 GetD3DTexture0() const; LPDIRECT3DTEXTURE9 GetD3DTexture1() const; LPDIRECT3DTEXTURE9 GetD3DTexture2() const; private: /// °æ°è »óÀÚ¸¦ °»½Å void UpdateBoundUpward(); /// ±âÇÏ Á¤º¸¸¦ °»½Å void UpdatePosCoords(); void UpdateColors(); void UpdateAlphas(); #ifdef MAP_EDITOR /// ¹é¾÷ /// Undo, Redo¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ ¼öÁýÇÑ´Ù. bool BackupBuilding( cTerrainNodeBuildingInfo* info, const NiPoint3& pos, float outerRadius ); bool BackupPainting( cTerrainNodePaintingInfo* info, const NiPoint3& pos, float outerRadius ); bool BackupDetailing( cTerrainNodeDetailingInfo* info, const NiPoint3& pos, float outerRadius ); /// ÁöÇü°ú µ¿±âÈ­ ¹× °»½Å /// µ¿±âÈ­´Â °è»ê»óÀÇ ¿ÀÂ÷·Î ÀÎÇÑ Å©·¢À» ¹æÁöÇÑ´Ù. void UpdateBuilding( cTerrainNodeBuildingInfo* info, const NiPoint3& pos, float outerRadius ); void UpdatePainting( cTerrainNodePaintingInfo* info, const NiPoint3& pos, float outerRadius ); void UpdateDetailing( cTerrainNodeDetailingInfo* info, const NiPoint3& pos, float outerRadius ); /// Undo, Redo void Undo( const cTerrainNodeBuilding& doing ); void Undo( const cTerrainNodePainting& doing ); void Undo( const cTerrainNodeDetailing& doing ); void Redo( const cTerrainNodeBuilding& doing ); void Redo( const cTerrainNodePainting& doing ); void Redo( const cTerrainNodeDetailing& doing ); #endif /// MAP_EDITOR /// Á¤Á¡ ¹üÀ§¸¦ °è»ê bool CalcRange( unsigned int* xbegin, unsigned int* ybegin, unsigned int* xend, unsigned int* yend, const NiPoint3& pos, float outerRadius ); /// ÅØ½ºÃ³ void SetTextures( cTerrainTexture* tex0, cTerrainTexture* tex1, cTerrainTexture* tex2 ); void SetTexture0( cTerrainTexture* tex ); void SetTexture1( cTerrainTexture* tex ); void SetTexture2( cTerrainTexture* tex ); 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; /// ³ôÀÌ ¹è¿­ float* mHeights; /// ¾ËÆÄ ¹è¿­ NiPoint3* mAlphas; NiPoint3* mPaintAlphas; /// »ö»ó ¹è¿­ NiColor* mColors; /// 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 void cTerrainLeafNode::SetVisible( bool visible ) { mVisible = visible; } inline const cLightSceneNode* cTerrainLeafNode::GetLight() const { return mLight; } inline unsigned int cTerrainLeafNode::GetTextureIndex0() const { if( mTexture0 == 0 ) { assert( 0 ); return 0; } return mTexture0->mIndexByTerrain; } inline unsigned int cTerrainLeafNode::GetTextureIndex1() const { if( mTexture1 == 0 ) { assert( 0 ); return 0; } return mTexture1->mIndexByTerrain; } inline unsigned int cTerrainLeafNode::GetTextureIndex2() const { if( mTexture2 == 0 ) { assert( 0 ); return 0; } return mTexture2->mIndexByTerrain; } inline unsigned int cTerrainLeafNode::GetTextureValue0() const { return mTextureValue0; } inline unsigned int cTerrainLeafNode::GetTextureValue1() const { return mTextureValue1; } inline LPDIRECT3DTEXTURE9 cTerrainLeafNode::GetD3DTexture0() const { return mTexture0 ? mTexture0->mTexture : 0; } inline LPDIRECT3DTEXTURE9 cTerrainLeafNode::GetD3DTexture1() const { return mTexture1 ? mTexture1->mTexture : 0; } inline LPDIRECT3DTEXTURE9 cTerrainLeafNode::GetD3DTexture2() const { return mTexture2 ? mTexture2->mTexture : 0; } /// ÁöÇü ³ëµå ºñ±³ ÇÔ¼öÀÚ class cTerrainNodeCompareForRendering { public: bool operator () ( const cTerrainLeafNode* left, const cTerrainLeafNode* right ) const { cTerrainBuffer* lbuff = left->mBuffer; cTerrainBuffer* rbuff = right->mBuffer; if( lbuff == rbuff ) { unsigned int ltex = left->mTextureValue0; unsigned int rtex = right->mTextureValue0; if( ltex == rtex ) { ltex = left->mTextureValue1; rtex = right->mTextureValue1; if( ltex == rtex ) return left->mLod < right->mLod; return ltex < rtex; } return ltex < rtex; } return lbuff < rbuff; }; };