// Background.h: interface for the CBackground class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_BACKGROUND_H__E55A92E3_96CF_4DAD_A5F6_EFE66E81EAEF__INCLUDED_)
#define AFX_BACKGROUND_H__E55A92E3_96CF_4DAD_A5F6_EFE66E81EAEF__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "AtumNode.h"
#include "EventSetDlg.h"
#include "EventSetDetailDlg.h"
#include "MonsterSetDlg.h"
#include "MonsterSetDetailDlg.h"
#include <list>
#include "ObjectChild.h"

class Terrain;
#include "texture.h"


typedef struct _WORKSPACE
{
	char workspaceName[40];
	int numberOfProject;
} WORKSPACE;

typedef struct _PROJECTINFO
{
	int			m_useTileSetIndex;
	char		m_strProjectName[40];
	char		m_strFieldIP[16];
	short		m_sFieldPort;
	short		m_sFieldPortUDP;
	char		m_strNPCIP[16];
	short		m_sNPCPort;
	short		m_sNPCPortUDP;
	short		m_sXSize;
	short		m_sYSize;
	float		m_fHeightMax;
	float		m_fHeightMin;
	float		m_fWaterHeight;
	float		m_fDiffuseR1;
	float		m_fDiffuseG1;
	float		m_fDiffuseB1;
	float		m_fAmbientR1;
	float		m_fAmbientG1;
	float		m_fAmbientB1;
	float		m_fDiffuseR2;
	float		m_fDiffuseG2;
	float		m_fDiffuseB2;
	float		m_fAmbientR2;
	float		m_fAmbientG2;
	float		m_fAmbientB2;
} PROJECTINFO;

typedef struct _PROJECTINFOOLD
{
	int			m_useTileSetIndex;
	char		m_strProjectName[40];
	char		m_strFieldIP[16];
	short		m_sFieldPort;
	short		m_sFieldPortUDP;
	char		m_strNPCIP[16];
	short		m_sNPCPort;
	short		m_sNPCPortUDP;
	short		m_sXSize;
	short		m_sYSize;
	float		m_fHeightMax;
	float		m_fHeightMin;
	float		m_fWaterHeight;
	float		m_fDiffuseR1;
	float		m_fDiffuseG1;
	float		m_fDiffuseB1;
	float		m_fAmbientR1;
	float		m_fAmbientG1;
	float		m_fAmbientB1;
} PROJECTINFOOLD;

typedef struct _EVENT_DATA
{
	D3DXVECTOR3 m_vPosition;
	int			m_bMove;
	BYTE		m_bPKType;
	BOOL		m_bEnableLand;
	BYTE		m_bEnvetType;
	short		m_EventwParam1;
	short		m_EventwParam2;
	short		m_EventwParam3;
	char		m_EventstrParam[40];
	DWORD		m_dwWaterType;			// Water 타입(0:물아님, 1:서버/클라이언트, 2:서버, 3:클라이언트)
} EVENTINFO;

typedef struct _MONSTER_DATA
{
	char		strRegionName[40];
	UINT		nMonType;
	short		sStartx;
	short		sStartz;
	short		sEndx;
	short		sEndz;
	short		sMaxMon;
	short		sResNum;
	short		sResTime;
} MONSTERINFO;

typedef struct _MONSTER_DATA2
{
	char		strRegionName[40];
	UINT		nMonType;
	short		sStartx;
	short		sStartz;
	short		sEndx;
	short		sEndz;
	short		sMaxMon;
	short		sResNum;
	short		sResTime;
	BYTE		bMonType;		// 0:보스 1:대형 2:중형 3:소형
} MONSTERINFO2;

typedef struct _MONSTER_DATA3
{
	char		strRegionName[40];
	UINT		nMonType;
	short		sStartx;
	short		sStartz;
	short		sStarty;
	short		sEndx;
	short		sEndz;
	short		sEndy;
	short		sMaxMon;
	short		sResNum;
	UINT		nResTime;
	BYTE		bMonType;		
} MONSTERINFO3;					// startY, endY 추가, nResTime --> UINT로 형변환

typedef struct _VERTEXINFO
{
    D3DXVECTOR3 pos;
	D3DXVECTOR3 nor;
} VERTEXINFO;

typedef struct _LINEVERTEX
{
    D3DXVECTOR3 pos; 
    DWORD       color;
} LINEVERTEX;


typedef struct _TILEINFO // tile type
{
	INT texTileDirect1;			// 1 방향에 사용된 텍스트 타입
	INT texTileDirect2;			// 2 방향에 사용된 텍스트 타입
	INT texTileDirect3;			// 3 방향에 사용된 텍스트 타입
	INT texTileDirect4;			// 4 방향에 사용된 텍스트 타입

	INT		useTexNumber;		// 사용텍스쳐의 인덱스
	DWORD	waterType;			// Water 사용
	INT		waterHeight;		// Water 높이
	SHORT	waterTexNumber;		// Water Texture
	BOOL	bBaseTile;			// Base 타일 인지
	INT		useBaseTexNumber;	// 사용된 Base 텍스쳐의 인덱스
	INT		ranTexNumber;		// 사용된 Base 텍스쳐의 랜덤 인덱스

} TILEINFO;


typedef struct _TEXFILEINFO
{
//	UINT tileType;				// 타일 타입
	char name[20];				// 타일 이름
	INT texTileDirect1;			// 1 방향에 사용된 텍스트 타입
	INT texTileDirect2;			// 2 방향에 사용된 텍스트 타입
	INT texTileDirect3;			// 3 방향에 사용된 텍스트 타입
	INT texTileDirect4;			// 4 방향에 사용된 텍스트 타입
	BOOL	bBaseTile;			// Base 타일 인지
	INT		useBaseTexNumber;	// 사용된 Base 텍스쳐의 인덱스
	INT		ranTexNumber;		// 사용된 Base 텍스쳐의 랜덤 인덱스
} TEXFILEINFO;

/////////////////////////////////////////////////

/////////////////////////////////////////////////
// 타일 종류
/*
typedef struct _OBJECTINFO
{
	DWORD		m_dwObjType;			// Object 타입
	BOOL		bRenderType;			// 렌더링 타입
	BOOL		bCheckTick;				// 맵고정 높이체크
	D3DXVECTOR3 m_vPos;
	D3DXVECTOR3 m_vVel;
	D3DXVECTOR3 m_vUp;
}OBJECTINFO;
*/

typedef struct _MAP_DATA
{
	FLOAT			m_fTileSize;
	int				m_nVertexNumber;
	int				m_nTileInfoNumber;
	int				m_nObjectNumber;
}MapInfo;

typedef struct _SPRITEVERTEX
{
    D3DXVECTOR3 p;
    D3DXVECTOR3 n;
    FLOAT       tu, tv;
} SPRITEVERTEX;

typedef struct _NOSPRITE
{
    D3DXVECTOR3 p;
    DWORD       color;
} NOSPRITE;

typedef struct _BLOCKDATA
{
	FLOAT		fBlockHeight;
	FLOAT		fGroundHeight;
	INT			nUseBlockCount;
} BLOCKDATA;
/////////////////////////////////////////////////
typedef struct _TILEINFOCLIENT // tile type
{
	INT			useTexNumber;		// 사용텍스쳐의 인덱스
	DWORD		waterType;			// Water 사용
	INT			waterHeight;		// Water 높이
	SHORT		waterTexNumber;		// Water Texture
	BYTE		bMove;				// Move Type
	BOOL		bEnableLand;
	BYTE		bEnvetType;
} TILEINFOCLIENT;

typedef struct _OBJECTINFOCLIENT
{
	DWORD		dwObjType;			// Object 타입
	INT			nCount;
	D3DXVECTOR3 vPos;
	D3DXVECTOR3 vVel;
	D3DXVECTOR3 vUp;
//	FLOAT		fObjectScale;
	DWORD		dwMonsterUniqueNumber;
	BYTE		bObjectTexIndex;
	UINT		nObjectSrcIndex;
	BYTE		bBodyCondition;
	BOOL		bIsEvent;
	BYTE		bEventType;
	short		sEventIndexFrom;
	short		sEventIndexTo;
	short		sEventIndex3;
	char		strEventParam[40];
} OBJECTINFOCLIENT;

typedef struct _MAP_DATA_SERVER
{
	int				m_nVertexNumber;
	int				m_nObjectNumber;
}MapInfoServer;

typedef struct _OBJECTINFOSERVER
{
	DWORD		dwObjType;			// Object 타입
	D3DXVECTOR3 vPos;
	D3DXVECTOR3 vUp;
	BOOL		bIsEvent;
	BYTE		bEventType;
	short		sEventIndexFrom;
	short		sEventIndexTo;
	short		sEventIndex3;
	char		strEventParam[40];
} OBJECTINFOSERVER;

#define D3DFVF_TILEVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
#define D3DFVF_LINEVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

#define GRID_COLOR_RED 0xFF01210F
#define GRID_COLOR_BLUE 0xFF0000FF
#define GRID_COLOR_BLACK 0xFF000000

inline DWORD FtoDW( FLOAT f ) { return *((DWORD*)&f); }

// 07-05-07 by shkim, 브러쉬용 정점구조체
typedef struct _Line3D
{
	D3DXVECTOR3 Pos;
	D3DCOLOR		Col;

	_Line3D()
	{
		Pos = D3DXVECTOR3(0.0f,0.0f,0.0f);
		Col = 0xffffffff;
	}

} LINE3D;

#define D3DFVF_LINE3D (D3DFVF_XYZ | D3DFVF_DIFFUSE)

const int CELLSPACE = 20; // 07-05-08 by shkim, 마우스 커서의 셀 간격을 정한다
class Terrain;

class CBackground : public CAtumNode  
{
	enum ACTION_TYPE // 07-04-20 by shkim, 타입을 알아 볼수 있게 추가했음
	{
		NONE_ACTION = 0, // 아무일 안함
		HEIGHT_ATCION, // 높낮이
		PLANE_ACTION, // 평지화
		OBJ_SELECT, // 마우스로 오브젝트 찍기
		OBJ_DELETE, // 오브젝트 삭제
		WATER_SETTING, // 물 그리기
		SMOOTH_ACTION = 10, // 다듬기
	};
	enum SIZE_TYPE // 07-05-13 by shkim, 지형 편집 사이즈
	{
		SIZE_2X2 = 0,
		SIZE_3X3 = 1,
		SIZE_4X4 = 2,
	};
	
public:
	CBackground(short x, short y);
	virtual ~CBackground();
	virtual HRESULT InitDeviceObjects();
	virtual HRESULT RestoreDeviceObjects();
	virtual HRESULT InvalidateDeviceObjects();
	virtual HRESULT DeleteDeviceObjects();
	virtual void Render();//D3DXVECTOR3 vPos,D3DXVECTOR3 vAt);
	virtual void Tick();

	void MouseAction(int action, const D3DXVECTOR3& orig, const D3DXVECTOR3& dir);//,int nTileTextype );
	int	CheckTile1(D3DXVECTOR3 p1,D3DXVECTOR3 p2,D3DXVECTOR3 p3,D3DXVECTOR3 vPickPos); // 아래 삼각형
	int	CheckTile2(D3DXVECTOR3 p1,D3DXVECTOR3 p2,D3DXVECTOR3 p3,D3DXVECTOR3 vPickPos); // 위 삼각형 체크
	void setMultiTex(int x, int z,int cho);
	void InsertTile(CString strFilename);
	void InsertTileBase(CString strFilename);
	int TextureCreate(LPDIRECT3DTEXTURE8 ptex1,LPDIRECT3DTEXTURE8 ptex2,int a);
	
	void ReInitMap(MapInfo * info);
	void LoadTex(int usetex,TEXFILEINFO info);

	void SetVertex( int i, int j );
	void SetVertexFlat( int i, int j );
	void SetVertexSmooth( int i, int j ); // 07-05-15 by shkim, Smooth

	void SetWater(int a, int b);
	void Restore(/*int a, int b, int c*/); // 07-05-13 by shkim, 확인 결과 함수 안에서는 인자값 사용안함
	void SetNormal(int i, int j);
	void SetBaseTile(int num);
	////////////// EventSet //////////////////////
	void EventAction(CEventSetDlg  *pDlg, const D3DXVECTOR3& orig, const D3DXVECTOR3& dir);
	void SetEvent(CEventSetDlg  *pDlg,int i, int j);
	void SetEventInfo(int i, int j);
	////////////// Object Choose /////////////////
//	void ObjectAction(const D3DXVECTOR3& orig, const D3DXVECTOR3& dir);
	void SeekObject();//CPoint point);//D3DXVECTOR3 vPos);
	////////////// MonsterSet //////////////////////
	void MonsterAction(CMonsterSetDlg  *pDlg, const D3DXVECTOR3& orig, const D3DXVECTOR3& dir);
	void SetMonster(CMonsterSetDlg  *pDlg,int i, int j);
	CString UpdateMonsterData(CString str);
	void UpdateMonsterRegion(short minx,short minz,short maxx,short maxz,BOOL bCheck);
	////////////// MiniMap Save //////////////////////
	void SaveMiniMap();
	////////////// 그림파일로 높이 셋팅하기 //////////////////////
//	void SetHeightData(CString str);
	void SetHeightData(CString strPath,int base,int max);
	////////////// 영역으로 타일  셋팅하기 //////////////////////
	void SetTileRegion(int x,int y);
	////////////// 포인트로 타일  셋팅하기 //////////////////////
	void SetTilePoint(int x,int y,int type);

	void InsertObject(CObjectChild * pObject);

	float MinGroundHeight(int i, int j);

	BOOL IntersectTriangle( const D3DXVECTOR3& orig,
       const D3DXVECTOR3& dir, D3DXVECTOR3& v0,
       D3DXVECTOR3& v1, D3DXVECTOR3& v2,
       FLOAT* t, FLOAT* u, FLOAT* v );
	BOOL SetAllTexture(CString str);

	void BrushCheck( BOOL bCheck ); // 07-05-08 by shkim, brush 보이고 안보이고	

	// 07-05-11 by shkim, 픽킹할 영역을 계산한다.
	void CalculatePickPostion( D3DXVECTOR3* pvOrig ,D3DXVECTOR3* pvDir);

	// 07-05-11 by shkim, 픽킹된 가까운값 찾기
	BOOL NearPickCheck(  D3DXVECTOR3 orig, D3DXVECTOR3 dir, 
						 int* nLHTriangle = NULL, // 위 또는 아래 삼각형 체크
						 int* nX = NULL,
						 int* nZ = NULL
						 );

	// 07-05-11 by shkim, 픽킹의 현재 위치를 넘겨준다.
	void PickPos( D3DXVECTOR3* pVpos )
	{
		*pVpos = m_vPickPos;
	}

private:
	// 07-05-07 by shkim, 그려질 brush 크기 와 색깔
	bool DrawPickPos( int Count, float size, D3DCOLOR Col, D3DXVECTOR3 vPos ); 
	void DrawBrush( D3DXVECTOR3 vPos ); // 07-05-07 by shkim, brush 그리기 함수	
	float GetHeight( float fX, float fZ ); // 07-05-08 by shkim, Pick 위치서 젤 가까운 높이를 구함

	// 07-05-17 by shkim, 다듬기에서 사용 되는 체크 함수
	BOOL GetClickCheck( int nX, int nZ );

	// 07-05-17 by shkim, 원래 있던 정점 수정 기능을 함수로 만들었음
	void SetVertexBlock( int i, int j );

private:
	enum	TRIANGLE // 07-05-11 by shkim, 위쪽, 아래쪽 체크
	{		
		LOW_TRIANGLE = 1,
		HIGH_TRIANGLE = 2
	};
	BOOL				m_bPickCheck; // 07-05-07 by shkim, brush 보이기 확인
	D3DXVECTOR3			m_vPickPos; // 07-05-07 by shkim, brush의 위치

protected:
	void Action( int action, int x, int z, D3DXVECTOR3 vOri, D3DXVECTOR3 vTile );//,int tiletype
	void ActionTileSet(int x, int z,int type);
	void ResizeTexture(LPDIRECT3DTEXTURE8 pTexture, char *szFilename,int nSize);

	LPDIRECT3DVERTEXBUFFER8	m_pVBLine;

public:
	LPDIRECT3DTEXTURE8		m_pTileTexture[MAX_BASETILE_NUM][MAX_BASETILERANDOM_NUM];  
	// [0-9]:0번스타일 
	// [10]:1번스타일 [11]:2번스타일 [12]:3번스타일 [13]:4번스타일
	// [14]:5번스타일 [15]:6번스타일 [16]:7번스타일 [17]:8번스타일
	// [18]:9번스타일 [19]:10번스타일 [20]:11번스타일 [21]:12번스타일
	TILEINFO		*		m_pTileInfo; // 렌더링시 참조하는 타일번호, N x M 개 
	VERTEXINFO		*		m_pTileVertexArray;
	VERTEXINFO		*		m_pBlockVertexArray;
	D3DXVECTOR3		*		m_pvTempVecArr; // 07-05-08 by shkim, 임시 지형 위치 값을 담는다.

	BLOCKDATA		*		m_pBlockData;
	TEXFILEINFO		*		m_pTexFileInfo;
	LPDIRECT3DTEXTURE8		m_pCreateTexture[MAX_TEXTILE_NUM];		// Created Texture
	LPDIRECT3DVERTEXBUFFER8	m_pVBFlying;			// Flying VextexBuffer
//	LPDIRECT3DVERTEXBUFFER8	m_pVBRender[32*32];
	LPDIRECT3DVERTEXBUFFER8	m_pVBRender[64*64];

	LPDIRECT3DTEXTURE8		m_pWaterTexture[10];			// Water Texture
	LPDIRECT3DVERTEXBUFFER8	m_pVBWater;
	D3DXMATRIX				m_matWater;
	FLOAT					m_fCheckWaterTexAniTime;
	FLOAT					m_fHeight;


	INT						m_ninsertTileFileCont;
	INT						m_ninsertTileFileBaseCont;
	////////// Event Set ///////////////
	LPDIRECT3DTEXTURE8		m_pEventTexture[MAX_TEXEVENT_NUM];
	EVENTINFO	*			m_pEventInfo;
	BOOL		*			m_bUsingArray;
	CEventSetDetailDlg		m_dlgEvnetSetDetail;
	CMonsterSetDetailDlg	m_dlgMonsterSetDetail;
	short					m_sXSize;
	short					m_sYSize;

	float					m_fTileSize;
	INT						m_nCreateTexNumber;
	INT						m_nTexUseNumber;
	INT						m_nObjectNumber;
	INT						m_nObjectNumberOld;

	PROJECTINFO				m_projectInfo;

	////////// Event Set ///////////////
	list<MONSTERINFO2>		m_listMonsterInfo;
	INT						m_nMonsterNumber;
	BOOL	*				m_bUsingMonsterRegion;

	map<INT,CAtumNode *>	m_mapObjectData;    // int -> 000 000 앞 세자리 x 뒤 세자리 z 인덱스를 가르킴
	LPDIRECT3DTEXTURE8			m_pBackTexture;


	// ROAM
 	Terrain			*			m_pTerrain;
 	char						m_strTerrainMap[MAX_PATH];
	TextureMngr					m_TextureMgr;
 	float			*			m_pHeightMap;
};

#endif // !defined(AFX_BACKGROUND_H__E55A92E3_96CF_4DAD_A5F6_EFE66E81EAEF__INCLUDED_)
