os_haiku.cpp 4.9 KB

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