Skyscraper 2.0
enginemanager.cpp
Go to the documentation of this file.
1/*
2 Skyscraper 2.0 Alpha - Engine Manager Dialog
3 Copyright (C)2003-2024 Ryan Thoryk
4 https://www.skyscrapersim.net
5 https://sourceforge.net/projects/skyscraper/
6 Contact - ryan@skyscrapersim.net
7
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 as published by the Free Software Foundation; either version 2
11 of the License, or (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21*/
22
23//(*InternalHeaders(EngineManager)
24#include <wx/intl.h>
25#include <wx/string.h>
26//*)
27#include "globals.h"
28#include "sbs.h"
29#include "camera.h"
30#include "debugpanel.h"
31#include "vm.h"
32#include "enginecontext.h"
33#include "moveobject.h"
34#include "loaddialog.h"
35#include "enginemanager.h"
36
37namespace Skyscraper {
38
39//(*IdInit(EngineManager)
40const wxWindowID EngineManager::ID_EngineList = wxNewId();
41const wxWindowID EngineManager::ID_STATICTEXT4 = wxNewId();
42const wxWindowID EngineManager::ID_tPosition = wxNewId();
43const wxWindowID EngineManager::ID_STATICTEXT3 = wxNewId();
44const wxWindowID EngineManager::ID_tBoundsMin = wxNewId();
45const wxWindowID EngineManager::ID_STATICTEXT5 = wxNewId();
46const wxWindowID EngineManager::ID_tBoundsMax = wxNewId();
47const wxWindowID EngineManager::ID_STATICTEXT1 = wxNewId();
48const wxWindowID EngineManager::ID_tActive = wxNewId();
49const wxWindowID EngineManager::ID_STATICTEXT2 = wxNewId();
50const wxWindowID EngineManager::ID_tState = wxNewId();
51const wxWindowID EngineManager::ID_STATICTEXT6 = wxNewId();
52const wxWindowID EngineManager::ID_tUptime = wxNewId();
53const wxWindowID EngineManager::ID_STATICLINE2 = wxNewId();
54const wxWindowID EngineManager::ID_CLoads = wxNewId();
55const wxWindowID EngineManager::ID_chkRender = wxNewId();
56const wxWindowID EngineManager::ID_bSetActive = wxNewId();
57const wxWindowID EngineManager::ID_bReload = wxNewId();
58const wxWindowID EngineManager::ID_bMove = wxNewId();
59const wxWindowID EngineManager::ID_bLoad = wxNewId();
60const wxWindowID EngineManager::ID_bShutdown = wxNewId();
61const wxWindowID EngineManager::ID_bOk = wxNewId();
62//*)
63
64BEGIN_EVENT_TABLE(EngineManager,wxDialog)
65 //(*EventTable(EngineManager)
66 //*)
67END_EVENT_TABLE()
68
69EngineManager::EngineManager(DebugPanel* parent,wxWindowID id,const wxPoint& pos,const wxSize& size)
70{
71 //(*Initialize(EngineManager)
72 wxBoxSizer* BoxSizer1;
73 wxBoxSizer* BoxSizer2;
74 wxBoxSizer* BoxSizer4;
75 wxBoxSizer* BoxSizer5;
76 wxBoxSizer* BoxSizer6;
77 wxBoxSizer* BoxSizer7;
78 wxBoxSizer* BoxSizer8;
79 wxBoxSizer* BoxSizer9;
80 wxFlexGridSizer* FlexGridSizer1;
81 wxFlexGridSizer* FlexGridSizer2;
82 wxFlexGridSizer* FlexGridSizer4;
83 wxFlexGridSizer* FlexGridSizer5;
84
85 Create(parent, wxID_ANY, _("Engine Manager"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, _T("wxID_ANY"));
86 FlexGridSizer1 = new wxFlexGridSizer(0, 1, 0, 0);
87 FlexGridSizer5 = new wxFlexGridSizer(0, 2, 0, 0);
88 BoxSizer8 = new wxBoxSizer(wxVERTICAL);
89 EngineList = new wxListBox(this, ID_EngineList, wxDefaultPosition, wxSize(300,200), 0, 0, 0, wxDefaultValidator, _T("ID_EngineList"));
90 BoxSizer8->Add(EngineList, 1, wxALL|wxALIGN_CENTER_HORIZONTAL, 5);
91 FlexGridSizer5->Add(BoxSizer8, 1, wxALL|wxEXPAND, 5);
92 BoxSizer1 = new wxBoxSizer(wxVERTICAL);
93 FlexGridSizer4 = new wxFlexGridSizer(0, 1, 0, 0);
94 FlexGridSizer2 = new wxFlexGridSizer(0, 2, 0, 0);
95 StaticText4 = new wxStaticText(this, ID_STATICTEXT4, _("Position:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT4"));
96 FlexGridSizer2->Add(StaticText4, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
97 tPosition = new wxTextCtrl(this, ID_tPosition, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_CENTRE, wxDefaultValidator, _T("ID_tPosition"));
98 tPosition->SetMinSize(wxSize(125,-1));
99 FlexGridSizer2->Add(tPosition, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
100 StaticText3 = new wxStaticText(this, ID_STATICTEXT3, _("Bounds Min:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT3"));
101 FlexGridSizer2->Add(StaticText3, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
102 tBoundsMin = new wxTextCtrl(this, ID_tBoundsMin, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_CENTRE, wxDefaultValidator, _T("ID_tBoundsMin"));
103 tBoundsMin->SetMinSize(wxSize(125,-1));
104 FlexGridSizer2->Add(tBoundsMin, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
105 StaticText5 = new wxStaticText(this, ID_STATICTEXT5, _("Bounds Max:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT5"));
106 FlexGridSizer2->Add(StaticText5, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
107 tBoundsMax = new wxTextCtrl(this, ID_tBoundsMax, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_CENTRE, wxDefaultValidator, _T("ID_tBoundsMax"));
108 tBoundsMax->SetMinSize(wxSize(125,-1));
109 FlexGridSizer2->Add(tBoundsMax, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
110 StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("Camera Active:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1"));
111 FlexGridSizer2->Add(StaticText1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
112 tActive = new wxTextCtrl(this, ID_tActive, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_CENTRE, wxDefaultValidator, _T("ID_tActive"));
113 tActive->SetMinSize(wxSize(125,-1));
114 FlexGridSizer2->Add(tActive, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
115 StaticText2 = new wxStaticText(this, ID_STATICTEXT2, _("State:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT2"));
116 FlexGridSizer2->Add(StaticText2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
117 tState = new wxTextCtrl(this, ID_tState, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_CENTRE, wxDefaultValidator, _T("ID_tState"));
118 tState->SetMinSize(wxSize(125,-1));
119 FlexGridSizer2->Add(tState, 1, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
120 StaticText6 = new wxStaticText(this, ID_STATICTEXT6, _("Uptime:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT6"));
121 FlexGridSizer2->Add(StaticText6, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
122 tUptime = new wxTextCtrl(this, ID_tUptime, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_CENTRE, wxDefaultValidator, _T("ID_tUptime"));
123 tUptime->SetMinSize(wxSize(125,-1));
124 FlexGridSizer2->Add(tUptime, 1, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
125 FlexGridSizer4->Add(FlexGridSizer2, 1, wxBOTTOM|wxEXPAND, 5);
126 BoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
127 StaticLine2 = new wxStaticLine(this, ID_STATICLINE2, wxDefaultPosition, wxSize(10,-1), wxLI_HORIZONTAL, _T("ID_STATICLINE2"));
128 BoxSizer4->Add(StaticLine2, 1, wxEXPAND, 5);
129 FlexGridSizer4->Add(BoxSizer4, 1, wxBOTTOM|wxEXPAND, 5);
130 BoxSizer7 = new wxBoxSizer(wxVERTICAL);
131 chkCLoads = new wxCheckBox(this, ID_CLoads, _("Concurrent Loading"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_CLoads"));
132 chkCLoads->SetValue(false);
133 BoxSizer7->Add(chkCLoads, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
134 chkRender = new wxCheckBox(this, ID_chkRender, _("Render on Startup"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_chkRender"));
135 chkRender->SetValue(false);
136 BoxSizer7->Add(chkRender, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
137 FlexGridSizer4->Add(BoxSizer7, 1, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
138 BoxSizer2 = new wxBoxSizer(wxVERTICAL);
139 BoxSizer5 = new wxBoxSizer(wxHORIZONTAL);
140 bSetActive = new wxButton(this, ID_bSetActive, _("Set Active"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_bSetActive"));
141 BoxSizer5->Add(bSetActive, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
142 bReload = new wxButton(this, ID_bReload, _("Reload"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_bReload"));
143 BoxSizer5->Add(bReload, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
144 bMove = new wxButton(this, ID_bMove, _("Move"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_bMove"));
145 BoxSizer5->Add(bMove, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
146 BoxSizer2->Add(BoxSizer5, 1, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
147 BoxSizer6 = new wxBoxSizer(wxHORIZONTAL);
148 bLoad = new wxButton(this, ID_bLoad, _("Load Building"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_bLoad"));
149 BoxSizer6->Add(bLoad, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
150 bShutdown = new wxButton(this, ID_bShutdown, _("Shutdown"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_bShutdown"));
151 BoxSizer6->Add(bShutdown, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
152 BoxSizer2->Add(BoxSizer6, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
153 FlexGridSizer4->Add(BoxSizer2, 1, wxEXPAND, 5);
154 BoxSizer1->Add(FlexGridSizer4, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
155 FlexGridSizer5->Add(BoxSizer1, 1, wxALL|wxEXPAND, 5);
156 FlexGridSizer1->Add(FlexGridSizer5, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
157 BoxSizer9 = new wxBoxSizer(wxHORIZONTAL);
158 bOk = new wxButton(this, ID_bOk, _("OK"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_bOk"));
159 BoxSizer9->Add(bOk, 1, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
160 FlexGridSizer1->Add(BoxSizer9, 1, wxBOTTOM|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
161 SetSizer(FlexGridSizer1);
162 FlexGridSizer1->SetSizeHints(this);
163 Center();
164
165 Connect(ID_CLoads, wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction)&EngineManager::On_chkCLoads_Click);
166 Connect(ID_chkRender, wxEVT_COMMAND_CHECKBOX_CLICKED, (wxObjectEventFunction)&EngineManager::On_chkRender_Click);
167 Connect(ID_bSetActive, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&EngineManager::On_bSetActive_Click);
168 Connect(ID_bReload, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&EngineManager::On_bReload_Click);
169 Connect(ID_bMove, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&EngineManager::On_bMove_Click);
170 Connect(ID_bLoad, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&EngineManager::On_bLoad_Click);
171 Connect(ID_bShutdown, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&EngineManager::On_bShutdown_Click);
172 Connect(ID_bOk, wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&EngineManager::On_bOk_Click);
173 //*)
174 panel = parent;
175 loader = 0;
176 moveobject = 0;
177 OnInit();
178}
179
181{
182 //(*Destroy(EngineManager)
183 //*)
184
185 if (loader)
186 loader->Destroy();
187 loader = 0;
188 if (moveobject)
189 moveobject->Destroy();
190 moveobject = 0;
191}
192
194{
195 lastcount = 0;
196 engine = 0;
197
198 chkCLoads->SetValue(panel->GetRoot()->ConcurrentLoads);
199 chkRender->SetValue(panel->GetRoot()->GetRenderOnStartup());
200}
201
203{
204 int count = panel->GetRoot()->GetEngineCount();
205 if (count != lastcount)
206 {
207 int selection = EngineList->GetSelection();
208 int size = panel->GetRoot()->GetEngineListSize();
209
210 lastcount = count;
211 EngineList->Clear();
212
213 for (int i = 0; i < size; i++)
214 {
216 std::string filename = "Empty";
217
218 if (engine)
219 filename = engine->GetFilename();
220
221 EngineList->Append(SBS::ToString(i) + wxT(" - ") + filename);
222 }
223
224 if (selection == -1)
225 selection = 0;
226
227 if (selection >= size)
228 selection = size - 1;
229
230 if (count > 0 && selection < size)
231 EngineList->SetSelection(selection);
232 }
233
234 if (count == 0)
235 return;
236
237 int selection = EngineList->GetSelection();
238 engine = panel->GetRoot()->GetEngine(selection);
239
240 if (engine)
241 {
242 if (!engine->GetSystem())
243 return;
244
245 Vector3 position = engine->GetSystem()->GetPosition();
246 Vector3 min, max;
247 engine->GetSystem()->GetBounds(min, max);
248
249 if (min.y <= -999999)
250 min.y = 0;
251 if (max.y >= 999999)
252 max.y = 0;
253
254 tPosition->SetValue(TruncateNumber(position.x, 2) + wxT(", ") + TruncateNumber(position.y, 2) + wxT(", ") + TruncateNumber(position.z, 2));
255 tBoundsMin->SetValue(TruncateNumber(min.x, 2) + wxT(", ") + TruncateNumber(min.y, 2) + wxT(", ") + TruncateNumber(min.z, 2));
256 tBoundsMax->SetValue(TruncateNumber(max.x, 2) + wxT(", ") + TruncateNumber(max.y, 2) + wxT(", ") + TruncateNumber(max.z, 2));
257
258 //set camera state
259 if (engine->IsCameraActive() == true)
260 tActive->SetValue("True");
261 else
262 tActive->SetValue("False");
263
264 //set engine running state
265 if (engine->GetShutdownState() == true)
266 tState->SetValue("Shutdown");
267 else if (engine->IsLoading() == true)
268 tState->SetValue("Loading");
269 else if (engine->IsRunning() == true)
270 tState->SetValue("Running");
271
272 //set engine uptime
273 tUptime->SetValue(SBS::ToString(engine->GetSystem()->GetRunTime() / 1000));
274 }
275 else
276 {
277 tPosition->Clear();
278 tBoundsMin->Clear();
279 tBoundsMax->Clear();
280 tActive->Clear();
281 tState->SetValue("Unloaded");
282 }
283
284 if (moveobject)
285 moveobject->Loop();
286}
287
288void EngineManager::On_bSetActive_Click(wxCommandEvent& event)
289{
290 int selection = EngineList->GetSelection();
291
292 if (selection >= 0)
293 panel->GetRoot()->SetActiveEngine(selection);
294}
295
296void EngineManager::On_bLoad_Click(wxCommandEvent& event)
297{
298 if (!loader)
299 loader = new LoadDialog(panel, this, -1);
300
301 loader->CenterOnScreen();
302 loader->Show();
303}
304
305void EngineManager::On_bReload_Click(wxCommandEvent& event)
306{
307 int selection = EngineList->GetSelection();
308
309 if (selection >= 0)
310 {
311 EngineContext *engine = panel->GetRoot()->GetEngine(selection);
312
313 if (engine)
314 engine->Reload = true;
315 }
316}
317
318void EngineManager::On_bShutdown_Click(wxCommandEvent& event)
319{
320 int selection = EngineList->GetSelection();
321
322 if (selection >= 0)
323 {
324 EngineContext *engine = panel->GetRoot()->GetEngine(selection);
325
326 if (engine)
327 engine->Shutdown();
328 }
329}
330
331void EngineManager::On_chkCLoads_Click(wxCommandEvent& event)
332{
333 panel->GetRoot()->ConcurrentLoads = chkCLoads->GetValue();
334}
335
336void EngineManager::On_chkRender_Click(wxCommandEvent& event)
337{
338 panel->GetRoot()->SetRenderOnStartup(chkRender->GetValue());
339}
340
341void EngineManager::On_bOk_Click(wxCommandEvent& event)
342{
343 this->Close();
344}
345
346void EngineManager::On_bMove_Click(wxCommandEvent& event)
347{
348 int selection = EngineList->GetSelection();
349
350 if (selection >= 0)
351 {
352 EngineContext *engine = panel->GetRoot()->GetEngine(selection);
353
354 if (engine)
355 {
356 if (moveobject)
357 delete moveobject;
358 moveobject = 0;
359
360 moveobject = new MoveObject(panel, this, -1, engine, 0);
361 moveobject->Show();
362 }
363 }
364}
365
366}
367
virtual Vector3 GetPosition(bool relative=false)
Definition object.cpp:321
unsigned long GetRunTime()
Definition sbs.cpp:3290
bool GetBounds(Vector3 &min, Vector3 &max)
Definition sbs.cpp:4309
static const wxWindowID ID_tBoundsMax
static const wxWindowID ID_STATICTEXT6
static const wxWindowID ID_STATICTEXT1
static const wxWindowID ID_tActive
static const wxWindowID ID_chkRender
void On_bOk_Click(wxCommandEvent &event)
static const wxWindowID ID_bReload
void On_chkRender_Click(wxCommandEvent &event)
void On_bMove_Click(wxCommandEvent &event)
void On_bLoad_Click(wxCommandEvent &event)
static const wxWindowID ID_bSetActive
static const wxWindowID ID_bLoad
static const wxWindowID ID_bMove
void On_bSetActive_Click(wxCommandEvent &event)
static const wxWindowID ID_EngineList
static const wxWindowID ID_tBoundsMin
static const wxWindowID ID_STATICTEXT4
static const wxWindowID ID_tUptime
static const wxWindowID ID_tPosition
static const wxWindowID ID_STATICTEXT2
static const wxWindowID ID_CLoads
static const wxWindowID ID_STATICTEXT5
void On_bReload_Click(wxCommandEvent &event)
static const wxWindowID ID_bOk
static const wxWindowID ID_STATICTEXT3
static const wxWindowID ID_tState
void On_chkCLoads_Click(wxCommandEvent &event)
void On_bShutdown_Click(wxCommandEvent &event)
static const wxWindowID ID_bShutdown
static const wxWindowID ID_STATICLINE2
int GetEngineListSize()
Definition vm.h:87
void SetActiveEngine(int number, bool switch_engines=false, bool force=false)
Definition vm.cpp:226
int GetEngineCount(bool loading_only=false)
Definition vm.cpp:442
bool GetRenderOnStartup()
Definition vm.cpp:972
bool ConcurrentLoads
Definition vm.h:116
EngineContext * GetEngine(int number)
Definition vm.cpp:432
void SetRenderOnStartup(bool value)
Definition vm.cpp:960
Ogre::Vector3 Vector3
Definition globals.h:58
std::string ToString(int number)
Definition globals.cpp:279
wxString TruncateNumber(float value, int decimals)