#pragma once #include "TerrainDefine.h" #include "TerrainFaceNormalInfo.h" #include #include #include /** vertex coverage factor를 구하기 위해 인접 타일을 알아야 하므로 상하좌우로 1씩의 여분이 더 있어야 한다. 또한 face normal vector를 구하기 위해 우측과 하단엔 1개의 여분이 추가로 더 필요하다. */ const int c_nTileExtendUpper = 1; const int c_nTileExtendLower = 2; /// 디폴트 라이트 const K3DLight c_defaultStaticLight = K3DLight ( K3DColor( 1.f, 1.f, 1.f ) , K3DColor( 1.f, 1.f, 1.f ) , K3DColor( 0.38f, 0.38f, 0.38f ) , K3DVector( 0.333333f, 0.666666f, -0.666666f ) ); class CTerrainInfoForSegment : public CTerrainInfo { public: struct INITSTRUCT { std::string strMapFileName; ///< 문자열이 비어있다면 ( 영역 밖의 세그먼트를 의미 ) 해당 세그먼트는 0으로 초기화 된다. int nSegmentIndexInMap; }; struct PROPLOAD_INFO { NFM_PROPSTRUCT_V15* pPropLoadStructs; int nPropLoadCount; PROPLOAD_INFO() : pPropLoadStructs( NULL ), nPropLoadCount( 0 ) { } ~PROPLOAD_INFO() { SAFE_DELETE_ARRAY(pPropLoadStructs); } }; struct SPEEDGRASSLOAD_INFO { struct SpeedGrassGroup { int nSpeedGrassID; int nSpeedGrassLoadCount; NFM_SPEED_GRASS_V1* pSpeedGrassLoadStructs; SpeedGrassGroup() : nSpeedGrassID( 0 ), nSpeedGrassLoadCount( 0 ), pSpeedGrassLoadStructs(NULL) {} ~SpeedGrassGroup() { SAFE_DELETE_ARRAY( pSpeedGrassLoadStructs ); } }; int nSpeedGrassGroupCount; SpeedGrassGroup* pSpeedGrassGroup; SPEEDGRASSLOAD_INFO() : nSpeedGrassGroupCount( 0 ), pSpeedGrassGroup( NULL ) {} ~SPEEDGRASSLOAD_INFO() { clear(); } void clear() { SAFE_DELETE_ARRAY( pSpeedGrassGroup ); } }; /// pInitStruct는 9개가 연속해서 있어야 한다. CTerrainInfoForSegment( const K3DPoint& rOrigin, const INITSTRUCT* pInitStruct, int nTileCount, float fTileLength, PROPLOAD_INFO& rPropLoadInfo, SPEEDGRASSLOAD_INFO& rSpeedGrassLoadInfo ); virtual ~CTerrainInfoForSegment(); const K3DPoint& GetOrigin() const { return m_ptOrigin; } const TERRAINMAP_PROPERTIES::COLORING& GetMapColoring() const { return m_MapProperties.Coloring; } const K3DLight& GetTerrainLight() const { return m_litTerrain; } void SetTerrainLight( const K3DLight& rLight ) { m_litTerrain = rLight; } /// 지형 primitive 생성 필요 여부 ( 지형 표시를 끈 맵 또는 맵이 없는 부분은 생성할 필요가 없다. ) bool NeedPrimitive() const { return m_MapProperties.bShowTerrainInGame; } /// 세그먼트에 사용되고 있는 타일들의 종류를 모두 얻는다. void GetUsingTileList( std::list& rGetList ) const; float GetCenterX() const { return m_ptOrigin.x + 0.5f * GetSegmentLength(); } float GetCenterY() const { return m_ptOrigin.y + 0.5f * GetSegmentLength(); } float GetSegmentLength() const { return m_fTileLength * float( m_nTileCount ); } // CTerrainInfo의 가상함수 오버로딩 public: WORD GetTile( int nX, int nY ) const; WORD GetFillBit( int nStage, int nX, int nY ) const; float GetHeight( int nX, int nY ) const; unsigned __int64 GetAttrData( int nX, int nY ) const; KTripleColor GetColor( int nX, int nY ) const; K3DVertex GetVertex( int nX, int nY ) const; K3DVector GetVertexNormalVector( int nX, int nY ) const; BYTE GetVertexCoverageFactor( int nStage, int nX, int nY ) const; bool GetAttribute( int nAttrX, int nAttrY ) const; WORD GetGameTile( float x, float y ) const; ///< 월드좌표 float GetZ( float x, float y ) const; ///< 월드좌표 KTripleColor GetColorByWorldCoordinate( float x, float y ) const; ///< 월드좌표 void GetTriangle( float x, float y, K3DVector& v1, K3DVector& v2, K3DVector& v3 ) const; private: K3DPoint m_ptOrigin; int m_nTileCount; int m_nVertexCount; float m_fTileLength; NFM_SEGMENTHEADER_V11 m_SegmentHeader; int m_nExtendedTileCount; NFM_VERTEXSTRUCT_V11* m_pExtendedVertexStruct; NFM_VERTEXSTRUCT_V11 m_DefaultData; TERRAINMAP_PROPERTIES m_MapProperties; ///< map properties K3DLight m_litTerrain; ///< 지형용 라이트. 지형 primitive는 라이트 처리가 불가능 하므로 버텍스 칼라에서 직접 이것으로 계산해준다. K3DVector* m_pVertexNormal; ///< vertex normal vector const NFM_VERTEXSTRUCT_V11* GetVertexStruct( int nX, int nY ) const; void LoadMapFiles( const INITSTRUCT* pInitStruct, PROPLOAD_INFO& rPropLoadInfo, SPEEDGRASSLOAD_INFO& rSpeedGrassLoadInfo ); bool LoadPropertiesAndProps( const INITSTRUCT* pInitStruct, PROPLOAD_INFO& rPropLoadInfo, SPEEDGRASSLOAD_INFO& rSpeedGrassLoadInfo ); void LoadSegment( KStream* pStream, int nLoadPosX, int nLoadPosY, int nSavePosX, int nSavePosY, int nWidth, int nHeight, bool bHeaderLoad ); };