summaryrefslogtreecommitdiff
path: root/platform/haiku
diff options
context:
space:
mode:
authorKostadin Damyanov <maxmight@gmail.com>2015-06-11 22:57:41 +0300
committerKostadin Damyanov <maxmight@gmail.com>2015-06-11 22:57:41 +0300
commit8df3e30abd06ce8d51e6b1ad696aabf97ea9f178 (patch)
tree9ebc12296d6d0f3bf68a4debe050066bb9b8936b /platform/haiku
parentf99b72c04f484c39ae728bc175114544a26d7bca (diff)
Haiku: create a GL context and initialize the audio and physics servers
Diffstat (limited to 'platform/haiku')
-rw-r--r--platform/haiku/SCsub6
-rw-r--r--platform/haiku/context_gl_haiku.cpp55
-rw-r--r--platform/haiku/context_gl_haiku.h31
-rw-r--r--platform/haiku/detect.py3
-rw-r--r--platform/haiku/haiku_application.cpp7
-rw-r--r--platform/haiku/haiku_application.h15
-rw-r--r--platform/haiku/haiku_direct_window.cpp45
-rw-r--r--platform/haiku/haiku_direct_window.h27
-rw-r--r--platform/haiku/haiku_gl_view.cpp54
-rw-r--r--platform/haiku/haiku_gl_view.h27
-rw-r--r--platform/haiku/os_haiku.cpp93
-rw-r--r--platform/haiku/os_haiku.h30
12 files changed, 385 insertions, 8 deletions
diff --git a/platform/haiku/SCsub b/platform/haiku/SCsub
index 8ae489cf54..18fa2e2b15 100644
--- a/platform/haiku/SCsub
+++ b/platform/haiku/SCsub
@@ -1,7 +1,11 @@
Import('env')
common_haiku = [
- 'os_haiku.cpp'
+ 'os_haiku.cpp',
+ 'context_gl_haiku.cpp',
+ 'haiku_application.cpp',
+ 'haiku_direct_window.cpp',
+ 'haiku_gl_view.cpp'
]
env.Program(
diff --git a/platform/haiku/context_gl_haiku.cpp b/platform/haiku/context_gl_haiku.cpp
new file mode 100644
index 0000000000..5c82b187b3
--- /dev/null
+++ b/platform/haiku/context_gl_haiku.cpp
@@ -0,0 +1,55 @@
+#include "context_gl_haiku.h"
+
+#if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
+
+ContextGL_Haiku::ContextGL_Haiku(HaikuDirectWindow** p_window, OS::VideoMode& p_default_video_mode) {
+ video_mode = p_default_video_mode;
+
+ uint32 type = BGL_RGB|BGL_DOUBLE|BGL_DEPTH;
+
+ BRect windowRect;
+ windowRect.Set(50, 50, 800, 600);
+
+ window = new HaikuDirectWindow(windowRect);
+ view = new HaikuGLView(window->Bounds(), type);
+
+ *p_window = window;
+}
+
+ContextGL_Haiku::~ContextGL_Haiku() {
+ delete view;
+}
+
+Error ContextGL_Haiku::initialize() {
+ window->AddChild(view);
+ view->LockGL();
+ window->SetHaikuGLView(view);
+ window->InitMessageRunner();
+ window->Show();
+
+ return OK;
+}
+
+void ContextGL_Haiku::release_current() {
+ ERR_PRINT("release_current() NOT IMPLEMENTED");
+}
+
+void ContextGL_Haiku::make_current() {
+ ERR_PRINT("make_current() NOT IMPLEMENTED");
+}
+
+void ContextGL_Haiku::swap_buffers() {
+ view->SwapBuffers();
+}
+
+int ContextGL_Haiku::get_window_width() {
+ // TODO: implement
+ return 800;
+}
+
+int ContextGL_Haiku::get_window_height() {
+ // TODO: implement
+ return 600;
+}
+
+#endif
diff --git a/platform/haiku/context_gl_haiku.h b/platform/haiku/context_gl_haiku.h
new file mode 100644
index 0000000000..16efa8f61d
--- /dev/null
+++ b/platform/haiku/context_gl_haiku.h
@@ -0,0 +1,31 @@
+#ifndef CONTEXT_GL_HAIKU_H
+#define CONTEXT_GL_HAIKU_H
+
+#if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
+
+#include "os/os.h"
+#include "drivers/gl_context/context_gl.h"
+
+#include "haiku_direct_window.h"
+#include "haiku_gl_view.h"
+
+class ContextGL_Haiku : public ContextGL {
+private:
+ HaikuGLView* view;
+ HaikuDirectWindow* window;
+ OS::VideoMode video_mode;
+
+public:
+ ContextGL_Haiku(HaikuDirectWindow** p_window, OS::VideoMode& default_video_mode);
+ ~ContextGL_Haiku();
+
+ virtual Error initialize();
+ virtual void release_current();
+ virtual void make_current();
+ virtual void swap_buffers();
+ virtual int get_window_width();
+ virtual int get_window_height();
+};
+
+#endif
+#endif
diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index 2c15720a92..587148838f 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -50,9 +50,10 @@ def configure(env):
env.Append(CCFLAGS=['-g2', '-Wall','-DDEBUG_ENABLED','-DDEBUG_MEMORY_ENABLED'])
#env.Append(CCFLAGS=['-DFREETYPE_ENABLED'])
+ env.Append(CPPFLAGS = ['-DGLEW_ENABLED'])
env.Append(CPPFLAGS = ['-DOPENGL_ENABLED'])
env.Append(CPPFLAGS = ['-DUNIX_ENABLED', '-DGLES2_ENABLED', '-DGLES_OVER_GL'])
- env.Append(LIBS = ['be', 'GL', 'GLEW', 'z', 'network', 'bnetapi'])
+ env.Append(LIBS = ['be', 'game', 'GL', 'GLEW', 'z', 'network', 'bnetapi'])
import methods
env.Append(BUILDERS = {'GLSL120' : env.Builder(action = methods.build_legacygl_headers, suffix = 'glsl.h',src_suffix = '.glsl')})
diff --git a/platform/haiku/haiku_application.cpp b/platform/haiku/haiku_application.cpp
new file mode 100644
index 0000000000..56024f605d
--- /dev/null
+++ b/platform/haiku/haiku_application.cpp
@@ -0,0 +1,7 @@
+#include "haiku_application.h"
+
+HaikuApplication::HaikuApplication()
+ : BApplication("application/x-vnd.Haiku-GLDirectMode")
+{
+
+}
diff --git a/platform/haiku/haiku_application.h b/platform/haiku/haiku_application.h
new file mode 100644
index 0000000000..995a917d62
--- /dev/null
+++ b/platform/haiku/haiku_application.h
@@ -0,0 +1,15 @@
+#ifndef HAIKU_APPLICATION_H
+#define HAIKU_APPLICATION_H
+
+#include <kernel/image.h> // needed for image_id
+#include <Application.h>
+
+class HaikuApplication : public BApplication
+{
+public:
+ HaikuApplication();
+//private:
+// HaikuDirectWindow* window;
+};
+
+#endif
diff --git a/platform/haiku/haiku_direct_window.cpp b/platform/haiku/haiku_direct_window.cpp
new file mode 100644
index 0000000000..e7f2718278
--- /dev/null
+++ b/platform/haiku/haiku_direct_window.cpp
@@ -0,0 +1,45 @@
+#include "haiku_direct_window.h"
+
+HaikuDirectWindow::HaikuDirectWindow(BRect p_frame)
+ : BDirectWindow(p_frame, "Godot", B_TITLED_WINDOW, 0)
+{
+ // TODO: formatting
+ float minWidth = 0.0f;
+ float maxWidth = 0.0f;
+ float minHeight = 0.0f;
+ float maxHeight = 0.0f;
+
+ GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight);
+ SetSizeLimits(50.0f, maxWidth, 50.0f, maxHeight);
+}
+
+
+HaikuDirectWindow::~HaikuDirectWindow()
+{
+ delete update_runner;
+}
+
+void HaikuDirectWindow::SetHaikuGLView(HaikuGLView* p_view) {
+ view = p_view;
+}
+
+void HaikuDirectWindow::InitMessageRunner() {
+ update_runner = new BMessageRunner(BMessenger(view),
+ new BMessage(REDRAW_MSG), 1000000/60 /* 60 fps */);
+}
+
+
+bool HaikuDirectWindow::QuitRequested()
+{
+ view->EnableDirectMode(false);
+ be_app->PostMessage(B_QUIT_REQUESTED);
+ return true;
+}
+
+
+void HaikuDirectWindow::DirectConnected(direct_buffer_info *info)
+{
+ view->DirectConnected(info);
+ view->EnableDirectMode(true);
+}
+
diff --git a/platform/haiku/haiku_direct_window.h b/platform/haiku/haiku_direct_window.h
new file mode 100644
index 0000000000..450ea64296
--- /dev/null
+++ b/platform/haiku/haiku_direct_window.h
@@ -0,0 +1,27 @@
+#ifndef HAIKU_DIRECT_WINDOW_H
+#define HAIKU_DIRECT_WINDOW_H
+
+#include <kernel/image.h> // needed for image_id
+#include <DirectWindow.h>
+
+#include "haiku_gl_view.h"
+
+#define REDRAW_MSG 'rdrw'
+
+class HaikuDirectWindow : public BDirectWindow
+{
+public:
+ HaikuDirectWindow(BRect p_frame);
+ ~HaikuDirectWindow();
+
+ void SetHaikuGLView(HaikuGLView* p_view);
+ void InitMessageRunner();
+ virtual bool QuitRequested();
+ virtual void DirectConnected(direct_buffer_info *info);
+
+private:
+ HaikuGLView* view;
+ BMessageRunner* update_runner;
+};
+
+#endif
diff --git a/platform/haiku/haiku_gl_view.cpp b/platform/haiku/haiku_gl_view.cpp
new file mode 100644
index 0000000000..61a0120656
--- /dev/null
+++ b/platform/haiku/haiku_gl_view.cpp
@@ -0,0 +1,54 @@
+#include "haiku_gl_view.h"
+
+HaikuGLView::HaikuGLView(BRect frame, uint32 type)
+ : BGLView(frame, "SampleGLView", B_FOLLOW_ALL_SIDES, 0, type), rotate(0)
+{
+ width = frame.right-frame.left;
+ height = frame.bottom-frame.top;
+}
+
+void HaikuGLView::AttachedToWindow(void)
+{
+ LockGL();
+ BGLView::AttachedToWindow();
+ UnlockGL();
+ MakeFocus();
+}
+
+void HaikuGLView::FrameResized(float newWidth, float newHeight)
+{
+}
+
+void HaikuGLView::gDraw(float rotation)
+{
+}
+
+void HaikuGLView::gReshape(int width, int height)
+{
+}
+
+void HaikuGLView::Render(void)
+{
+ LockGL();
+ SwapBuffers();
+ UnlockGL();
+}
+
+void HaikuGLView::MessageReceived(BMessage * msg)
+{
+ switch (msg->what) {
+ case 'rdrw':
+ Render();
+ /* Rotate a bit more */
+ rotate++;
+ break;
+
+ default:
+ BGLView::MessageReceived(msg);
+ }
+}
+
+void HaikuGLView::KeyDown(const char *bytes, int32 numBytes)
+{
+
+}
diff --git a/platform/haiku/haiku_gl_view.h b/platform/haiku/haiku_gl_view.h
new file mode 100644
index 0000000000..44d05fa27f
--- /dev/null
+++ b/platform/haiku/haiku_gl_view.h
@@ -0,0 +1,27 @@
+#ifndef HAIKU_GL_VIEW_H
+#define HAIKU_GL_VIEW_H
+
+#include <kernel/image.h> // needed for image_id
+#include <GLView.h>
+
+class HaikuGLView : public BGLView
+{
+public:
+ HaikuGLView(BRect frame, uint32 type);
+ virtual void AttachedToWindow(void);
+ virtual void FrameResized(float newWidth, float newHeight);
+ virtual void MessageReceived(BMessage * msg);
+ virtual void KeyDown(const char* bytes, int32 numBytes);
+
+ void Render(void);
+
+private:
+ void gDraw(float rotation = 0);
+ void gReshape(int width, int height);
+
+ float width;
+ float height;
+ float rotate;
+};
+
+#endif
diff --git a/platform/haiku/os_haiku.cpp b/platform/haiku/os_haiku.cpp
index fb06413478..bf96cf1716 100644
--- a/platform/haiku/os_haiku.cpp
+++ b/platform/haiku/os_haiku.cpp
@@ -1,14 +1,37 @@
#include "servers/visual/visual_server_raster.h"
#include "servers/visual/visual_server_wrap_mt.h"
#include "drivers/gles2/rasterizer_gles2.h"
+#include "servers/physics/physics_server_sw.h"
+#include "main/main.h"
+
#include "os_haiku.h"
+
OS_Haiku::OS_Haiku() {
-
+ AudioDriverManagerSW::add_driver(&driver_dummy);
};
void OS_Haiku::run() {
- ERR_PRINT("run() NOT IMPLEMENTED");
+ if (!main_loop) {
+ return;
+ }
+
+ main_loop->init();
+
+ /*
+ while (true) {
+ // TODO: process events
+
+ if (Main::iteration() == true) {
+ break;
+ }
+ }
+ */
+
+ app->Run();
+ delete app;
+
+ main_loop->finish();
}
String OS_Haiku::get_name() {
@@ -31,20 +54,44 @@ void OS_Haiku::initialize(const VideoMode& p_desired, int p_video_driver, int p_
main_loop = NULL;
current_video_mode = p_desired;
+ app = new HaikuApplication();
+
#if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
- //context_gl = memnew( ContextGL_X11( x11_display, x11_window,current_videomode, false ) );
- //context_gl->initialize();
+ context_gl = memnew(ContextGL_Haiku(&window, current_video_mode));
+ context_gl->initialize();
rasterizer = memnew(RasterizerGLES2);
#endif
visual_server = memnew(VisualServerRaster(rasterizer));
+ ERR_FAIL_COND(!visual_server);
+
if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) {
visual_server = memnew(VisualServerWrapMT(visual_server, get_render_thread_mode() == RENDER_SEPARATE_THREAD));
}
visual_server->init();
+
+ physics_server = memnew(PhysicsServerSW);
+ physics_server->init();
+ physics_2d_server = memnew(Physics2DServerSW);
+ physics_2d_server->init();
+
+ AudioDriverManagerSW::get_driver(p_audio_driver)->set_singleton();
+
+ if (AudioDriverManagerSW::get_driver(p_audio_driver)->init() != OK) {
+ ERR_PRINT("Initializing audio failed.");
+ }
+
+ sample_manager = memnew(SampleManagerMallocSW);
+ audio_server = memnew(AudioServerSW(sample_manager));
+ audio_server->init();
+
+ spatial_sound_server = memnew(SpatialSoundServerSW);
+ spatial_sound_server->init();
+ spatial_sound_2d_server = memnew(SpatialSound2DServerSW);
+ spatial_sound_2d_server->init();
}
void OS_Haiku::finalize() {
@@ -54,9 +101,29 @@ void OS_Haiku::finalize() {
main_loop = NULL;
+ spatial_sound_server->finish();
+ memdelete(spatial_sound_server);
+
+ spatial_sound_2d_server->finish();
+ memdelete(spatial_sound_2d_server);
+
+ audio_server->finish();
+ memdelete(audio_server);
+ memdelete(sample_manager);
+
visual_server->finish();
memdelete(visual_server);
memdelete(rasterizer);
+
+ physics_server->finish();
+ memdelete(physics_server);
+
+ physics_2d_server->finish();
+ memdelete(physics_2d_server);
+
+#if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
+ memdelete(context_gl);
+#endif
}
void OS_Haiku::set_main_loop(MainLoop* p_main_loop) {
@@ -78,8 +145,21 @@ void OS_Haiku::delete_main_loop() {
main_loop = NULL;
}
+void OS_Haiku::release_rendering_thread() {
+ ERR_PRINT("release_rendering_thread() NOT IMPLEMENTED");
+}
+
+void OS_Haiku::make_rendering_thread() {
+ ERR_PRINT("make_rendering_thread() NOT IMPLEMENTED");
+}
+
bool OS_Haiku::can_draw() const {
- ERR_PRINT("can_draw() NOT IMPLEMENTED");
+ // TODO: implement
+ return true;
+}
+
+void OS_Haiku::swap_buffers() {
+ context_gl->swap_buffers();
}
Point2 OS_Haiku::get_mouse_pos() const {
@@ -95,7 +175,8 @@ void OS_Haiku::set_cursor_shape(CursorShape p_shape) {
}
void OS_Haiku::set_window_title(const String& p_title) {
- ERR_PRINT("set_window_title() NOT IMPLEMENTED");
+ //ERR_PRINT("set_window_title() NOT IMPLEMENTED");
+ window->SetTitle(p_title.utf8().get_data());
}
Size2 OS_Haiku::get_window_size() const {
diff --git a/platform/haiku/os_haiku.h b/platform/haiku/os_haiku.h
index dfe559c969..938983347c 100644
--- a/platform/haiku/os_haiku.h
+++ b/platform/haiku/os_haiku.h
@@ -4,13 +4,39 @@
#include "drivers/unix/os_unix.h"
#include "servers/visual_server.h"
#include "servers/visual/rasterizer.h"
+#include "servers/physics_server.h"
+#include "servers/physics_2d/physics_2d_server_sw.h"
+#include "servers/audio/audio_server_sw.h"
+#include "servers/audio/sample_manager_sw.h"
+#include "servers/spatial_sound/spatial_sound_server_sw.h"
+#include "servers/spatial_sound_2d/spatial_sound_2d_server_sw.h"
+#include "servers/audio/audio_driver_dummy.h"
+
+#include "context_gl_haiku.h"
+#include "haiku_application.h"
+#include "haiku_direct_window.h"
+
class OS_Haiku : public OS_Unix {
private:
+ HaikuApplication* app;
+ HaikuDirectWindow* window;
MainLoop* main_loop;
Rasterizer* rasterizer;
VisualServer* visual_server;
VideoMode current_video_mode;
+ PhysicsServer* physics_server;
+ Physics2DServer* physics_2d_server;
+ AudioServerSW* audio_server;
+ SampleManagerMallocSW* sample_manager;
+ SpatialSoundServerSW* spatial_sound_server;
+ SpatialSound2DServerSW* spatial_sound_2d_server;
+
+ AudioDriverDummy driver_dummy; // TODO: use a real driver
+
+#if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
+ ContextGL_Haiku* context_gl;
+#endif
virtual void delete_main_loop();
@@ -31,7 +57,11 @@ public:
virtual String get_name();
virtual MainLoop* get_main_loop() const;
+
virtual bool can_draw() const;
+ virtual void release_rendering_thread();
+ virtual void make_rendering_thread();
+ virtual void swap_buffers();
virtual Point2 get_mouse_pos() const;
virtual int get_mouse_button_state() const;