248 lines
4.1 KiB
C++
248 lines
4.1 KiB
C++
|
|
// 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);
|
|
|
|
InitBiomeView();
|
|
|
|
// 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);
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void cBiomeViewWnd::InitBiomeView(void)
|
|
{
|
|
cIniFile IniFile;
|
|
IniFile.ReadFile("world.ini");
|
|
int Seed = IniFile.GetValueSetI("Generator", "Seed", 0);
|
|
bool CacheOffByDefault = false;
|
|
m_BiomeGen = cBiomeGen::CreateBiomeGen(IniFile, Seed, CacheOffByDefault);
|
|
m_Renderer.SetSource(new cGeneratorBiomeSource(m_BiomeGen));
|
|
IniFile.WriteFile("world.ini");
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void cBiomeViewWnd::SetZoom(int a_NewZoom)
|
|
{
|
|
m_Renderer.SetZoom(a_NewZoom);
|
|
Redraw();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void cBiomeViewWnd::Redraw(void)
|
|
{
|
|
if (m_Renderer.Render(m_Pixmap))
|
|
{
|
|
SetTimer(m_Wnd, TIMER_RERENDER, 200, NULL);
|
|
}
|
|
InvalidateRect(m_Wnd, NULL, FALSE);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LRESULT cBiomeViewWnd::WndProc(HWND a_Wnd, UINT a_Msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (a_Msg)
|
|
{
|
|
case WM_CHAR: return OnChar (wParam, lParam);
|
|
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::OnChar(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch (wParam)
|
|
{
|
|
case '1': SetZoom(1); break;
|
|
case '2': SetZoom(2); break;
|
|
case '3': SetZoom(3); break;
|
|
case '4': SetZoom(4); break;
|
|
case '5': SetZoom(5); break;
|
|
case '6': SetZoom(6); break;
|
|
case '7': SetZoom(7); break;
|
|
case '8': SetZoom(8); break;
|
|
case 27:
|
|
{
|
|
// Esc pressed, exit
|
|
PostQuitMessage(0);
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
m_MouseDown = pnt;
|
|
Redraw();
|
|
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;
|
|
}
|
|
|
|
|
|
|
|
|