/* Copyright (c) 2002-2012 Croteam Ltd. 
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License as published by
the Free Software Foundation


This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */

#if !defined(AFX_TERRAININTERFACE_H__539D0786_D5B8_4079_A285_DA2C86EC7543__INCLUDED_)
#define AFX_TERRAININTERFACE_H__539D0786_D5B8_4079_A285_DA2C86EC7543__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TerrainInterface.h : header file
//

#define TEM_HEIGHTMAP 0
#define TEM_LAYER     1

#define CT_EDIT_MODES 2


#define TBM_PAINT           0
#define TBM_SMOOTH          1
#define TBM_FILTER          2
#define TBM_MINIMUM         3
#define TBM_MAXIMUM         4
#define TBM_FLATTEN         5
#define TBM_POSTERIZE       6
#define TBM_RND_NOISE       7
#define TBM_CONTINOUS_NOISE 8
#define TBM_ERASE           9

#define CT_BRUSH_MODES  10

struct CTerrainEditBrush {
  FLOAT teb_fHotSpot;
  FLOAT teb_fFallOff;
};

extern CTFileName GetBrushTextureName(INDEX iBrush);
extern CTerrainEditBrush atebDefaultEditBrushValues[];
extern CTerrainEditBrush atebCustomEditBrushes[];
extern void InvokeTerrainTilePalette( PIX pixX, PIX pixY);
extern void InvokeTerrainBrushPalette( PIX pixX, PIX pixY);
extern void RenderBrushShape( INDEX iBrush, PIXaabbox2D rect, CDrawPort *pdp);
extern void GetEditingModeInfo(INDEX iMode, INDEX &iIcon, CTString &strText);
extern CBrushPaletteWnd *_pBrushPalette;
extern void GenerateTerrainBrushTexture( INDEX iBrush, FLOAT fHotSpot, FLOAT fFallOff);
extern void GenerateNonExistingTerrainEditBrushes(void);
extern void ApplyImportExport(INDEX iSelectedItem);
extern void DisplayHeightMapWindow(CPoint pt);
void GetBrushModeInfo(INDEX iMode, INDEX &iIcon, CTString &strText);
#define CT_BRUSHES 32
#define BRUSH_PALETTE_WIDTH (128-1)
#define BRUSH_PALETTE_HEIGHT (256-1)
#define TILE_PALETTE_WIDTH (256-1)
#define TILE_PALETTE_HEIGHT (256-1)

/////////////////////////////////////////////////////////////////////////////
// CTerrainInterface window

struct CTIButton {
  FLOAT tib_fx;
  FLOAT tib_fy;
  FLOAT tib_fdx;
  FLOAT tib_fdy;
  INDEX tib_iIcon;
  COLOR tib_colBorderColor;
  COLOR tib_colFill;
  FLOAT tib_fDataMin;
  FLOAT tib_fDataMax;
  FLOAT tib_fDataDelta;
  BOOL tib_bWrapData;
  BOOL tib_bMouseTrapForMove;
  BOOL tib_bContinueTesting;
  FLOAT *tib_pfData1;
  FLOAT *tib_pfData2;
  INDEX tib_iLayer;
  CTString tib_strToolTip;
  void (*tib_pOnRender)(CTIButton *ptib, CDrawPort *pdp);
  void (*tib_pOnLeftClick)(CTIButton *ptib, CPoint pt, CDrawPort *pdp);
  void (*tib_pOnLeftClickMove)(CTIButton *ptib, FLOAT fdx, FLOAT fdy, CDrawPort *pdp);
  void (*tib_pOnRightClick)(CTIButton *ptib, CPoint pt, CDrawPort *pdp);
  void (*tib_pOnRightClickMove)(CTIButton *ptib, FLOAT fdx, FLOAT fdy, CDrawPort *pdp);
  void (*tib_pPreRender)(CTIButton *ptib, CDrawPort *pdp); 
  // misc functions
  void (*tib_pOnDropFiles)(CTIButton *ptib, CPoint pt, CDrawPort *pdp, CTFileName fnFile);
  CTString (*tib_pGetClickMoveData)(CTIButton *ptib, CPoint pt, CDrawPort *pdp, BOOL bLmb);
  BOOL (*tib_pIsEnabled)(CTIButton *ptib);

  // construction
  CTIButton();

  void SetData( FLOAT fDataMin, FLOAT fDataMax, FLOAT fDataDelta, 
    BOOL bWrap=FALSE, FLOAT *pfData1=NULL, FLOAT *pfData2=NULL);
  void SetFunctions(
    void (*pOnRender)(CTIButton *ptib, CDrawPort *pdp)=NULL,
    void (*pOnLeftClick)(CTIButton *ptib, CPoint pt, CDrawPort *pdp)=NULL,
    void (*pOnLeftClickMove)(CTIButton *ptib, FLOAT fdx, FLOAT fdy, CDrawPort *pdp)=NULL,
    void (*pOnRightClick)(CTIButton *ptib, CPoint pt, CDrawPort *pdp)=NULL,
    void (*pOnRighClickMove)(CTIButton *ptib, FLOAT fdx, FLOAT fdy, CDrawPort *pdp)=NULL,
    void (*pPreRender)(CTIButton *ptib, CDrawPort *pdp)=NULL);
};


class CTerrainInterface : public CWnd 
{ 
// Construction
public:
	CTerrainInterface();
  void InitializeInterface(CDrawPort *pdp);

  CDrawPort *m_pDrawPort;
  CViewPort *m_pViewPort;
  COleDataSource m_DataSource;

  INDEX m_iBrush;
  INDEX m_iOpacity;
  INDEX m_iEditMode;

  CPoint m_ptMouse;

  CPoint m_ptMouseDown;
  CPoint m_ptMouseDownScreen;
  CPoint m_ptMouseCenter;
  CPoint m_ptMouseCenterScreen;

  CUpdateableRT m_udTerrainPage;
  CUpdateableRT m_udTerrainPageCanvas;
// Attributes
public:

// Operations
public:
  void OnIdle(void);
  int OnToolHitTest( CPoint point, TOOLINFO* pTI ) const;
  void HideCursor(void);
  void UnhideCursor(void);

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CTerrainInterface)
	public:
	virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
	virtual BOOL PreTranslateMessage(MSG* pMsg);
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CTerrainInterface();
  void RenderInterface(CDrawPort *pDP);
  BOOL IsClicked(CTIButton &tib, CPoint pt) const;

	// Generated message map functions
protected:
	//{{AFX_MSG(CTerrainInterface)
	afx_msg void OnPaint();
	afx_msg void OnDestroy();
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
	afx_msg void OnDropFiles(HDROP hDropInfo);
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

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

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TERRAININTERFACE_H__539D0786_D5B8_4079_A285_DA2C86EC7543__INCLUDED_)