/* ========================================================================== * ÀÛ ¼º ÀÚ : À̼ø±Ô * ÀÛ ¼º ÀÏ : 2007.01.03 * ³» ¿ë : ³×ºñÇʵå * ÁÖÀÇ»çÇ× : *===========================================================================*/ #pragma once /// ³×ºñÇÊµå »ó¼ö 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; /// ³×ºñÇÊµå ÆÄÀÏ Çì´õ #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 cNaviField { public: cNaviField(); ~cNaviField(); /// Áö¿ò void Clear(); /// ·Îµù bool Load( const cString& pathName ); /// Çʵ尪 void SetValue( unsigned int xi, unsigned int yi, unsigned char value ); unsigned char GetValue( unsigned int xi, unsigned int yi ) const; /// ³ôÀ̰ª bool CalcHeight( float* height, float x, float y ) const; bool GetHeight( float* height, unsigned int xi, unsigned int yi ) const; bool GetHeight( float* height, const NiPoint3& pos ) const; /// ±×¸®µå Å©±â unsigned int GetCellCount() const; /// Á¤Á¡´ç ¹ÌÅÍ float GetMetersPerVertex() const; /// ¹ÌÅÍ´ç ´ÜÀ§ unsigned int GetUnitsPerMeter() const; /// Á¤Á¡´ç ´ÜÀ§ float GetUnitsPerVertex() const; /// ÇÑ º¯ÀÇ ±æÀÌ float GetSegmentLength() const; private: /// ±×¸®µå Å©±â¸¦ °Ë»ç bool CheckCellCount( unsigned int cellCount ); private: /// ±×¸®µå Å©±â unsigned int mCellCount; unsigned int mLineCount; /// Á¤Á¡´ç ¹ÌÅÍ float mMetersPerVertex; /// ¹ÌÅÍ´ç ´ÜÀ§ ( 100 ) unsigned int mUnitsPerMeter; /// Á¤Á¡´ç ´ÜÀ§ float mUnitsPerVertex; /// Çʵ尪 ¹è¿­ unsigned char** mpValues; unsigned char* mValues; /// ³ôÀ̰ª ¹è¿­ float** mpHeights; float* mHeights; /// ÇÑ º¯ÀÇ ±æÀÌ float mSegmentLength; }; inline void cNaviField::SetValue( unsigned int xi, unsigned int yi, unsigned char value ) { assert( mValues ); unsigned int i = yi * mLineCount + xi; mValues[i] = value; } 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::GetSegmentLength() const { return mSegmentLength; }