os_haiku.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #include "servers/visual/visual_server_raster.h"
  2. #include "servers/visual/visual_server_wrap_mt.h"
  3. #include "drivers/gles2/rasterizer_gles2.h"
  4. #include "servers/physics/physics_server_sw.h"
  5. #include "main/main.h"
  6. #include "os_haiku.h"
  7. OS_Haiku::OS_Haiku() {
  8. AudioDriverManagerSW::add_driver(&driver_dummy);
  9. };
  10. void OS_Haiku::run() {
  11. if (!main_loop) {
  12. return;
  13. }
  14. main_loop->init();
  15. window->Show();
  16. window->StartMessageRunner();
  17. /*
  18. while (true) {
  19. // TODO: process events
  20. if (Main::iteration() == true) {
  21. break;
  22. }
  23. }
  24. */
  25. app->Run();
  26. window->StopMessageRunner();
  27. delete app;
  28. main_loop->finish();
  29. }
  30. String OS_Haiku::get_name() {
  31. return "Haiku";
  32. }
  33. int OS_Haiku::get_video_driver_count() const {
  34. return 1;
  35. }
  36. const char* OS_Haiku::get_video_driver_name(int p_driver) const {
  37. return "GLES2";
  38. }
  39. OS::VideoMode OS_Haiku::get_default_video_mode() const {
  40. return OS::VideoMode(800, 600, false);
  41. }
  42. void OS_Haiku::initialize(const VideoMode& p_desired, int p_video_driver, int p_audio_driver) {
  43. main_loop = NULL;
  44. current_video_mode = p_desired;
  45. app = new HaikuApplication();
  46. BRect frame;
  47. frame.Set(50, 50, 50 + current_video_mode.width - 1, 50 + current_video_mode.height - 1);
  48. window = new HaikuDirectWindow(frame);
  49. #if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
  50. context_gl = memnew(ContextGL_Haiku(window));
  51. context_gl->initialize();
  52. rasterizer = memnew(RasterizerGLES2);
  53. #endif
  54. visual_server = memnew(VisualServerRaster(rasterizer));
  55. ERR_FAIL_COND(!visual_server);
  56. //if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) {
  57. // visual_server = memnew(VisualServerWrapMT(visual_server, get_render_thread_mode() == RENDER_SEPARATE_THREAD));
  58. //}
  59. visual_server->init();
  60. physics_server = memnew(PhysicsServerSW);
  61. physics_server->init();
  62. physics_2d_server = memnew(Physics2DServerSW);
  63. physics_2d_server->init();
  64. AudioDriverManagerSW::get_driver(p_audio_driver)->set_singleton();
  65. if (AudioDriverManagerSW::get_driver(p_audio_driver)->init() != OK) {
  66. ERR_PRINT("Initializing audio failed.");
  67. }
  68. sample_manager = memnew(SampleManagerMallocSW);
  69. audio_server = memnew(AudioServerSW(sample_manager));
  70. audio_server->init();
  71. spatial_sound_server = memnew(SpatialSoundServerSW);
  72. spatial_sound_server->init();
  73. spatial_sound_2d_server = memnew(SpatialSound2DServerSW);
  74. spatial_sound_2d_server->init();
  75. input = memnew(InputDefault);
  76. window->SetInput(input);
  77. }
  78. void OS_Haiku::finalize() {
  79. if (main_loop) {
  80. memdelete(main_loop);
  81. }
  82. main_loop = NULL;
  83. spatial_sound_server->finish();
  84. memdelete(spatial_sound_server);
  85. spatial_sound_2d_server->finish();
  86. memdelete(spatial_sound_2d_server);
  87. audio_server->finish();
  88. memdelete(audio_server);
  89. memdelete(sample_manager);
  90. visual_server->finish();
  91. memdelete(visual_server);
  92. memdelete(rasterizer);
  93. physics_server->finish();
  94. memdelete(physics_server);
  95. physics_2d_server->finish();
  96. memdelete(physics_2d_server);
  97. memdelete(input);
  98. #if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
  99. memdelete(context_gl);
  100. #endif
  101. }
  102. void OS_Haiku::set_main_loop(MainLoop* p_main_loop) {
  103. main_loop = p_main_loop;
  104. input->set_main_loop(p_main_loop);
  105. }
  106. MainLoop* OS_Haiku::get_main_loop() const {
  107. return main_loop;
  108. }
  109. void OS_Haiku::delete_main_loop() {
  110. if (main_loop) {
  111. memdelete(main_loop);
  112. }
  113. main_loop = NULL;
  114. }
  115. void OS_Haiku::release_rendering_thread() {
  116. context_gl->release_current();
  117. }
  118. void OS_Haiku::make_rendering_thread() {
  119. context_gl->make_current();
  120. }
  121. bool OS_Haiku::can_draw() const {
  122. // TODO: implement
  123. return true;
  124. }
  125. void OS_Haiku::swap_buffers() {
  126. context_gl->swap_buffers();
  127. }
  128. Point2 OS_Haiku::get_mouse_pos() const {
  129. return window->GetLastMousePosition();
  130. }
  131. int OS_Haiku::get_mouse_button_state() const {
  132. return window->GetLastButtonMask();
  133. }
  134. void OS_Haiku::set_cursor_shape(CursorShape p_shape) {
  135. //ERR_PRINT("set_cursor_shape() NOT IMPLEMENTED");
  136. }
  137. void OS_Haiku::set_window_title(const String& p_title) {
  138. window->SetTitle(p_title.utf8().get_data());
  139. }
  140. Size2 OS_Haiku::get_window_size() const {
  141. ERR_PRINT("get_window_size() NOT IMPLEMENTED");
  142. }
  143. void OS_Haiku::set_video_mode(const VideoMode& p_video_mode, int p_screen) {
  144. ERR_PRINT("set_video_mode() NOT IMPLEMENTED");
  145. }
  146. OS::VideoMode OS_Haiku::get_video_mode(int p_screen) const {
  147. return current_video_mode;
  148. }
  149. void OS_Haiku::get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen) const {
  150. ERR_PRINT("get_fullscreen_mode_list() NOT IMPLEMENTED");
  151. }
  152. String OS_Haiku::get_executable_path() const {
  153. return OS::get_executable_path();
  154. }