Skyscraper 2.0
native.cpp
Go to the documentation of this file.
1/*
2 Skyscraper 2.1 - Simulation Frontend (Native)
3 Copyright (C)2003-2025 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#ifndef USING_WX
24
25#include <filesystem>
26
27#ifdef _WIN32
28#include <windows.h>
29#elif __APPLE__
30
31#include <mach-o/dyld.h>
32#include <climits>
33
34#else
35#include <unistd.h>
36#include <limits.h>
37#endif
38
39#include "globals.h"
40#include "sbs.h"
41#include "vm.h"
42#include "hal.h"
43#include "enginecontext.h"
44#include "camera.h"
45#include "sky.h"
46#include "skyscraper.h"
47
48using namespace SBS;
49
50namespace Skyscraper {
51
52std::filesystem::path Skyscraper::GetExeDirectory()
53{
54 //return the executable path
55
56#ifdef _WIN32
57 // Windows specific
58 wchar_t szPath[MAX_PATH];
59 GetModuleFileNameW( NULL, szPath, MAX_PATH );
60 return std::filesystem::path{szPath}.parent_path() / "";
61#elif __APPLE__
62 // Mac specific
63 char szPath[PATH_MAX];
64 uint32_t bufsize = PATH_MAX;
65 if (!_NSGetExecutablePath(szPath, &bufsize))
66 return std::filesystem::path{szPath}.parent_path() / ""; // to finish the folder path with (back)slash
67 return {}; // some error
68#else
69 // Linux specific
70 char szPath[PATH_MAX];
71 ssize_t count = readlink( "/proc/self/exe", szPath, PATH_MAX );
72 if( count < 0 || count >= PATH_MAX )
73 return {}; // some error
74 szPath[count] = '\0';
75 return std::filesystem::path{szPath}.parent_path() / "";
76#endif
77 return "";
78}
79
81{
82 //set working directory
83 std::string path = GetExeDirectory().generic_string();
84 #ifdef WIN32
85 {
86 }
87 #elif defined __APPLE__
88 {
89 path = path + "../../../";
90 vm->data_path = settingsPath() + "/Skyscraper/"; //Application Support folder
91 }
92 #else
93 path = path + "../";
94 #endif
95
96 if (path != "")
97 std::filesystem::current_path(path);
98 else
99 return false;
100
101 return true;
102}
103
104bool Skyscraper::keyPressed(const OgreBites::KeyboardEvent& evt)
105{
106 //this function is run when a key is pressed
107
108 EngineContext *engine = vm->GetActiveEngine();
109
110 if (!engine)
111 return false;
112
113 //get SBS instance
114 ::SBS::SBS *Simcore = engine->GetSystem();
115
116 if (!Simcore)
117 return false;
118
119 Camera *camera = Simcore->camera;
120
121 if (!camera)
122 return false;
123
124 OgreBites::Keycode key = evt.keysym.sym;
125
126 //modifiers
127 if (evt.keysym.mod == (unsigned short)64)
128 {
129 //ctrl pressed
130 ctrl_down = true;
131 }
132 else if (evt.keysym.mod == (unsigned short)1)
133 {
134 //shift pressed
135 shift_down = true;
136 }
137 else if (evt.keysym.mod == (unsigned short)256)
138 {
139 //alt pressed
140 alt_down = true;
141 }
142
143 //general keys
144 if (key == OgreBites::SDLK_ESCAPE)
145 {
146 //vm->Shutdown = true;
147 Quit();
148 }
149 else if (key == OgreBites::SDLK_F2)
150 {
151 Real fps = Simcore->FPS;
152 HAL *hal = vm->GetHAL();
153 Ogre::RenderSystem *rendersystem = hal->mRoot->getRenderSystem();
154
155 int batches = (int)rendersystem->_getBatchCount();
156 int triangles = (int)rendersystem->_getFaceCount();
157 int vertices = (int)rendersystem->_getVertexCount();
158
159 hal->Report("FPS: " + ToString(Simcore->FPS) + " - Batches: " + ToString(batches) + " - Triangles: " + ToString(triangles) + " - Vertices: " + ToString(vertices), "");
160 }
161 else if (key == OgreBites::SDLK_SPACE)
162 {
163 //jump (spacebar) action
164 if (camera->IsOnGround() == true)
165 camera->Jump();
166 }
167 else if (key == '\x76') //V
168 {
169 bool status = camera->GetGravityStatus();
170
171 camera->EnableGravity(!status);
172 camera->EnableCollisions(!status);
173
174 if (status == false)
175 vm->GetHAL()->Report("Gravity and collision detection on", "");
176 else
177 vm->GetHAL()->Report("Gravity and collision detection off", "");
178 }
179 /*else if (key == OgreBites::ctrl-r)
180 {
181 engine->Reload = true;
182 return true;
183 }*/
184 else if (key == OgreBites::SDLK_F3)
185 {
186 //reset rotation/direction and FOV of camera
187 camera->ResetView();
188 return true;
189 }
190 else if (key == OgreBites::SDLK_F6)
191 {
192 //reset camera position and state
193 camera->ResetState();
194 return true;
195 }
196 else if (key == OgreBites::SDLK_F7)
197 {
198 //show colliders
199 Simcore->ShowColliders(!colliders);
200 colliders = !colliders;
201 }
202 else if (key == OgreBites::SDLK_F4)
203 {
204 //toggle wireframe mode
205 if (wireframe == 0)
206 {
207 vm->GetSkySystem()->EnableSky(false);
208 camera->SetViewMode(1);
209 wireframe = 1;
210 }
211 else if (wireframe == 1)
212 {
213 camera->SetViewMode(2);
214 wireframe = 2;
215 }
216 else if (wireframe == 2)
217 {
218 vm->GetSkySystem()->EnableSky(true);
219 camera->SetViewMode(0);
220 wireframe = 0;
221 }
222 }
223 else if (key == OgreBites::SDLK_F11)
224 {
225 std::string prefix = GetDataPath();
226 vm->GetHAL()->GetRenderWindow()->writeContentsToTimestampedFile(prefix + "screenshots/skyscraper-", ".jpg");
227 }
228 else if (key == OgreBites::SDLK_F5)
229 {
230 //toggle freelook mode
231 EnableFreelook(!camera->Freelook);
232 }
233 else if (key == OgreBites::SDLK_F10)
234 {
235 //toggle fullscreen mode
236 SetFullScreen(!FullScreen);
237 }
238 else if (key == OgreBites::SDLK_F8)
239 {
240 //show mesh bounding boxes
241 Simcore->ShowBoundingBoxes(!boxes);
242 boxes = !boxes;
243 }
244 else if (key == OgreBites::SDLK_F9)
245 {
246 //toggle statistics bar
247 vm->GetHAL()->ToggleStats();
248 }
249 else if (key == OgreBites::SDLK_KP_MINUS)
250 {
251 //increase FOV angle
252 Real angle = camera->GetFOVAngle() + camera->cfg_zoomspeed;
253 camera->SetFOVAngle(angle);
254 }
255 else if (key == OgreBites::SDLK_KP_PLUS)
256 {
257 //decrease FOV angle
258 Real angle = camera->GetFOVAngle() - camera->cfg_zoomspeed;
259 camera->SetFOVAngle(angle);
260 }
261 //model pick-up
262 else if (key == '\x63')
263 {
264 if (camera->IsModelAttached() == false)
265 camera->PickUpModel();
266 else
267 camera->DropModel();
268 }
269 else if (key == OgreBites::SDLK_KP_1)
270 {
271 vm->SetActiveEngine(0);
272 }
273 else if (key == OgreBites::SDLK_KP_2)
274 {
275 vm->SetActiveEngine(1);
276 }
277 else if (key == OgreBites::SDLK_KP_3)
278 {
279 vm->SetActiveEngine(2);
280 }
281 else if (key == OgreBites::SDLK_KP_4)
282 {
283 vm->SetActiveEngine(3);
284 }
285 else if (key == OgreBites::SDLK_KP_5)
286 {
287 vm->SetActiveEngine(4);
288 }
289 else if (key == OgreBites::SDLK_KP_6)
290 {
291 vm->SetActiveEngine(5);
292 }
293 else if (key == OgreBites::SDLK_KP_7)
294 {
295 vm->SetActiveEngine(6);
296 }
297 else if (key == OgreBites::SDLK_KP_8)
298 {
299 vm->SetActiveEngine(7);
300 }
301 else if (key == OgreBites::SDLK_KP_9)
302 {
303 vm->SetActiveEngine(8);
304 }
305 else if (key == OgreBites::SDLK_KP_0)
306 {
307 vm->SetActiveEngine(9);
308 }
309 else if (key == OgreBites::SDLK_RETURN)
310 {
311 //enter or exit a vehicle
312 camera->AttachToVehicle(!camera->inside_vehicle);
313 }
314
315 GetKeyStates(engine, key, true);
316
317 ProcessMovement(engine, ctrl_down, shift_down);
318
319 return true;
320}
321
322bool Skyscraper::keyReleased(const OgreBites::KeyboardEvent& evt)
323{
324 EngineContext *engine = vm->GetActiveEngine();
325
326 if (!engine)
327 return false;
328
329 OgreBites::Keycode key = evt.keysym.sym;
330
331 ctrl_down = false;
332 shift_down = false;
333 alt_down = false;
334
335 GetKeyStates(engine, key, false);
336
337 ProcessMovement(engine, ctrl_down, shift_down);
338
339 return true;
340}
341
342bool Skyscraper::mouseMoved(const OgreBites::MouseMotionEvent &evt)
343{
344 //this function runs when the mouse is moved
345
346 if (!vm->GetActiveEngine())
347 return false;
348
349 //get SBS instance
350 ::SBS::SBS *Simcore = vm->GetActiveEngine()->GetSystem();
351
352 if (!Simcore)
353 return false;
354
355 Camera *camera = Simcore->camera;
356
357 if (!camera)
358 return false;
359
360 //get old mouse coordinates
361 int old_mouse_x = camera->mouse_x;
362 int old_mouse_y = camera->mouse_y;
363
364 //get mouse pointer coordinates
365 camera->mouse_x = evt.x;
366 camera->mouse_y = evt.y;
367
368 //freelook mode
369 if (camera->Freelook == true)
370 {
371 if (freelook == false)
372 {
373 //reset values to prevent movement from getting stuck
374 turn_right = 0;
375 turn_left = 0;
376 }
377
378 freelook = true;
379
380 //get window dimensions
381 Real width = mRenderWindow->getWidth();
382 Real height = mRenderWindow->getHeight();
383
384 //if mouse coordinates changed, and we're in freelook mode, rotate camera
385 if (old_mouse_x != camera->mouse_x || old_mouse_y != camera->mouse_y)
386 {
387 //WarpPointer(width * 0.5, height * 0.5);
388
389 Vector3 rotational;
390 rotational.x = -(((Real)camera->mouse_y - (height / 2))) / (height * 2);
391 rotational.y = -((width / 2) - (Real)camera->mouse_x) / (width * 2);
392 rotational.z = 0;
393
394 Real fps_adjust = Simcore->FPS / 60;
395 rotational *= fps_adjust;
396
397 //apply freelook rotation
398 camera->FreelookMove(rotational);
399 }
400 else
401 {
402 //reset rotation by reprocessing keyboard-based rotation
403 ProcessMovement(vm->GetActiveEngine(), false, false, true);
404 }
405 }
406 else
407 {
408 if (freelook == true)
409 {
410 //reset values to prevent movement from getting stuck
411 strafe_right = 0;
412 strafe_left = 0;
413 if (old_mouse_x != camera->mouse_x || old_mouse_y != camera->mouse_y)
414 camera->FreelookMove(Vector3::ZERO);
415 ProcessMovement(vm->GetActiveEngine(), false, false, true);
416 }
417 freelook = false;
418 }
419
420 HandleMouseMovement();
421 return true;
422}
423
424bool Skyscraper::mousePressed(const OgreBites::MouseButtonEvent &evt)
425{
426 //this function is run when a mouse button is pressed
427
428 //check if the user clicked on an object, and process it
429 unsigned char button = evt.button;
430 bool left = (button == '\x01');
431 bool right = (button != '\x01');
432
433 HAL *hal = vm->GetHAL();
434
435 //apply content scaling factor, fixes issues for example on Retina displays
436 Real scale = 1.0; //leave at 1.0 due to no wxWidgets available
437
438#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
439 //set scale to 1.0 on MacOS versions earlier than 10.15
440 if (vm->macos_major == 10 && vm->macos_minor < 15)
441 scale = 1.0;
442#endif
443
444 hal->ClickedObject(left, false, false, false, right, scale, false);
445
446 return true;
447}
448
449bool Skyscraper::mouseReleased(const OgreBites::MouseButtonEvent &evt)
450{
451 bool left = (evt.button == '\x01');
452 bool right = (evt.button != '\x02');
453
454 if (left == true || right == true)
455 {
456 vm->GetHAL()->UnclickedObject();
457 return true;
458 }
459
460 return false;
461}
462
463bool Skyscraper::mouseWheelRolled(const OgreBites::MouseWheelEvent &evt)
464{
465 //enter or exit freelook mode using mouse scroll wheel
466 if (evt.y > 0)
467 {
468 EnableFreelook(true);
469 return true;
470 }
471 else if (evt.y < 0)
472 {
473 EnableFreelook(false);
474 return true;
475 }
476
477 return false;
478}
479
480bool Skyscraper::touchMoved(const OgreBites::TouchFingerEvent &evt)
481{
482 if (!vm->GetActiveEngine())
483 return false;
484
485 //get SBS instance
486 ::SBS::SBS *Simcore = vm->GetActiveEngine()->GetSystem();
487
488 if (!Simcore)
489 return false;
490
491 Camera *camera = Simcore->camera;
492
493 if (!camera)
494 return false;
495
496 //get old mouse coordinates
497 int old_mouse_x = camera->mouse_x;
498 int old_mouse_y = camera->mouse_y;
499
500 //get mouse pointer coordinates
501 camera->mouse_x = evt.x;
502 camera->mouse_y = evt.y;
503
504 HandleMouseMovement();
505 return true;
506}
507
508bool Skyscraper::touchPressed(const OgreBites::TouchFingerEvent &evt)
509{
510 //this function is run when a user touches an object
511
512 //check if the user touched on an object, and process it
513
514 HAL *hal = vm->GetHAL();
515
516 //apply content scaling factor, fixes issues for example on Retina displays
517 Real scale = 1.0; //leave at 1.0 due to no wxWidgets available
518
519#if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
520 //set scale to 1.0 on MacOS versions earlier than 10.15
521 if (vm->macos_major == 10 && vm->macos_minor < 15)
522 scale = 1.0;
523#endif
524
525 hal->ClickedObject(true, false, false, false, false, scale, false);
526
527 return true;
528}
529
530bool Skyscraper::touchReleased(const OgreBites::TouchFingerEvent &evt)
531{
532 vm->GetHAL()->UnclickedObject();
533 return true;
534}
535
536void Skyscraper::GetKeyStates(EngineContext *engine, OgreBites::Keycode& key, bool down)
537{
538 //get SBS camera
539 Camera *camera = engine->GetSystem()->camera;
540
541 if (!camera)
542 return;
543
544 //alt modifier
545 if (alt_down == true)
546 {
547 //strafe movement
548 if (key == OgreBites::SDLK_RIGHT || key == '\x64')
549 strafe_right = down;
550
551 else if (key == OgreBites::SDLK_LEFT || key == '\x61')
552 strafe_left = down;
553
554 else if (key == OgreBites::SDLK_UP || key == '\x77')
555 float_up = down;
556
557 else if (key == OgreBites::SDLK_DOWN || key == '\x73')
558 float_down = down;
559
560 else if (key == OgreBites::SDLK_PAGEUP)
561 spin_up = down;
562
563 else if (key == OgreBites::SDLK_PAGEDOWN)
564 spin_down = down;
565 }
566 else
567 {
568 if (camera->Freelook == false)
569 {
570 if (key == OgreBites::SDLK_RIGHT || key == '\x64')
571 turn_right = down;
572
573 if (key == OgreBites::SDLK_LEFT || key == '\x61')
574 turn_left = down;
575
576 if (key == '\x71') //Q
577 strafe_right = down;
578
579 if (key == '\x65') //E
580 strafe_left = down;
581 }
582 else
583 {
584 if (key == OgreBites::SDLK_RIGHT || key == '\x64' || key == '\x71')
585 strafe_right = down;
586
587 if (key == OgreBites::SDLK_LEFT || key == '\x61' || key == '\x65')
588 strafe_left = down;
589 }
590
591 if (key == OgreBites::SDLK_PAGEUP)
592 look_up = down;
593
594 if (key == OgreBites::SDLK_PAGEDOWN)
595 look_down = down;
596
597 if (key == OgreBites::SDLK_UP || key == '\x77')
598 step_forward = down;
599
600 if (key == OgreBites::SDLK_DOWN || key == '\x73')
601 step_backward = down;
602
603 //binoculars
604 if (key == '\x62') //B
605 camera->Binoculars(down);
606
607 //crouch
608 if (key == '\x78') //X
609 camera->Crouch(down);
610
611 //values from old version
612 if (key == OgreBites::SDLK_HOME)
613 float_up = down;
614 if (key == OgreBites::SDLK_END)
615 float_down = down;
616
617 //drive functions, when user is inside a vehicle
618 if (camera->Freelook == true && camera->inside_vehicle == true)
619 {
620 if (key == OgreBites::SDLK_LEFT || key == '\x61')
621 engine->GetSystem()->camera->Drive(true, false, false, false, down);
622 if (key == OgreBites::SDLK_RIGHT || key == '\x64')
623 engine->GetSystem()->camera->Drive(false, true, false, false, down);
624 if (key == OgreBites::SDLK_DOWN || key == '\x73')
625 engine->GetSystem()->camera->Drive(false, false, true, false, down);
626 if (key == OgreBites::SDLK_UP || key == '\x77')
627 engine->GetSystem()->camera->Drive(false, false, false, true, down);
628 }
629 }
630}
631
632void Skyscraper::ProcessMovement(EngineContext *engine, bool control, bool shift, bool angle_only)
633{
634 //process movement
635
636 Real strafe = 0, floatval = 0, spin = 0, turn = 0, look = 0, step = 0;
637
638 //get SBS camera
639 Camera *camera = engine->GetSystem()->camera;
640
641 if (!camera)
642 return;
643
644 Real speed_normal = camera->cfg_speed;
645 Real speed_fast = camera->cfg_speedfast;
646 Real speed_slow = camera->cfg_speedslow;
647
648 if (angle_only == false)
649 {
650 camera->speed = 1;
651
652 if (control == true)
653 camera->speed = speed_slow;
654 else if (shift == true)
655 camera->speed = speed_fast;
656
657 if (step_forward == true)
658 step += speed_normal;
659 if (step_backward == true)
660 step -= speed_normal;
661
662 if (strafe_left == true)
663 strafe -= speed_normal;
664 if (strafe_right == true)
665 strafe += speed_normal;
666
667 if (float_up == true)
668 floatval += speed_normal;
669 if (float_down == true)
670 floatval -= speed_normal;
671
672 //set camera motion values
673 camera->Step(step);
674 camera->Strafe(strafe);
675 camera->Float(floatval);
676 }
677
678 if (spin_up == true)
679 spin += speed_normal;
680 if (spin_down == true)
681 spin -= speed_normal;
682
683 if (turn_left == true)
684 turn -= speed_normal;
685 if (turn_right == true)
686 turn += speed_normal;
687
688 if (look_up == true)
689 look += speed_normal;
690 if (look_down == true)
691 look -= speed_normal;
692
693 //set camera rotation values
694 camera->Spin(spin);
695 camera->Turn(turn);
696 camera->Look(look);
697}
698
700{
701 //enable or disable freelook mode
702
703 EngineContext *engine = vm->GetActiveEngine();
704
705 if (!engine)
706 return;
707
708 //get SBS instance
709 ::SBS::SBS *Simcore = engine->GetSystem();
710
711 Camera *camera = Simcore->camera;
712
713 if (!camera)
714 return;
715
716 camera->Freelook = value;
717}
718
720{
721 EngineContext *engine = vm->GetActiveEngine();
722
723 //if (!engine || IsActive() == false)
724 if (!engine)
725 return;
726
727 if (engine->IsRunning() == false)
728 return;
729
730 //get SBS instance
731 ::SBS::SBS *Simcore = engine->GetSystem();
732
733 if (!Simcore)
734 return;
735
736 Camera *camera = Simcore->camera;
737
738 if (!camera)
739 return;
740}
741
742}
743
744#endif
bool PickUpModel()
Definition camera.cpp:1251
int mouse_y
Definition camera.h:98
void Strafe(Real speed=1.0)
Definition camera.cpp:854
Real GetFOVAngle()
Definition camera.cpp:1010
void Binoculars(bool value)
Definition camera.cpp:1194
bool IsOnGround()
Definition camera.cpp:1070
void AttachToVehicle(bool value)
Definition camera.cpp:1553
bool GetGravityStatus()
Definition camera.cpp:985
void ResetView()
Definition camera.cpp:1345
void DropModel()
Definition camera.cpp:1294
void FreelookMove(const Vector3 &rotation)
Definition camera.cpp:904
void Drive(bool left, bool right, bool down, bool up, bool key_down)
Definition camera.cpp:1526
bool inside_vehicle
Definition camera.h:94
int mouse_x
Definition camera.h:98
bool Freelook
Definition camera.h:87
void Crouch(bool value)
Definition camera.cpp:1537
void SetViewMode(int mode)
Definition camera.cpp:1031
void Turn(Real speed=1.0)
Definition camera.cpp:892
Real cfg_zoomspeed
Definition camera.h:76
Real cfg_speedfast
Definition camera.h:74
void SetFOVAngle(Real angle)
Definition camera.cpp:990
void ResetState()
Definition camera.cpp:1312
void Jump()
Definition camera.cpp:872
void Step(Real speed=1.0)
Definition camera.cpp:860
Real cfg_speed
Definition camera.h:73
bool IsModelAttached()
Definition camera.cpp:1305
Real speed
Definition camera.h:81
void Float(Real speed=1.0)
Definition camera.cpp:866
void Look(Real speed=1.0)
Definition camera.cpp:886
void Spin(Real speed=1.0)
Definition camera.cpp:898
Real cfg_speedslow
Definition camera.h:75
void EnableGravity(bool value)
Definition camera.cpp:967
void EnableCollisions(bool value)
Definition camera.cpp:1052
void ShowBoundingBoxes(bool value)
Definition sbs.cpp:3985
Camera * camera
Definition sbs.h:160
Real FPS
Definition sbs.h:174
void ShowColliders(bool value)
Definition sbs.cpp:3355
void Report(const std::string &message, const std::string &prompt)
Definition hal.cpp:219
Ogre::Root * mRoot
Definition hal.h:91
void ClickedObject(bool left, bool shift, bool ctrl, bool alt, bool right, Real scale, bool center_only)
Definition hal.cpp:124
bool keyPressed(const OgreBites::KeyboardEvent &evt)
Definition native.cpp:104
void EnableFreelook(bool value)
Definition native.cpp:699
bool mouseReleased(const OgreBites::MouseButtonEvent &evt)
Definition native.cpp:449
bool touchMoved(const OgreBites::TouchFingerEvent &evt)
Definition native.cpp:480
void GetKeyStates(EngineContext *engine, OgreBites::Keycode &key, bool down)
Definition native.cpp:536
void ProcessMovement(EngineContext *engine, bool control=false, bool shift=false, bool angle_only=false)
Definition native.cpp:632
bool touchPressed(const OgreBites::TouchFingerEvent &evt)
Definition native.cpp:508
bool mousePressed(const OgreBites::MouseButtonEvent &evt)
Definition native.cpp:424
bool keyReleased(const OgreBites::KeyboardEvent &evt)
Definition native.cpp:322
std::filesystem::path GetExeDirectory()
Definition native.cpp:52
bool mouseMoved(const OgreBites::MouseMotionEvent &evt)
Definition native.cpp:342
bool touchReleased(const OgreBites::TouchFingerEvent &evt)
Definition native.cpp:530
bool mouseWheelRolled(const OgreBites::MouseWheelEvent &evt)
Definition native.cpp:463
Ogre::Vector3 Vector3
Definition globals.h:58
Ogre::Real Real
Definition globals.h:57
std::string ToString(int number)
Definition globals.cpp:279
std::string settingsPath()