Files
2026-06-01 12:46:52 +02:00

134 lines
4.8 KiB
C++

#pragma once
#include "TerrainDefine.h"
#include "TerrainFaceNormalInfo.h"
#include <kfile/KStream.h>
#include <kfile/KFileManager.h>
#include <list>
/** 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<WORD>& 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 );
};