Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

193 строки
3.7 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://www.wtfpl.net/ for more details.
  9. //
  10. #include <lol/engine-internal.h>
  11. #if HAVE_EMSCRIPTEN_H
  12. # include <emscripten.h>
  13. #endif
  14. #include "lolgl.h"
  15. #if _XBOX
  16. # include "platform/xbox/xboxapp.h"
  17. #elif __native_client__
  18. # include "platform/nacl/nacl-app.h"
  19. #elif __ANDROID__
  20. # include "platform/android/androidapp.h"
  21. #elif USE_SDL || USE_OLD_SDL
  22. # include "platform/sdl/sdlapp.h"
  23. # include "platform/sdl/sdlinput.h"
  24. #elif HAVE_GLES_2X
  25. # include "eglapp.h"
  26. #endif
  27. namespace lol
  28. {
  29. //-----------------------------------------------------------------------------
  30. class ApplicationDisplayData
  31. {
  32. friend class ApplicationDisplay;
  33. ApplicationDisplayData(char const *name, ivec2 resolution)
  34. : display(name, resolution)
  35. { }
  36. protected:
  37. void SetResolution(ivec2 resolution)
  38. {
  39. display.SetResolution(resolution);
  40. }
  41. void SetPosition(ivec2 position)
  42. {
  43. display.SetPosition(position);
  44. }
  45. void Enable()
  46. {
  47. display.Enable();
  48. }
  49. void Disable()
  50. {
  51. display.Disable();
  52. }
  53. #if _XBOX
  54. //NOT HANDLED YET
  55. #elif __native_client__
  56. //NOT HANDLED YET
  57. #elif __ANDROID__
  58. //NOT HANDLED YET
  59. #elif USE_SDL || USE_OLD_SDL
  60. SdlAppDisplay display;
  61. #elif HAVE_GLES_2X
  62. /* FIXME: this macro is only deactivated if we include "lolgl.h" */
  63. //NOT HANDLED YET
  64. #else
  65. # error No application class available on this platform
  66. #endif
  67. };
  68. ApplicationDisplay::ApplicationDisplay(char const *name, ivec2 resolution)
  69. {
  70. data = new ApplicationDisplayData(name, resolution);
  71. }
  72. ApplicationDisplay::~ApplicationDisplay()
  73. {
  74. delete data;
  75. }
  76. void ApplicationDisplay::SetResolution(ivec2 resolution)
  77. {
  78. super::SetResolution(resolution);
  79. data->SetResolution(resolution);
  80. }
  81. void ApplicationDisplay::SetPosition(ivec2 position)
  82. {
  83. super::SetPosition(position);
  84. data->SetPosition(position);
  85. }
  86. void ApplicationDisplay::Enable()
  87. {
  88. super::Enable();
  89. data->Enable();
  90. }
  91. void ApplicationDisplay::Disable()
  92. {
  93. data->Disable();
  94. super::Disable();
  95. }
  96. //-----------------------------------------------------------------------------
  97. class ApplicationData
  98. {
  99. friend class Application;
  100. ApplicationData(char const *name, ivec2 resolution, float framerate)
  101. : app(name, resolution, framerate)
  102. { }
  103. #if _XBOX
  104. XboxApp app;
  105. #elif __native_client__
  106. NaClApp app;
  107. #elif __ANDROID__
  108. AndroidApp app;
  109. #elif USE_SDL || USE_OLD_SDL
  110. SdlApp app;
  111. #elif HAVE_GLES_2X
  112. /* FIXME: this macro is only deactivated if we include "lolgl.h" */
  113. EglApp app;
  114. #else
  115. # error No application class available on this platform
  116. #endif
  117. };
  118. #if EMSCRIPTEN
  119. static Application *g_app;
  120. static void AppCallback()
  121. {
  122. g_app->Tick();
  123. }
  124. #endif
  125. /*
  126. * Public Application class
  127. */
  128. Application::Application(char const *name, ivec2 resolution, float framerate)
  129. {
  130. SceneDisplay::Add(new ApplicationDisplay(name, resolution));
  131. data = new ApplicationData(name, resolution, framerate);
  132. g_world.ExecLuaFile("lua/init.lua");
  133. }
  134. bool Application::MustTick()
  135. {
  136. return !Ticker::Finished();
  137. }
  138. void Application::Tick()
  139. {
  140. data->app.Tick();
  141. }
  142. void Application::Run()
  143. {
  144. #if EMSCRIPTEN
  145. g_app = this;
  146. emscripten_set_main_loop(AppCallback, 0, 1);
  147. #else
  148. while (MustTick())
  149. Tick();
  150. #endif
  151. }
  152. void Application::ShowPointer(bool show)
  153. {
  154. data->app.ShowPointer(show);
  155. }
  156. Application::~Application()
  157. {
  158. delete data;
  159. }
  160. } /* namespace lol */