2005-06-25 04:21:26 +02:00
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
#include "ScenarioEditor.h"
|
|
|
|
|
|
|
|
#include "wx/glcanvas.h"
|
2005-06-28 01:04:34 +02:00
|
|
|
#include "CustomControls/SnapSplitterWindow/SnapSplitterWindow.h"
|
2005-06-25 04:21:26 +02:00
|
|
|
|
2005-06-28 01:04:34 +02:00
|
|
|
#include "GameInterface/MessagePasser.h"
|
2005-06-25 04:21:26 +02:00
|
|
|
#include "GameInterface/Messages.h"
|
|
|
|
|
2005-06-28 01:04:34 +02:00
|
|
|
#include "Sections/Map/Map.h"
|
|
|
|
|
2005-07-03 18:25:48 +02:00
|
|
|
#include "tools/Common/Tools.h"
|
|
|
|
|
2005-06-28 01:04:34 +02:00
|
|
|
//#define UI_ONLY
|
|
|
|
|
2005-06-25 04:21:26 +02:00
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2005-07-03 18:25:48 +02:00
|
|
|
// TODO: move into another file
|
2005-06-25 04:21:26 +02:00
|
|
|
class Canvas : public wxGLCanvas
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Canvas(wxWindow* parent, int* attribList)
|
2005-07-03 18:25:48 +02:00
|
|
|
: wxGLCanvas(parent, -1, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS, _T("GLCanvas"), attribList),
|
2005-06-25 04:21:26 +02:00
|
|
|
m_SuppressResize(true)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void OnResize(wxSizeEvent&)
|
|
|
|
{
|
2005-06-28 01:04:34 +02:00
|
|
|
// Be careful not to send 'resize' messages to the game before we've
|
|
|
|
// told it that this canvas exists
|
2005-06-25 04:21:26 +02:00
|
|
|
if (! m_SuppressResize)
|
2005-07-03 18:25:48 +02:00
|
|
|
ADD_COMMAND(ResizeScreen(GetClientSize().GetWidth(), GetClientSize().GetHeight()));
|
|
|
|
// TODO: fix flashing
|
2005-06-25 04:21:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void InitSize()
|
|
|
|
{
|
|
|
|
m_SuppressResize = false;
|
|
|
|
SetSize(320, 240);
|
|
|
|
}
|
|
|
|
|
2005-07-03 18:25:48 +02:00
|
|
|
bool KeyScroll(wxKeyEvent& evt, bool enable)
|
|
|
|
{
|
|
|
|
int dir;
|
|
|
|
switch (evt.GetKeyCode())
|
|
|
|
{
|
|
|
|
case WXK_LEFT: dir = AtlasMessage::mScrollConstant::LEFT; break;
|
|
|
|
case WXK_RIGHT: dir = AtlasMessage::mScrollConstant::RIGHT; break;
|
|
|
|
case WXK_UP: dir = AtlasMessage::mScrollConstant::FORWARDS; break;
|
|
|
|
case WXK_DOWN: dir = AtlasMessage::mScrollConstant::BACKWARDS; break;
|
|
|
|
case WXK_SHIFT: dir = -1; break;
|
|
|
|
default: return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
float speed = wxGetKeyState(WXK_SHIFT) ? 240.0f : 120.0f;
|
|
|
|
|
|
|
|
if (dir == -1) // changed modifier keys - update all currently-scrolling directions
|
|
|
|
{
|
|
|
|
if (wxGetKeyState(WXK_LEFT)) ADD_INPUT(ScrollConstant(AtlasMessage::mScrollConstant::LEFT, speed));
|
|
|
|
if (wxGetKeyState(WXK_RIGHT)) ADD_INPUT(ScrollConstant(AtlasMessage::mScrollConstant::RIGHT, speed));
|
|
|
|
if (wxGetKeyState(WXK_UP)) ADD_INPUT(ScrollConstant(AtlasMessage::mScrollConstant::FORWARDS, speed));
|
|
|
|
if (wxGetKeyState(WXK_DOWN)) ADD_INPUT(ScrollConstant(AtlasMessage::mScrollConstant::BACKWARDS, speed));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ADD_INPUT(ScrollConstant(dir, enable ? speed : 0.0f));
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void OnKeyDown(wxKeyEvent& evt)
|
|
|
|
{
|
|
|
|
if (KeyScroll(evt, true))
|
|
|
|
return;
|
|
|
|
|
|
|
|
g_CurrentTool->OnKey(evt, ITool::KEY_DOWN);
|
|
|
|
|
|
|
|
evt.Skip();
|
|
|
|
}
|
|
|
|
|
|
|
|
void OnKeyUp(wxKeyEvent& evt)
|
|
|
|
{
|
|
|
|
if (KeyScroll(evt, false))
|
|
|
|
return;
|
|
|
|
|
|
|
|
g_CurrentTool->OnKey(evt, ITool::KEY_UP);
|
|
|
|
|
|
|
|
evt.Skip();
|
|
|
|
}
|
|
|
|
|
|
|
|
void OnMouse(wxMouseEvent& evt)
|
|
|
|
{
|
|
|
|
g_CurrentTool->OnMouse(evt);
|
|
|
|
}
|
|
|
|
|
2005-06-25 04:21:26 +02:00
|
|
|
private:
|
|
|
|
bool m_SuppressResize;
|
|
|
|
DECLARE_EVENT_TABLE();
|
|
|
|
};
|
|
|
|
BEGIN_EVENT_TABLE(Canvas, wxGLCanvas)
|
|
|
|
EVT_SIZE(Canvas::OnResize)
|
2005-07-03 18:25:48 +02:00
|
|
|
EVT_KEY_DOWN(Canvas::OnKeyDown)
|
|
|
|
EVT_KEY_UP(Canvas::OnKeyUp)
|
|
|
|
|
|
|
|
EVT_LEFT_DOWN(Canvas::OnMouse)
|
|
|
|
EVT_LEFT_UP (Canvas::OnMouse)
|
|
|
|
EVT_MOTION (Canvas::OnMouse)
|
2005-06-25 04:21:26 +02:00
|
|
|
END_EVENT_TABLE()
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
BEGIN_EVENT_TABLE(ScenarioEditor, wxFrame)
|
2005-06-28 01:04:34 +02:00
|
|
|
EVT_CLOSE(ScenarioEditor::OnClose)
|
2005-07-03 18:25:48 +02:00
|
|
|
EVT_TIMER(wxID_ANY, ScenarioEditor::OnTimer)
|
2005-06-25 04:21:26 +02:00
|
|
|
END_EVENT_TABLE()
|
|
|
|
|
|
|
|
|
|
|
|
ScenarioEditor::ScenarioEditor()
|
2005-06-28 01:04:34 +02:00
|
|
|
: wxFrame(NULL, wxID_ANY, _("Atlas - Scenario Editor"), wxDefaultPosition, wxSize(1024, 768))
|
2005-06-25 04:21:26 +02:00
|
|
|
{
|
2005-06-28 01:04:34 +02:00
|
|
|
SnapSplitterWindow* splitter = new SnapSplitterWindow(this);
|
|
|
|
|
|
|
|
// Set up GL canvas:
|
2005-06-25 04:21:26 +02:00
|
|
|
|
|
|
|
int glAttribList[] = {
|
|
|
|
WX_GL_RGBA,
|
|
|
|
WX_GL_DOUBLEBUFFER,
|
2005-06-28 01:04:34 +02:00
|
|
|
WX_GL_DEPTH_SIZE, 24, // TODO: wx documentation doesn't say this is valid
|
2005-06-25 04:21:26 +02:00
|
|
|
0
|
|
|
|
};
|
2005-06-28 01:04:34 +02:00
|
|
|
Canvas* canvas = new Canvas(splitter, glAttribList);
|
2005-06-25 04:21:26 +02:00
|
|
|
// The canvas' context gets made current on creation; but it can only be
|
|
|
|
// current for one thread at a time, and it needs to be current for the
|
|
|
|
// thread that is doing the draw calls, so disable it for this one.
|
|
|
|
wglMakeCurrent(NULL, NULL);
|
|
|
|
|
2005-06-28 01:04:34 +02:00
|
|
|
// Set up sidebars:
|
|
|
|
|
|
|
|
Sidebar* sidebar = new MapSidebar(splitter);
|
|
|
|
|
|
|
|
// Build layout:
|
|
|
|
|
|
|
|
splitter->SplitVertically(sidebar, canvas, 200);
|
|
|
|
|
|
|
|
// Send setup messages to game engine:
|
2005-06-25 04:21:26 +02:00
|
|
|
|
2005-06-28 01:04:34 +02:00
|
|
|
#ifndef UI_ONLY
|
2005-07-03 18:25:48 +02:00
|
|
|
ADD_COMMAND(SetContext(canvas->GetHDC(), canvas->GetContext()->GetGLRC()));
|
2005-06-25 04:21:26 +02:00
|
|
|
|
2005-07-03 18:25:48 +02:00
|
|
|
ADD_COMMAND(CommandString("init"));
|
2005-06-25 04:21:26 +02:00
|
|
|
|
|
|
|
canvas->InitSize();
|
|
|
|
|
2005-07-03 18:25:48 +02:00
|
|
|
ADD_COMMAND(CommandString("render_enable"));
|
2005-06-28 01:04:34 +02:00
|
|
|
#endif
|
2005-07-03 18:25:48 +02:00
|
|
|
|
|
|
|
// XXX
|
|
|
|
USE_TOOL(AlterElevation);
|
|
|
|
|
|
|
|
m_Timer.SetOwner(this);
|
|
|
|
m_Timer.Start(50);
|
2005-06-25 04:21:26 +02:00
|
|
|
}
|
|
|
|
|
2005-07-03 18:25:48 +02:00
|
|
|
|
2005-06-25 04:21:26 +02:00
|
|
|
void ScenarioEditor::OnClose(wxCloseEvent&)
|
|
|
|
{
|
2005-06-28 01:04:34 +02:00
|
|
|
#ifndef UI_ONLY
|
2005-07-03 18:25:48 +02:00
|
|
|
ADD_COMMAND(CommandString("shutdown"));
|
2005-06-28 01:04:34 +02:00
|
|
|
#endif
|
2005-07-03 18:25:48 +02:00
|
|
|
ADD_COMMAND(CommandString("exit"));
|
|
|
|
|
|
|
|
SetCurrentTool(NULL);
|
|
|
|
|
2005-06-25 04:21:26 +02:00
|
|
|
// TODO: What if it's still rendering while we're destroying the canvas?
|
|
|
|
Destroy();
|
|
|
|
}
|
2005-07-03 18:25:48 +02:00
|
|
|
|
|
|
|
|
|
|
|
void ScenarioEditor::OnTimer(wxTimerEvent&)
|
|
|
|
{
|
|
|
|
// TODO: Improve timer stuff - smoother, etc
|
|
|
|
static wxLongLong last = wxGetLocalTimeMillis();
|
|
|
|
wxLongLong time = wxGetLocalTimeMillis();
|
|
|
|
g_CurrentTool->OnTick((time-last).ToLong());
|
|
|
|
last = time;
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
AtlasMessage::Position::Position(const wxPoint& pt)
|
|
|
|
{
|
|
|
|
// TODO: convert to world space (via the engine)
|
|
|
|
x = pt.x/32.f;
|
|
|
|
y = 0.f;
|
|
|
|
z = pt.y/32.f;
|
|
|
|
}
|