// // Lol Engine // // Copyright: (c) 2010-2013 Sam Hocevar // 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. // #include #if HAVE_EMSCRIPTEN_H # include #endif #include "lolgl.h" #if _XBOX # include "platform/xbox/xboxapp.h" #elif __native_client__ # include "platform/nacl/nacl-app.h" #elif __ANDROID__ # include "platform/android/androidapp.h" #elif USE_SDL || USE_OLD_SDL # include "platform/sdl/sdlapp.h" # include "platform/sdl/sdlinput.h" #elif HAVE_GLES_2X # include "eglapp.h" #endif namespace lol { //----------------------------------------------------------------------------- class ApplicationDisplayData { friend class ApplicationDisplay; ApplicationDisplayData(char const *name, ivec2 resolution) : display(name, resolution) { } protected: void SetResolution(ivec2 resolution) { display.SetResolution(resolution); } void SetPosition(ivec2 position) { display.SetPosition(position); } void Enable() { display.Enable(); } void Disable() { display.Disable(); } #if _XBOX //NOT HANDLED YET #elif __native_client__ //NOT HANDLED YET #elif __ANDROID__ //NOT HANDLED YET #elif USE_SDL || USE_OLD_SDL SdlAppDisplay display; #elif HAVE_GLES_2X /* FIXME: this macro is only deactivated if we include "lolgl.h" */ //NOT HANDLED YET #else # error No application class available on this platform #endif }; ApplicationDisplay::ApplicationDisplay(char const *name, ivec2 resolution) { data = new ApplicationDisplayData(name, resolution); } ApplicationDisplay::~ApplicationDisplay() { delete data; } void ApplicationDisplay::SetResolution(ivec2 resolution) { super::SetResolution(resolution); data->SetResolution(resolution); } void ApplicationDisplay::SetPosition(ivec2 position) { super::SetPosition(position); data->SetPosition(position); } void ApplicationDisplay::Enable() { super::Enable(); data->Enable(); } void ApplicationDisplay::Disable() { data->Disable(); super::Disable(); } //----------------------------------------------------------------------------- class ApplicationData { friend class Application; ApplicationData(char const *name, ivec2 resolution, float framerate) : app(name, resolution, framerate) { } #if _XBOX XboxApp app; #elif __native_client__ NaClApp app; #elif __ANDROID__ AndroidApp app; #elif USE_SDL || USE_OLD_SDL SdlApp app; #elif HAVE_GLES_2X /* FIXME: this macro is only deactivated if we include "lolgl.h" */ EglApp app; #else # error No application class available on this platform #endif }; #if EMSCRIPTEN static Application *g_app; static void AppCallback() { g_app->Tick(); } #endif /* * Public Application class */ Application::Application(char const *name, ivec2 resolution, float framerate) { SceneDisplay::Add(new ApplicationDisplay(name, resolution)); data = new ApplicationData(name, resolution, framerate); g_world.ExecLuaFile("lua/init.lua"); } bool Application::MustTick() { return !Ticker::Finished(); } void Application::Tick() { data->app.Tick(); } void Application::Run() { #if EMSCRIPTEN g_app = this; emscripten_set_main_loop(AppCallback, 0, 1); #else while (MustTick()) Tick(); #endif } void Application::ShowPointer(bool show) { data->app.ShowPointer(show); } Application::~Application() { delete data; } } /* namespace lol */