/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2007.01.03 * ³» ¿ë : ³×ºñÇʵå * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once #include "Shader.h" class cRay; class cNaviFieldBranchNode; class cNaviFieldLeafNode; class cNaviFieldPaintDialog; #ifdef MAP_EDITOR class cNaviFieldPaintingInfo; #endif /// ³×ºñÇÊµå »ó¼ö const unsigned int NAVIFIELD_DEFAULT_RESOLUTION = 512; const unsigned int NAVIFIELD_BUFF_CELL_COUNT = 128; const unsigned int NAVIFIELD_BUFF_LINE_COUNT = NAVIFIELD_BUFF_CELL_COUNT + 1; const unsigned int NAVIFIELD_BUFF_VERT_COUNT = NAVIFIELD_BUFF_LINE_COUNT * NAVIFIELD_BUFF_LINE_COUNT; const unsigned int NAVIFIELD_LEAF_CELL_COUNT = 8; const unsigned int NAVIFIELD_LEAF_LINE_COUNT = NAVIFIELD_LEAF_CELL_COUNT + 1; const unsigned int NAVIFIELD_LEAF_LINE_COUNT_X2 = NAVIFIELD_LEAF_LINE_COUNT * 2; const unsigned int NAVIFIELD_LEAF_VERT_COUNT = NAVIFIELD_LEAF_LINE_COUNT * NAVIFIELD_LEAF_LINE_COUNT; /// ³×ºñÇÊµå ·Îµù ¿¡·¯ ÄÚµå const int NAVIFIELD_LOAD_ERROR_OPEN = -1; const int NAVIFIELD_LOAD_ERROR_FILE_HEADER = -2; const int NAVIFIELD_LOAD_ERROR_FILE_TYPE = -3; const int NAVIFIELD_LOAD_ERROR_FILE_VERSION = -4; const int NAVIFIELD_LOAD_ERROR_GRID_SIZE = -5; const int NAVIFIELD_LOAD_ERROR_TEXTURE_NAME = -6; const int NAVIFIELD_LOAD_ERROR_TEXTURE = -7; const int NAVIFIELD_LOAD_ERROR_NODE = -8; /// ³×ºñÇÊµå ÆÄÀÏ Çì´õ #pragma pack( push, 1 ) class cNaviFieldFileHeader { public: /// ½Äº° ÄÚµå char mCode[14]; /// ¹öÀü unsigned int mVersion; /// ±×¸®µå Å©±â (¼¿ ¼ö) unsigned int mCellCount; /// Á¤Á¡´ç ¹ÌÅÍ ¼ö float mMetersPerVertex; /// ¹ÌÅÍ´ç ´ÜÀ§ ¼ö ( 100 ) unsigned int mUnitsPerMeter; }; #pragma pack( pop ) /// ³×ºñÇÊµå ¹öÆÛ class cNaviFieldBuffer { friend class cNaviField; friend class cNaviFieldLeafNode; public: cNaviFieldBuffer(); ~cNaviFieldBuffer(); bool Init( cNaviField* naviField, unsigned int xi, unsigned int yi ); protected: void UpdatePosCoord( cNaviField* naviField, unsigned int xstart, unsigned ystart, unsigned int count ); void UpdateColor( cNaviField* naviField, unsigned int xstart, unsigned ystart, unsigned int count ); private: unsigned int mXIndex; unsigned int mYIndex; /// DX9 LPDIRECT3DVERTEXBUFFER9 mPosCoordBuffer; LPDIRECT3DVERTEXBUFFER9 mColorBuffer; }; /// ³×ºñÇʵå class cNaviField { static cNaviField* mSingleton; friend class cNaviFieldLeafNode; friend class cNaviFieldBuffer; friend class cNaviFieldPainting; public: cNaviField(); ~cNaviField(); /// Áö¿ò void Clear(); /// ÃʱâÈ­ void Init( unsigned int cellCount, float metersPerVertex = 1.0f, unsigned int unitsPerMeter = 100 ); /// ·Îµù int Load( const cString& pathName ); /// ÀúÀå bool Save( const cString& pathName ); /// ó¸® void Process(); /// ·»´õ¸µ void Render(); /// ¹öÆÛ cNaviFieldBuffer* GetBuffer( unsigned int xi, unsigned int yi ); /// ÇÈÅ· bool Pick( NiPoint3* pos, int mouseX, int mouseY ); bool Pick( NiPoint3* pos, const cRay& ray ); /// ³×ºñ¸Þ½Ã¿¡ ¸ÂÃã void SyncAllToNaviMesh(); /// Àû¿ë ¹üÀ§ °è»ê bool CalcRange( unsigned int* xbegin, unsigned int* ybegin, unsigned int* xend, unsigned int* yend, const NiPoint3& pos, float radius ); #ifdef MAP_EDITOR /// »öÄ¥ bool Color( const NiPoint3& pos, float radius, float red, float green, float blue, unsigned char value ); #endif /// ±×¸®µå Å©±â unsigned int GetCellCount() const; /// Á¤Á¡´ç ¹ÌÅÍ float GetMetersPerVertex() const; /// ¹ÌÅÍ´ç ´ÜÀ§ unsigned int GetUnitsPerMeter() const; /// Á¤Á¡ »çÀÌÀÇ ´ÜÀ§ float GetUnitsPerVertex() const; /// Çʵ尪 unsigned char GetValue( unsigned int xi, unsigned int yi ) const; bool GetValue( unsigned char* value, unsigned int xi, unsigned int yi ) const; bool GetValue( unsigned char* value, const NiPoint3& pos ) const; /// ³ôÀ̰ª bool GetHeight( float* height, unsigned int xi, unsigned int yi ) const; bool GetHeight( float* height, const NiPoint3& pos ) const; /// »ö»ó°ª bool GetColor( NiColor* color, const NiPoint3& pos ) const; /// ±×¸®µå Å©±â unsigned int GetLeafGridSize() const; /// º¯°æ ¿©ºÎ bool IsModified() const; private: #ifdef MAP_EDITOR /// ¹é¾÷ /// Undo, Redo¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ ¼öÁýÇÑ´Ù. bool BackupPainting( cNaviFieldPaintingInfo* info, unsigned int xbegin, unsigned int ybegin, unsigned int xend, unsigned int yend, const NiPoint3& pos, float radius ); /// °»½Å void UpdatePainting( cNaviFieldPaintingInfo* info, unsigned int xbegin, unsigned int ybegin, unsigned int xend, unsigned int yend, const NiPoint3& pos, float radius ); #endif /// ±×¸®µå Å©±â¸¦ °Ë»ç bool CheckCellCount( unsigned int cellCount ); /// ÇØ´ç À§Ä¡¿¡ ¸®ÇÁ ³ëµå¸¦ ¼³Á¤ void SetLeafNode( unsigned int xi, unsigned int yi, cNaviFieldLeafNode* node ); /// Çʵ尪 void SetValue( unsigned int xi, unsigned int yi, unsigned char value ); /// ³ôÀ̰ª float GetHeightFast( unsigned int xi, unsigned int yi ) const; /// »ö»ó°ª void SetColor( unsigned int xi, unsigned int yi, const NiColor& color ); const NiColor& GetColorFast( unsigned int xi, unsigned int yi ) const; /// À妽º°¡ ¹üÀ§¸¦ ¹þ¾î³­ °æ¿ì false¸¦ ¸®ÅÏÇÑ´Ù. bool GetColor( NiColor* color, unsigned int xi, unsigned int yi ); public: /// ´ÜÀÏü¸¦ ¸®ÅÏ static cNaviField* GetSingleton(); private: /// ÃʱâÈ­ ¿©ºÎ bool mInited; /// ±×¸®µå Å©±â unsigned int mCellCount; unsigned int mLineCount; /// Á¤Á¡´ç ¹ÌÅÍ ( 1 ) float mMetersPerVertex; /// ¹ÌÅÍ´ç ´ÜÀ§ ( 100 ) unsigned int mUnitsPerMeter; /// Á¤Á¡´ç ´ÜÀ§ float mUnitsPerVertex; /// ¸®ÇÁ ³ëµå´ç ´ÜÀ§ float mUnitsPerLeafNode; /// ·çÆ® ³ëµå cNaviFieldBranchNode* mRootNode; /// ¸®ÇÁ ³ëµå ¹è¿­ typedef tArray cLeafNodeArray; cLeafNodeArray mNodeArray; /// Çʵ尪 ¹è¿­ unsigned char** mpValues; unsigned char* mValues; /// ³ôÀÌ ¹è¿­ float** mpHeights; float* mHeights; /// »ö»ó ¹è¿­ NiColor* mColors; /// °¡½Ã ¹è¿­ cLeafNodeArray mVisibleArray; /// ¼ÎÀÌ´õ cTerrainShader mShader; /// ¹öÆÛ cNaviFieldBuffer** mBuffer; /// DX9 LPDIRECT3DVERTEXDECLARATION9 mVertexDeclaration; LPDIRECT3DINDEXBUFFER9 mIndexBuffer; /// º¯°æ ¿©ºÎ bool mModified; }; inline cNaviFieldBuffer* cNaviField::GetBuffer( unsigned int xi, unsigned int yi ) { return &(mBuffer[yi / NAVIFIELD_BUFF_CELL_COUNT][xi / NAVIFIELD_BUFF_CELL_COUNT]); } inline unsigned int cNaviField::GetCellCount() const { return mCellCount; } inline float cNaviField::GetMetersPerVertex() const { return mMetersPerVertex; } inline unsigned int cNaviField::GetUnitsPerMeter() const { return mUnitsPerMeter; } inline float cNaviField::GetUnitsPerVertex() const { return mUnitsPerVertex; } inline float cNaviField::GetHeightFast( unsigned int xi, unsigned int yi ) const { return mHeights[yi * mLineCount + xi]; } inline const NiColor& cNaviField::GetColorFast( unsigned int xi, unsigned int yi ) const { return mColors[yi * mLineCount + xi]; } inline bool cNaviField::IsModified() const { return mModified; } inline cNaviField* cNaviField::GetSingleton() { return mSingleton; } #define NAVIFIELD cNaviField::GetSingleton()