summaryrefslogblamecommitdiffstats
path: root/Tools/BiomeVisualiser/BiomeViewWnd.cpp
blob: 503b94f0c582fc2d6bd57a9135a8e3238bcf608a (plain) (tree)













































                                                                                                                                                   
                                                         














































































































































                                                                                                             

// BiomeViewWnd.cpp

// Implements the cBiomeViewWnd class representing the window that displays biomes

#include "Globals.h"
#include "BiomeViewWnd.h"
#include "BiomeCache.h"
#include "GeneratorBiomeSource.h"
#include "../iniFile/iniFile.h"





const int TIMER_RERENDER = 1200;





cBiomeViewWnd::cBiomeViewWnd(void) :
	m_Wnd(NULL),
	m_Thunk(&cBiomeViewWnd::WndProc, this),
	m_IsLButtonDown(false)
{
}





bool cBiomeViewWnd::Create(HWND a_ParentWnd, LPCTSTR a_Title)
{
	ASSERT(m_Wnd == NULL);
	
	// Create a regular STATIC window, then override its window procedure with our own. No need for obnoxious RegisterWindowClass() stuff.
	m_Wnd = CreateWindow("STATIC", a_Title, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0, 0, 400, 300, a_ParentWnd, NULL, GetModuleHandle(NULL), NULL);
	if (m_Wnd == NULL)
	{
		LOGERROR("Cannot create main window: %d", GetLastError());
		return false;
	}
	SetWindowLongPtr(m_Wnd, GWLP_WNDPROC, m_Thunk);
	
	cIniFile IniFile;
	cBiomeGen * BioGen = new cBioGenMultiStepMap(2);
	BioGen->Initialize(IniFile);
	m_Renderer.SetSource(new cGeneratorBiomeSource(BioGen));
	
	return true;
}






LRESULT cBiomeViewWnd::WndProc(HWND a_Wnd, UINT a_Msg, WPARAM wParam, LPARAM lParam)
{
	switch (a_Msg)
	{
		case WM_CLOSE:       return OnClose();
		case WM_COMMAND:     return OnCommand(wParam, lParam);
		case WM_LBUTTONDOWN: return OnLButtonDown(wParam, lParam);
		case WM_LBUTTONUP:   return OnLButtonUp  (wParam, lParam);
		case WM_MOUSEMOVE:   return OnMouseMove  (wParam, lParam);
		case WM_PAINT:       return OnPaint();
		case WM_TIMER:       return OnTimer(wParam);
	}
	return ::DefWindowProc(a_Wnd, a_Msg, wParam, lParam);
}





LRESULT cBiomeViewWnd::OnClose(void)
{
	PostQuitMessage(0);
	return 0;
}





LRESULT cBiomeViewWnd::OnCommand(WPARAM wParam, LPARAM lParam)
{
	// TODO: Handle menu commands, when we get menu
	return 0;
}





LRESULT cBiomeViewWnd::OnLButtonDown(WPARAM wParam, LPARAM lParam)
{
	m_IsLButtonDown = true;
	GetCursorPos(&m_MouseDown);
	return 0;
}





LRESULT cBiomeViewWnd::OnMouseMove(WPARAM wParam, LPARAM lParam)
{
	if (!m_IsLButtonDown)
	{
		return 0;
	}
	POINT pnt;
	GetCursorPos(&pnt);
	m_Renderer.MoveViewBy(pnt.x - m_MouseDown.x, pnt.y - m_MouseDown.y);
	if (m_Renderer.Render(m_Pixmap))
	{
		SetTimer(m_Wnd, TIMER_RERENDER, 200, NULL);
	}
	m_MouseDown = pnt;
	InvalidateRect(m_Wnd, NULL, FALSE);
	return 0;
}





LRESULT cBiomeViewWnd::OnLButtonUp(WPARAM wParam, LPARAM lParam)
{
	OnMouseMove(wParam, lParam);  // Last movement - if the mouse move hasn't been reported due to speed
	m_IsLButtonDown = false;
	InvalidateRect(m_Wnd, NULL, FALSE);
	return 0;
}





LRESULT cBiomeViewWnd::OnPaint(void)
{
	PAINTSTRUCT ps;
	HDC DC = BeginPaint(m_Wnd, &ps);
	
	RECT rc;
	GetClientRect(m_Wnd, &rc);
	int Wid = rc.right - rc.left;
	int Hei = rc.bottom - rc.top;
	if ((m_Pixmap.GetWidth() != Wid) || (m_Pixmap.GetHeight() != Hei))
	{
		m_Pixmap.SetSize(Wid, Hei);
		if (m_Renderer.Render(m_Pixmap))
		{
			SetTimer(m_Wnd, TIMER_RERENDER, 200, NULL);
		}
	}
	
	m_Pixmap.DrawToDC(DC, 0, 0);

	EndPaint(m_Wnd, &ps);
	return 0;
}





LRESULT cBiomeViewWnd::OnTimer(WPARAM wParam)
{
	switch (wParam)
	{
		case TIMER_RERENDER:
		{
			if (!m_Renderer.Render(m_Pixmap))
			{
				KillTimer(m_Wnd, TIMER_RERENDER);
			}
			InvalidateRect(m_Wnd, NULL, FALSE);
			break;
		}
	}
	return 0;
}