This lets us get rid of m_autorelease and m_destroy and we’ll be able to implement init_game/init_draw later, for stuff that must happen on the render thread.legacy
| @@ -2,7 +2,7 @@ | |||
| // Lol Engine — Bullet physics test | |||
| // | |||
| // Copyright © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||
| // © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
| // © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| @@ -134,7 +134,7 @@ std::string EasyCharacterController::GetName() | |||
| //Physic Tick | |||
| void EasyCharacterController::tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| //Send final velocity in Bullet | |||
| { | |||
| @@ -2,7 +2,7 @@ | |||
| // Lol Engine — Bullet physics test | |||
| // | |||
| // Copyright © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||
| // © 2012—2018 Sam Hocevar <sam@hocevar.net> | |||
| // © 2012—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| @@ -33,7 +33,7 @@ namespace phys | |||
| { | |||
| class EasyCharacterController : public EasyPhysic, | |||
| public Entity | |||
| public entity | |||
| { | |||
| friend class Simulation; | |||
| @@ -2,7 +2,7 @@ | |||
| // Lol Engine — Bullet physics test | |||
| // | |||
| // Copyright © 2009—2013 Benjamin “Touky” Huet <huet.benjamin@gmail.com> | |||
| // © 2012—2018 Sam Hocevar <sam@hocevar.net> | |||
| // © 2012—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| @@ -65,7 +65,7 @@ struct RayCastResult | |||
| unsigned int m_flags; //??? | |||
| }; | |||
| class Simulation : public Entity | |||
| class Simulation : public entity | |||
| { | |||
| public: | |||
| Simulation() : | |||
| @@ -111,7 +111,7 @@ public: | |||
| virtual void tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| //step the simulation | |||
| if (m_dynamics_world) | |||
| @@ -73,7 +73,7 @@ protected: | |||
| #if __ANDROID__ | |||
| //NOT HANDLED YET | |||
| #elif LOL_USE_SDL | |||
| SdlAppDisplay display; | |||
| sdl::app_display display; | |||
| #elif HAVE_GLES_2X | |||
| /* FIXME: this macro is only deactivated if we include "lolgl.h" */ | |||
| //NOT HANDLED YET | |||
| @@ -137,7 +137,7 @@ class ApplicationData | |||
| #if __ANDROID__ | |||
| AndroidApp app; | |||
| #elif LOL_USE_SDL | |||
| SdlApp app; | |||
| sdl::app app; | |||
| #elif HAVE_GLES_2X | |||
| /* FIXME: this macro is only deactivated if we include "lolgl.h" */ | |||
| EglApp app; | |||
| @@ -31,24 +31,9 @@ namespace lol | |||
| { | |||
| /* | |||
| * SDL App display implementation class | |||
| * Public sdl::app_display class | |||
| */ | |||
| class SdlAppDisplayData | |||
| { | |||
| friend class SdlAppDisplay; | |||
| private: | |||
| #if LOL_USE_SDL | |||
| SDL_Window *m_window; | |||
| SDL_GLContext m_glcontext; | |||
| #endif | |||
| }; | |||
| /* | |||
| * Public SdlApp class | |||
| */ | |||
| SdlAppDisplay::SdlAppDisplay(char const *title, ivec2 res) | |||
| : data(new SdlAppDisplayData()) | |||
| sdl::app_display::app_display(char const *title, ivec2 res) | |||
| { | |||
| #if LOL_USE_SDL | |||
| ivec2 window_size = res; | |||
| @@ -70,72 +55,70 @@ SdlAppDisplay::SdlAppDisplay(char const *title, ivec2 res) | |||
| int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE; | |||
| if (window_size == ivec2(0)) | |||
| flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; | |||
| data->m_window = SDL_CreateWindow(title, | |||
| m_window = SDL_CreateWindow(title, | |||
| SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, | |||
| window_size.x, window_size.y, flags); | |||
| if (!data->m_window) | |||
| if (!m_window) | |||
| { | |||
| msg::error("cannot create rendering window: %s\n", SDL_GetError()); | |||
| SDL_Quit(); | |||
| exit(EXIT_FAILURE); | |||
| } | |||
| SDL_GetWindowSize(data->m_window, &res.x, &res.y); | |||
| SDL_GetWindowSize(m_window, &res.x, &res.y); | |||
| data->m_glcontext = SDL_GL_CreateContext(data->m_window); | |||
| m_glcontext = SDL_GL_CreateContext(m_window); | |||
| /* Initialise everything */ | |||
| Video::Setup(res); //TODO ?? Should it be here ? | |||
| #endif | |||
| } | |||
| SdlAppDisplay::~SdlAppDisplay() | |||
| sdl::app_display::~app_display() | |||
| { | |||
| #if LOL_USE_SDL | |||
| if (data->m_window) | |||
| if (m_window) | |||
| { | |||
| SDL_GL_DeleteContext(data->m_glcontext); | |||
| SDL_DestroyWindow(data->m_window); | |||
| SDL_GL_DeleteContext(m_glcontext); | |||
| SDL_DestroyWindow(m_window); | |||
| } | |||
| #endif | |||
| delete data; | |||
| } | |||
| ivec2 SdlAppDisplay::resolution() const | |||
| ivec2 sdl::app_display::resolution() const | |||
| { | |||
| ivec2 ret(0); | |||
| #if LOL_USE_SDL | |||
| SDL_GetWindowSize(data->m_window, &ret.x, &ret.y); | |||
| SDL_GetWindowSize(m_window, &ret.x, &ret.y); | |||
| #endif | |||
| return ret; | |||
| } | |||
| void SdlAppDisplay::set_resolution(ivec2 resolution) | |||
| void sdl::app_display::set_resolution(ivec2 resolution) | |||
| { | |||
| #if LOL_USE_SDL | |||
| SDL_SetWindowSize(data->m_window, resolution.x, resolution.y); | |||
| SDL_SetWindowSize(m_window, resolution.x, resolution.y); | |||
| #endif | |||
| } | |||
| void SdlAppDisplay::SetPosition(ivec2 position) | |||
| void sdl::app_display::SetPosition(ivec2 position) | |||
| { | |||
| #if LOL_USE_SDL | |||
| SDL_SetWindowPosition(data->m_window, position.x, position.y); | |||
| SDL_SetWindowPosition(m_window, position.x, position.y); | |||
| #endif | |||
| } | |||
| void SdlAppDisplay::Enable() | |||
| void sdl::app_display::Enable() | |||
| { | |||
| #if LOL_USE_SDL | |||
| //TODO: Should we do that: ? | |||
| SDL_GL_MakeCurrent(data->m_window, data->m_glcontext); | |||
| SDL_GL_MakeCurrent(m_window, m_glcontext); | |||
| #endif | |||
| } | |||
| void SdlAppDisplay::Disable() | |||
| void sdl::app_display::Disable() | |||
| { | |||
| #if LOL_USE_SDL | |||
| SDL_GL_SwapWindow(data->m_window); | |||
| SDL_GL_SwapWindow(m_window); | |||
| #endif | |||
| } | |||
| @@ -152,24 +135,9 @@ const char* SceneDisplay::GetPhysicalName(int index) | |||
| #endif | |||
| /* | |||
| * SDL App implementation class | |||
| */ | |||
| class SdlAppData | |||
| { | |||
| friend class SdlApp; | |||
| private: | |||
| #if LOL_USE_SDL | |||
| SDL_Window *m_window; | |||
| SDL_GLContext m_glcontext; | |||
| #endif | |||
| }; | |||
| /* | |||
| * Public SdlApp class | |||
| * Public sdl::app class | |||
| */ | |||
| SdlApp::SdlApp(char const *title, ivec2 res, float fps) : | |||
| data(new SdlAppData()) | |||
| sdl::app::app(char const *title, ivec2 res, float fps) | |||
| { | |||
| UNUSED(title); | |||
| #if LOL_USE_SDL | |||
| @@ -189,25 +157,24 @@ SdlApp::SdlApp(char const *title, ivec2 res, float fps) : | |||
| #endif | |||
| } | |||
| void SdlApp::ShowPointer(bool show) | |||
| void sdl::app::ShowPointer(bool show) | |||
| { | |||
| #if LOL_USE_SDL | |||
| SDL_ShowCursor(show ? 1 : 0); | |||
| #endif | |||
| } | |||
| void SdlApp::Tick() | |||
| void sdl::app::Tick() | |||
| { | |||
| /* Tick the renderer, show the frame and clamp to desired framerate. */ | |||
| Ticker::tick_draw(); | |||
| } | |||
| SdlApp::~SdlApp() | |||
| sdl::app::~app() | |||
| { | |||
| #if LOL_USE_SDL | |||
| SDL_Quit(); | |||
| #endif | |||
| delete data; | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -1,11 +1,13 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #pragma once | |||
| @@ -17,19 +19,37 @@ | |||
| #include <lol/math/vector.h> | |||
| #if LOL_USE_SDL | |||
| # if HAVE_SDL2_SDL_H | |||
| # include <SDL2/SDL.h> | |||
| # elif HAVE_SDL_H | |||
| # include <SDL.h> | |||
| # endif | |||
| #endif | |||
| namespace lol | |||
| { | |||
| //----------------------------------------------------------------------------- | |||
| class SdlAppDisplayData; | |||
| namespace sdl | |||
| { | |||
| class app | |||
| { | |||
| public: | |||
| app(char const *title, ivec2 res, float fps); | |||
| virtual ~app(); | |||
| void ShowPointer(bool show); | |||
| void Tick(); | |||
| }; | |||
| class SdlAppDisplay | |||
| class app_display | |||
| { | |||
| friend class ApplicationDisplay; | |||
| public: | |||
| SdlAppDisplay(char const *title, ivec2 resolution); | |||
| virtual ~SdlAppDisplay(); | |||
| app_display(char const *title, ivec2 resolution); | |||
| virtual ~app_display(); | |||
| protected: | |||
| virtual void set_resolution(ivec2 resolution); | |||
| @@ -41,24 +61,13 @@ protected: | |||
| void Disable(); | |||
| private: | |||
| SdlAppDisplayData *data; | |||
| #if LOL_USE_SDL | |||
| SDL_Window *m_window; | |||
| SDL_GLContext m_glcontext; | |||
| #endif | |||
| }; | |||
| //----------------------------------------------------------------------------- | |||
| class SdlAppData; | |||
| class SdlApp | |||
| { | |||
| public: | |||
| SdlApp(char const *title, ivec2 res, float fps); | |||
| virtual ~SdlApp(); | |||
| void ShowPointer(bool show); | |||
| void Tick(); | |||
| private: | |||
| SdlAppData *data; | |||
| }; | |||
| } /* namespace sdl */ | |||
| } /* namespace lol */ | |||
| @@ -95,7 +95,7 @@ sample::~sample() | |||
| void sample::tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| } | |||
| std::string sample::GetName() const | |||
| @@ -1,11 +1,13 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #include <lol/engine-internal.h> | |||
| @@ -52,7 +54,7 @@ DebugFps::DebugFps(int x, int y) | |||
| void DebugFps::tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| char buf[1024]; | |||
| @@ -1,11 +1,13 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #pragma once | |||
| @@ -22,7 +24,7 @@ namespace lol | |||
| class DebugFpsData; | |||
| class DebugFps : public Entity | |||
| class DebugFps : public entity | |||
| { | |||
| public: | |||
| DebugFps(int x, int y); | |||
| @@ -61,12 +61,12 @@ DebugRecord::DebugRecord(std::string const &path, float fps) | |||
| void DebugRecord::tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| } | |||
| void DebugRecord::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| Entity::tick_draw(seconds, scene); | |||
| entity::tick_draw(seconds, scene); | |||
| ivec2 size = Video::GetSize(); | |||
| @@ -1,7 +1,7 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| @@ -24,7 +24,7 @@ namespace lol | |||
| class DebugRecordData; | |||
| class DebugRecord : public Entity | |||
| class DebugRecord : public entity | |||
| { | |||
| public: | |||
| DebugRecord(std::string const &path, float fps); | |||
| @@ -45,7 +45,7 @@ DebugStats::DebugStats(char const *path) | |||
| void DebugStats::tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| fprintf(data->fp, "%i %f %f %f %f\n", | |||
| Ticker::GetFrameNum(), | |||
| @@ -1,11 +1,13 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #pragma once | |||
| @@ -22,7 +24,7 @@ namespace lol | |||
| class DebugStatsData; | |||
| class DebugStats : public Entity | |||
| class DebugStats : public entity | |||
| { | |||
| public: | |||
| DebugStats(char const *path); | |||
| @@ -1,11 +1,13 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #include <lol/engine-internal.h> | |||
| @@ -61,12 +63,12 @@ void Emitter::tick_game(float seconds) | |||
| } | |||
| } | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| } | |||
| void Emitter::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| Entity::tick_draw(seconds, scene); | |||
| entity::tick_draw(seconds, scene); | |||
| for (int i = 0; i < data->nparticles; i++) | |||
| scene.AddTile(data->tileset, data->particles[i], | |||
| @@ -1,11 +1,13 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #pragma once | |||
| @@ -23,7 +25,7 @@ namespace lol | |||
| class EmitterData; | |||
| class Emitter : public Entity | |||
| class Emitter : public entity | |||
| { | |||
| public: | |||
| Emitter(TileSet *tileset, vec3 gravity); | |||
| @@ -18,13 +18,10 @@ namespace lol | |||
| { | |||
| /* | |||
| * Public Entity class | |||
| * Public entity class | |||
| */ | |||
| Entity::Entity() : | |||
| m_initstate(InitState::Ready), | |||
| m_ref(0), | |||
| m_destroy(0) | |||
| entity::entity() | |||
| { | |||
| #if !LOL_BUILD_RELEASE | |||
| m_tickstate = tickable::state::idle; | |||
| @@ -36,28 +33,20 @@ Entity::Entity() : | |||
| Ticker::Register(this); | |||
| } | |||
| Entity::~Entity() | |||
| entity::~entity() | |||
| { | |||
| #if !LOL_BUILD_RELEASE | |||
| if (!m_destroy) | |||
| if (!has_flags(flags::destroying)) | |||
| msg::error("entity destructor called directly\n"); | |||
| #endif | |||
| } | |||
| std::string Entity::GetName() const | |||
| std::string entity::GetName() const | |||
| { | |||
| return "<entity>"; | |||
| } | |||
| void Entity::InitGame() | |||
| { | |||
| } | |||
| void Entity::InitDraw() | |||
| { | |||
| } | |||
| void Entity::tick_game(float seconds) | |||
| void entity::tick_game(float seconds) | |||
| { | |||
| UNUSED(seconds); | |||
| #if !LOL_BUILD_RELEASE | |||
| @@ -67,7 +56,7 @@ void Entity::tick_game(float seconds) | |||
| #endif | |||
| } | |||
| void Entity::tick_draw(float seconds, Scene &scene) | |||
| void entity::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| UNUSED(seconds, scene); | |||
| #if !LOL_BUILD_RELEASE | |||
| @@ -13,7 +13,7 @@ | |||
| #pragma once | |||
| // | |||
| // The Entity class | |||
| // The entity class | |||
| // ---------------- | |||
| // Entities are objects that can be ticked by the game loop and/or the render | |||
| // loop. Entities are implemented as one or several linked lists. See the | |||
| @@ -27,23 +27,7 @@ | |||
| namespace lol | |||
| { | |||
| struct InitState | |||
| { | |||
| enum Value | |||
| { | |||
| Unknown, | |||
| Error, | |||
| NeedInitDraw, | |||
| NeedInitGame, | |||
| Ready, | |||
| } | |||
| m_value; | |||
| inline InitState(Value v) : m_value(v) {} | |||
| inline operator Value() { return m_value; } | |||
| }; | |||
| class Entity | |||
| class entity | |||
| { | |||
| friend class Scene; | |||
| friend class ticker; | |||
| @@ -52,22 +36,33 @@ class Entity | |||
| public: | |||
| virtual std::string GetName() const; | |||
| inline bool IsTicked() { return !!m_ref && !m_autorelease; } | |||
| protected: | |||
| Entity(); | |||
| virtual ~Entity(); | |||
| inline bool IsTicked() { return !!m_ref && !has_flags(flags::autorelease); } | |||
| inline int IsDestroying() { return m_destroy; } | |||
| enum class flags : uint16_t | |||
| { | |||
| none = 0, | |||
| init_game = 1 << 0, | |||
| init_draw = 1 << 1, | |||
| fini_game = 1 << 2, | |||
| fini_draw = 1 << 4, | |||
| destroying = 1 << 5, | |||
| autorelease = 1 << 6, | |||
| }; | |||
| inline void add_flags(flags f); | |||
| inline void remove_flags(flags f); | |||
| inline bool has_flags(flags f); | |||
| protected: | |||
| entity(); | |||
| virtual ~entity(); | |||
| virtual void InitGame(); | |||
| virtual void InitDraw(); | |||
| virtual bool init_game() { return true; } | |||
| virtual bool init_draw() { return true; } | |||
| virtual void tick_game(float seconds); | |||
| virtual void tick_draw(float seconds, class Scene &scene); | |||
| /* The initialisation state */ | |||
| InitState m_initstate; | |||
| #if !LOL_BUILD_RELEASE | |||
| tickable::state m_tickstate; | |||
| #endif | |||
| @@ -76,10 +71,30 @@ protected: | |||
| tickable::group::draw m_drawgroup; | |||
| private: | |||
| int m_ref, m_autorelease, m_destroy; | |||
| flags m_flags = flags::none; | |||
| int m_ref = 0; | |||
| uint64_t m_scene_mask = 0; | |||
| }; | |||
| static inline entity::flags operator |(entity::flags a, entity::flags b) | |||
| { | |||
| return (entity::flags)((uint16_t)a | (uint16_t)b); | |||
| } | |||
| static inline entity::flags operator &(entity::flags a, entity::flags b) | |||
| { | |||
| return (entity::flags)((uint16_t)a & (uint16_t)b); | |||
| } | |||
| static inline entity::flags operator ^(entity::flags a, entity::flags b) | |||
| { | |||
| return (entity::flags)((uint16_t)a ^ (uint16_t)b); | |||
| } | |||
| inline void entity::add_flags(entity::flags f) { m_flags = m_flags | f; } | |||
| inline void entity::remove_flags(entity::flags f) { m_flags = (m_flags | f) ^ f; } | |||
| inline bool entity::has_flags(entity::flags f) { return (m_flags & f) != flags::none; } | |||
| template<typename T> struct entity_dict | |||
| { | |||
| T *get(std::string const &key) | |||
| @@ -106,5 +121,8 @@ template<typename T> struct entity_dict | |||
| std::map<T*, std::string> m_cache2; | |||
| }; | |||
| // The old API | |||
| typedef entity Entity; | |||
| } /* namespace lol */ | |||
| @@ -62,8 +62,8 @@ private: | |||
| std::unordered_set<std::shared_ptr<tickable>> m_tickables; | |||
| /* Entity management */ | |||
| array<Entity *> DEPRECATED_m_todolist, DEPRECATED_m_todolist_delayed, DEPRECATED_m_autolist; | |||
| array<Entity *> DEPRECATED_m_list[(int)tickable::group::all::end]; | |||
| array<entity *> DEPRECATED_m_todolist, DEPRECATED_m_todolist_delayed, DEPRECATED_m_autolist; | |||
| array<entity *> DEPRECATED_m_list[(int)tickable::group::all::end]; | |||
| array<int> DEPRECATED_m_scenes[(int)tickable::group::all::end]; | |||
| int DEPRECATED_nentities; | |||
| @@ -114,7 +114,7 @@ void ticker::remove(std::shared_ptr<tickable> entity) | |||
| // Old API for entities | |||
| // | |||
| void Ticker::Register(Entity *entity) | |||
| void Ticker::Register(entity *entity) | |||
| { | |||
| /* If we are called from its constructor, the object's vtable is not | |||
| * ready yet, so we do not know which group this entity belongs to. Wait | |||
| @@ -123,22 +123,22 @@ void Ticker::Register(Entity *entity) | |||
| /* Objects are autoreleased by default. Put them in a list. */ | |||
| data->DEPRECATED_m_autolist.push(entity); | |||
| entity->m_autorelease = 1; | |||
| entity->add_flags(entity::flags::autorelease); | |||
| entity->m_ref = 1; | |||
| data->DEPRECATED_nentities++; | |||
| } | |||
| void Ticker::Ref(Entity *entity) | |||
| void Ticker::Ref(entity *entity) | |||
| { | |||
| ASSERT(entity, "dereferencing nullptr entity\n"); | |||
| ASSERT(!entity->m_destroy, | |||
| ASSERT(!entity->has_flags(entity::flags::destroying), | |||
| "referencing entity scheduled for destruction %s\n", | |||
| entity->GetName().c_str()); | |||
| if (entity->m_autorelease) | |||
| if (entity->has_flags(entity::flags::autorelease)) | |||
| { | |||
| /* Get the entity out of the m_autorelease list. This is usually | |||
| /* Get the entity out of the autorelease list. This is usually | |||
| * very fast since the last entry in autolist is the last | |||
| * registered entity. */ | |||
| for (int i = data->DEPRECATED_m_autolist.count(); i--; ) | |||
| @@ -149,19 +149,19 @@ void Ticker::Ref(Entity *entity) | |||
| break; | |||
| } | |||
| } | |||
| entity->m_autorelease = 0; | |||
| entity->remove_flags(entity::flags::autorelease); | |||
| } | |||
| else | |||
| entity->m_ref++; | |||
| } | |||
| int Ticker::Unref(Entity *entity) | |||
| int Ticker::Unref(entity *entity) | |||
| { | |||
| ASSERT(entity, "dereferencing null entity\n"); | |||
| ASSERT(entity->m_ref > 0, "dereferencing unreferenced entity %s\n", | |||
| entity->GetName().c_str()); | |||
| ASSERT(!entity->m_autorelease, "dereferencing autoreleased entity %s\n", | |||
| entity->GetName().c_str()); | |||
| ASSERT(entity->m_ref > 0, | |||
| "dereferencing unreferenced entity %s\n", entity->GetName().c_str()); | |||
| ASSERT(!entity->has_flags(entity::flags::autorelease), | |||
| "dereferencing autoreleased entity %s\n", entity->GetName().c_str()); | |||
| return --entity->m_ref; | |||
| } | |||
| @@ -241,9 +241,9 @@ void ticker_data::GameThreadTick() | |||
| for (int i = 0; i < data->DEPRECATED_m_list[g].count(); ++i) | |||
| { | |||
| Entity *e = data->DEPRECATED_m_list[g][i]; | |||
| entity *e = data->DEPRECATED_m_list[g][i]; | |||
| msg::debug(" \\-- [%p] %s (m_ref %d, destroy %d)\n", | |||
| e, e->GetName().c_str(), e->m_ref, e->m_destroy); | |||
| e, e->GetName().c_str(), e->m_ref, e->has_flags(entity::flags::destroying)); | |||
| } | |||
| } | |||
| #endif | |||
| @@ -292,7 +292,7 @@ void ticker_data::GameThreadTick() | |||
| for (int g = 0; g < (int)tickable::group::all::end && n < data->panic; ++g) | |||
| for (int i = 0; i < data->DEPRECATED_m_list[g].count() && n < data->panic; ++i) | |||
| { | |||
| Entity * e = data->DEPRECATED_m_list[g][i]; | |||
| entity * e = data->DEPRECATED_m_list[g][i]; | |||
| if (e->m_ref) | |||
| { | |||
| #if !LOL_BUILD_RELEASE | |||
| @@ -315,15 +315,15 @@ void ticker_data::GameThreadTick() | |||
| /* Garbage collect objects that can be destroyed. We can do this | |||
| * before inserting awaiting objects, because only objects already | |||
| * in the tick lists can be marked for destruction. */ | |||
| array<Entity*> destroy_list; | |||
| array<entity*> destroy_list; | |||
| bool do_reserve = true; | |||
| for (int g = 0; g < (int)tickable::group::all::end; ++g) | |||
| { | |||
| for (int i = data->DEPRECATED_m_list[g].count(); i--;) | |||
| { | |||
| Entity *e = data->DEPRECATED_m_list[g][i]; | |||
| entity *e = data->DEPRECATED_m_list[g][i]; | |||
| if (e->m_destroy && g < (int)tickable::group::game::end) | |||
| if (e->has_flags(entity::flags::destroying) && g < (int)tickable::group::game::end) | |||
| { | |||
| /* Game tick list: | |||
| * If entity is to be destroyed, remove it */ | |||
| @@ -335,7 +335,7 @@ void ticker_data::GameThreadTick() | |||
| } | |||
| destroy_list.push_unique(e); | |||
| } | |||
| else if (e->m_destroy) | |||
| else if (e->has_flags(entity::flags::destroying)) | |||
| { | |||
| /* Draw tick list: | |||
| * If entity is to be destroyed, | |||
| @@ -360,21 +360,21 @@ void ticker_data::GameThreadTick() | |||
| else | |||
| { | |||
| if (e->m_ref <= 0 && g >= (int)tickable::group::draw::begin) | |||
| e->m_destroy = 1; | |||
| e->add_flags(entity::flags::destroying); | |||
| } | |||
| } | |||
| } | |||
| if (!!destroy_list.count()) | |||
| { | |||
| data->DEPRECATED_nentities -= destroy_list.count(); | |||
| for (Entity* e : destroy_list) | |||
| for (entity* e : destroy_list) | |||
| delete e; | |||
| } | |||
| /* Insert waiting objects into the appropriate lists */ | |||
| while (data->DEPRECATED_m_todolist.count()) | |||
| { | |||
| Entity *e = data->DEPRECATED_m_todolist.last(); | |||
| entity *e = data->DEPRECATED_m_todolist.last(); | |||
| //If the entity has no mask, default it | |||
| if (e->m_scene_mask == 0) | |||
| @@ -404,7 +404,7 @@ void ticker_data::GameThreadTick() | |||
| } | |||
| // Initialize the entity | |||
| e->InitGame(); | |||
| e->init_game(); | |||
| } | |||
| data->DEPRECATED_m_todolist = data->DEPRECATED_m_todolist_delayed; | |||
| @@ -415,8 +415,8 @@ void ticker_data::GameThreadTick() | |||
| { | |||
| for (int i = 0; i < data->DEPRECATED_m_list[g].count() && !data->quit /* Stop as soon as required */; ++i) | |||
| { | |||
| Entity *e = data->DEPRECATED_m_list[g][i]; | |||
| if (!e->m_destroy) | |||
| entity *e = data->DEPRECATED_m_list[g][i]; | |||
| if (!e->has_flags(entity::flags::destroying)) | |||
| { | |||
| #if !LOL_BUILD_RELEASE | |||
| if (e->m_tickstate != tickable::state::idle) | |||
| @@ -468,9 +468,9 @@ void ticker_data::DrawThreadTick() | |||
| for (int i = 0; i < data->DEPRECATED_m_list[g].count() && !data->quit /* Stop as soon as required */; ++i) | |||
| { | |||
| Entity *e = data->DEPRECATED_m_list[g][i]; | |||
| entity *e = data->DEPRECATED_m_list[g][i]; | |||
| if (!e->m_destroy) | |||
| if (!e->has_flags(entity::flags::destroying)) | |||
| { | |||
| #if !LOL_BUILD_RELEASE | |||
| if (e->m_tickstate != tickable::state::idle) | |||
| @@ -506,13 +506,13 @@ void ticker_data::DiskThreadTick() | |||
| ; | |||
| } | |||
| void Ticker::SetState(Entity * /* entity */, uint32_t /* state */) | |||
| void Ticker::SetState(entity * /* entity */, uint32_t /* state */) | |||
| { | |||
| } | |||
| void Ticker::SetStateWhenMatch(Entity * /* entity */, uint32_t /* state */, | |||
| Entity * /* other_entity */, uint32_t /* other_state */) | |||
| void Ticker::SetStateWhenMatch(entity * /* entity */, uint32_t /* state */, | |||
| entity * /* other_entity */, uint32_t /* other_state */) | |||
| { | |||
| } | |||
| @@ -592,7 +592,7 @@ int Ticker::GetFrameNum() | |||
| void Ticker::Shutdown() | |||
| { | |||
| /* We're bailing out. Release all m_autorelease objects. */ | |||
| /* We're bailing out. Release all autorelease objects. */ | |||
| while (data->DEPRECATED_m_autolist.count()) | |||
| { | |||
| data->DEPRECATED_m_autolist.last()->m_ref--; | |||
| @@ -37,9 +37,9 @@ public: | |||
| static void remove(std::shared_ptr<tickable> entity); | |||
| // The old API | |||
| static void Register(class Entity *entity); | |||
| static void Ref(class Entity *entity); | |||
| static int Unref(class Entity *entity); | |||
| static void Register(class entity *entity); | |||
| static void Ref(class entity *entity); | |||
| static int Unref(class entity *entity); | |||
| static void StartBenchmark(); | |||
| static void StopBenchmark(); | |||
| @@ -47,9 +47,9 @@ public: | |||
| static void StopRecording(); | |||
| static int GetFrameNum(); | |||
| static void SetState(class Entity *entity, uint32_t state); | |||
| static void SetStateWhenMatch(class Entity *entity, uint32_t state, | |||
| class Entity *other_entity, uint32_t other_state); | |||
| static void SetState(class entity *entity, uint32_t state); | |||
| static void SetStateWhenMatch(class entity *entity, uint32_t state, | |||
| class entity *other_entity, uint32_t other_state); | |||
| static void Shutdown(); | |||
| static int Finished(); | |||
| @@ -1,7 +1,7 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| @@ -41,12 +41,12 @@ std::string WorldEntity::GetName() const | |||
| void WorldEntity::tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| } | |||
| void WorldEntity::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| Entity::tick_draw(seconds, scene); | |||
| entity::tick_draw(seconds, scene); | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -1,7 +1,7 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| @@ -24,7 +24,7 @@ | |||
| namespace lol | |||
| { | |||
| class WorldEntity : public Entity | |||
| class WorldEntity : public entity | |||
| { | |||
| public: | |||
| virtual std::string GetName() const; | |||
| @@ -71,7 +71,7 @@ Font::~Font() | |||
| void Font::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| Entity::tick_draw(seconds, scene); | |||
| entity::tick_draw(seconds, scene); | |||
| if (data->tileset->GetTexture()) | |||
| { | |||
| @@ -24,7 +24,7 @@ namespace lol | |||
| class FontData; | |||
| class Font : public Entity | |||
| class Font : public entity | |||
| { | |||
| public: | |||
| static Font *create(std::string const &path); | |||
| @@ -34,7 +34,7 @@ protected: | |||
| Font(std::string const &path); | |||
| ~Font(); | |||
| /* Inherited from Entity */ | |||
| /* Inherited from entity */ | |||
| virtual std::string GetName() const; | |||
| virtual void tick_draw(float seconds, Scene &scene); | |||
| @@ -48,12 +48,12 @@ Gradient::Gradient(vec3 aa, vec3 bb) | |||
| void Gradient::tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| } | |||
| void Gradient::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| Entity::tick_draw(seconds, scene); | |||
| entity::tick_draw(seconds, scene); | |||
| float const vertex[] = { m_aabb.aa.x, m_aabb.aa.y, 0.0f, | |||
| m_aabb.bb.x, m_aabb.aa.y, 0.0f, | |||
| @@ -27,7 +27,7 @@ namespace lol | |||
| class sample_data; | |||
| class sample : public Entity | |||
| class sample : public entity | |||
| { | |||
| public: | |||
| static sample *create(std::string const &path); | |||
| @@ -37,7 +37,7 @@ protected: | |||
| sample(std::string const &path); | |||
| virtual ~sample(); | |||
| /* Inherited from Entity */ | |||
| /* Inherited from entity */ | |||
| virtual std::string GetName() const; | |||
| virtual void tick_game(float seconds); | |||
| @@ -211,12 +211,12 @@ Scene& Scene::GetScene(int index) | |||
| return *g_scenes[index]; | |||
| } | |||
| void Scene::Link(Entity* entity) | |||
| void Scene::Link(entity* entity) | |||
| { | |||
| entity->m_scene_mask |= m_mask_id; | |||
| } | |||
| bool Scene::IsRelevant(Entity* entity) | |||
| bool Scene::IsRelevant(entity* entity) | |||
| { | |||
| return !!(entity->m_scene_mask & m_mask_id); | |||
| } | |||
| @@ -121,8 +121,8 @@ public: | |||
| public: | |||
| //TODO: don't like the name | |||
| void Link(Entity* entity); | |||
| bool IsRelevant(Entity* entity); | |||
| void Link(entity* entity); | |||
| bool IsRelevant(entity* entity); | |||
| public: | |||
| Camera* GetCamera(int cam_idx = -1); | |||
| @@ -1,11 +1,13 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #include <lol/engine-internal.h> | |||
| @@ -39,12 +41,12 @@ Sprite::Sprite(TileSet *tileset, int id) | |||
| void Sprite::tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| } | |||
| void Sprite::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| Entity::tick_draw(seconds, scene); | |||
| entity::tick_draw(seconds, scene); | |||
| scene.AddTile(data->tileset, data->id, m_position, vec2(1.0f), 0.0f); | |||
| } | |||
| @@ -95,7 +95,7 @@ ivec2 Text::GetFontSize() | |||
| void Text::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| Entity::tick_draw(seconds, scene); | |||
| entity::tick_draw(seconds, scene); | |||
| if (auto length = data->m_text.length()) | |||
| { | |||
| @@ -1,7 +1,7 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| @@ -33,7 +33,7 @@ enum class TextAlign | |||
| Center, | |||
| }; | |||
| class Text : public Entity | |||
| class Text : public entity | |||
| { | |||
| public: | |||
| Text(std::string const &text, char const *font); | |||
| @@ -91,7 +91,7 @@ void TextureImage::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| super::tick_draw(seconds, scene); | |||
| if (IsDestroying()) | |||
| if (has_flags(entity::flags::destroying)) | |||
| { | |||
| if (m_data->m_image) | |||
| { | |||
| @@ -1,7 +1,7 @@ | |||
| // | |||
| // Lol Engine | |||
| // | |||
| // Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| @@ -33,9 +33,9 @@ namespace lol | |||
| class TextureImageData; | |||
| class TextureImage : public Entity | |||
| class TextureImage : public entity | |||
| { | |||
| typedef Entity super; | |||
| typedef entity super; | |||
| protected: | |||
| virtual TextureImageData* GetNewData(); | |||
| @@ -53,7 +53,7 @@ protected: | |||
| virtual void tick_draw(float seconds, Scene &scene); | |||
| public: | |||
| /* Inherited from Entity */ | |||
| /* Inherited from entity */ | |||
| virtual std::string GetName() const; | |||
| void UpdateTexture(image* img); | |||
| @@ -178,7 +178,7 @@ void TileSet::Init(std::string const &path, Image* image) | |||
| m_data->m_name = "<tileset> " + path; | |||
| } | |||
| //Inherited from Entity ------------------------------------------------------- | |||
| //Inherited from entity ------------------------------------------------------- | |||
| std::string TileSet::GetName() const | |||
| { | |||
| return m_data->m_name; | |||
| @@ -62,7 +62,7 @@ protected: | |||
| virtual void Init(std::string const &path, image* img); | |||
| public: | |||
| /* Inherited from Entity */ | |||
| /* Inherited from entity */ | |||
| virtual std::string GetName() const; | |||
| /* New methods */ | |||
| @@ -87,7 +87,7 @@ D3d9Input::~D3d9Input() | |||
| void D3d9Input::tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| #if defined LOL_USE_XINPUT | |||
| for (int i = 0; i < m_data->m_joysticks.count(); i++) | |||
| @@ -120,7 +120,7 @@ void D3d9Input::tick_game(float seconds) | |||
| void D3d9Input::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| Entity::tick_draw(seconds, scene); | |||
| entity::tick_draw(seconds, scene); | |||
| } | |||
| } /* namespace lol */ | |||
| @@ -1,11 +1,13 @@ | |||
| // | |||
| // Lol Engine | |||
| // Lol Engine | |||
| // | |||
| // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
| // This program is free software; you can redistribute it and/or | |||
| // modify it under the terms of the Do What The Fuck You Want To | |||
| // Public License, Version 2, as published by Sam Hocevar. See | |||
| // http://www.wtfpl.net/ for more details. | |||
| // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
| // | |||
| // Lol Engine is free software. It comes without any warranty, to | |||
| // the extent permitted by applicable law. You can redistribute it | |||
| // and/or modify it under the terms of the Do What the Fuck You Want | |||
| // to Public License, Version 2, as published by the WTFPL Task Force. | |||
| // See http://www.wtfpl.net/ for more details. | |||
| // | |||
| #pragma once | |||
| @@ -22,7 +24,7 @@ namespace lol | |||
| class D3d9InputData; | |||
| class D3d9Input : public Entity | |||
| class D3d9Input : public entity | |||
| { | |||
| public: | |||
| D3d9Input(); | |||
| @@ -41,7 +41,7 @@ | |||
| namespace lol | |||
| { | |||
| class gui : public Entity | |||
| class gui : public entity | |||
| { | |||
| public: | |||
| gui(ImFontAtlas *shared_font_atlas); | |||
| @@ -54,7 +54,7 @@ public: | |||
| static void refresh_fonts(); | |||
| private: | |||
| typedef Entity super; | |||
| typedef entity super; | |||
| protected: | |||
| virtual void tick_game(float seconds); | |||
| @@ -110,7 +110,7 @@ SdlInput::~SdlInput() | |||
| void SdlInput::tick_game(float seconds) | |||
| { | |||
| Entity::tick_game(seconds); | |||
| entity::tick_game(seconds); | |||
| if (!m_tick_in_draw_thread) | |||
| tick(seconds); | |||
| @@ -118,7 +118,7 @@ void SdlInput::tick_game(float seconds) | |||
| void SdlInput::tick_draw(float seconds, Scene &scene) | |||
| { | |||
| Entity::tick_draw(seconds, scene); | |||
| entity::tick_draw(seconds, scene); | |||
| if (m_tick_in_draw_thread) | |||
| tick(seconds); | |||
| @@ -32,7 +32,7 @@ | |||
| namespace lol | |||
| { | |||
| class SdlInput : public Entity | |||
| class SdlInput : public entity | |||
| { | |||
| public: | |||
| /** passing the screen resolution (note: not the windowed app resolution!) allows to make the mouse axis resolution-independent */ | |||