From 22fa1be90b4b3601e841079e5469b63fd1debd8b Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Mon, 9 Jul 2018 15:36:13 +0200
Subject: Fix various things for Godot 3

Our upstream code is unmaintained and does not compile.
Rework event management, renderer initialization, haiku support in GLAD.
We now get all the way up to the splash screen without crashing, but the
editor does not start.

diff --git a/platform/haiku/audio_driver_media_kit.cpp b/platform/haiku/audio_driver_media_kit.cpp
index 278a994..e513212 100644
--- a/platform/haiku/audio_driver_media_kit.cpp
+++ b/platform/haiku/audio_driver_media_kit.cpp
@@ -100,7 +100,7 @@ int AudioDriverMediaKit::get_mix_rate() const {
 	return mix_rate;
 }
 
-AudioDriverSW::SpeakerMode AudioDriverMediaKit::get_speaker_mode() const {
+AudioDriverMediaKit::SpeakerMode AudioDriverMediaKit::get_speaker_mode() const {
 	return speaker_mode;
 }
 
diff --git a/platform/haiku/audio_driver_media_kit.h b/platform/haiku/audio_driver_media_kit.h
index a09403e..b743039 100644
--- a/platform/haiku/audio_driver_media_kit.h
+++ b/platform/haiku/audio_driver_media_kit.h
@@ -35,8 +35,8 @@
 #include "core/os/mutex.h"
 #include "core/os/thread.h"
 
-#include <SoundPlayer.h>
 #include <kernel/image.h> // needed for image_id
+#include <SoundPlayer.h>
 
 class AudioDriverMediaKit : public AudioDriver {
 	Mutex *mutex;
diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index 7c62654..407272d 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -64,6 +64,79 @@ def configure(env):
     env["CC"] = "gcc-x86"
     env["CXX"] = "g++-x86"
 
+    ## Dependencies
+
+    if not env['builtin_openssl']:
+        env.ParseConfig('pkg-config openssl --cflags --libs')
+
+    if not env['builtin_libwebp']:
+        env.ParseConfig('pkg-config libwebp --cflags --libs')
+
+    # freetype depends on libpng and zlib, so bundling one of them while keeping others
+    # as shared libraries leads to weird issues
+    if env['builtin_freetype'] or env['builtin_libpng'] or env['builtin_zlib']:
+        env['builtin_freetype'] = True
+        env['builtin_libpng'] = True
+        env['builtin_zlib'] = True
+
+    if not env['builtin_freetype']:
+        env.ParseConfig('pkg-config freetype2 --cflags --libs')
+
+    if not env['builtin_libpng']:
+        env.ParseConfig('pkg-config libpng --cflags --libs')
+
+    if not env['builtin_bullet']:
+        # We need at least version 2.88
+        import subprocess
+        bullet_version = subprocess.check_output(['pkg-config', 'bullet', '--modversion']).strip()
+        if bullet_version < "2.88":
+            # Abort as system bullet was requested but too old
+            print("Bullet: System version {0} does not match minimal requirements ({1}). Aborting.".format(bullet_version, "2.88"))
+            sys.exit(255)
+        env.ParseConfig('pkg-config bullet --cflags --libs')
+
+    if not env['builtin_enet']:
+        env.ParseConfig('pkg-config libenet --cflags --libs')
+
+    if not env['builtin_squish'] and env['tools']:
+        env.ParseConfig('pkg-config libsquish --cflags --libs')
+
+    if not env['builtin_zstd']:
+        env.ParseConfig('pkg-config libzstd --cflags --libs')
+
+    # Sound and video libraries
+    # Keep the order as it triggers chained dependencies (ogg needed by others, etc.)
+
+    if not env['builtin_libtheora']:
+        env['builtin_libogg'] = False  # Needed to link against system libtheora
+        env['builtin_libvorbis'] = False  # Needed to link against system libtheora
+        env.ParseConfig('pkg-config theora theoradec --cflags --libs')
+
+    if not env['builtin_libvpx']:
+        env.ParseConfig('pkg-config vpx --cflags --libs')
+
+    if not env['builtin_libvorbis']:
+        env['builtin_libogg'] = False  # Needed to link against system libvorbis
+        env.ParseConfig('pkg-config vorbis vorbisfile --cflags --libs')
+
+    if not env['builtin_opus']:
+        env['builtin_libogg'] = False  # Needed to link against system opus
+        env.ParseConfig('pkg-config opus opusfile --cflags --libs')
+
+    if not env['builtin_libogg']:
+        env.ParseConfig('pkg-config ogg --cflags --libs')
+
+    if env['builtin_libtheora']:
+        list_of_x86 = ['x86_64', 'x86', 'i386', 'i586']
+        if any(platform.machine() in s for s in list_of_x86):
+            env["x86_libtheora_opt_gcc"] = True
+
+    # On Linux wchar_t should be 32-bits
+    # 16-bit library shouldn't be required due to compiler optimisations
+    if not env['builtin_pcre2']:
+        env.ParseConfig('pkg-config libpcre2-32 --cflags --libs')
+
+
     ## Flags
 
     env.Append(CPPPATH=['#platform/haiku'])
diff --git a/platform/haiku/haiku_application.h b/platform/haiku/haiku_application.h
index f92969b..d8e43d9 100644
--- a/platform/haiku/haiku_application.h
+++ b/platform/haiku/haiku_application.h
@@ -31,8 +31,10 @@
 #ifndef HAIKU_APPLICATION_H
 #define HAIKU_APPLICATION_H
 
+#include <kernel/image.h> // Application.h includes <image.h>, but this
+                          // ends up including the godot header of the same
+						  // name.
 #include <Application.h>
-#include <kernel/image.h> // needed for image_id
 
 class HaikuApplication : public BApplication {
 public:
diff --git a/platform/haiku/haiku_direct_window.cpp b/platform/haiku/haiku_direct_window.cpp
index b234a2f..db15d4d 100644
--- a/platform/haiku/haiku_direct_window.cpp
+++ b/platform/haiku/haiku_direct_window.cpp
@@ -41,10 +41,14 @@ HaikuDirectWindow::HaikuDirectWindow(BRect p_frame) :
 	last_buttons_state = 0;
 	last_button_mask = 0;
 	last_key_modifier_state = 0;
+
+	view = NULL;
+	update_runner = NULL;
+	input = NULL;
+	main_loop = NULL;
 }
 
 HaikuDirectWindow::~HaikuDirectWindow() {
-	delete update_runner;
 }
 
 void HaikuDirectWindow::SetHaikuGLView(HaikuGLView *p_view) {
@@ -53,7 +57,7 @@ void HaikuDirectWindow::SetHaikuGLView(HaikuGLView *p_view) {
 
 void HaikuDirectWindow::StartMessageRunner() {
 	update_runner = new BMessageRunner(BMessenger(this),
-			new BMessage(REDRAW_MSG), 1000000 / 30 /* 30 fps */);
+			new BMessage(REDRAW_MSG), 1000000 / 60 /* 60 fps */);
 }
 
 void HaikuDirectWindow::StopMessageRunner() {
@@ -69,6 +73,7 @@ void HaikuDirectWindow::SetMainLoop(MainLoop *p_main_loop) {
 }
 
 bool HaikuDirectWindow::QuitRequested() {
+	StopMessageRunner();
 	main_loop->notification(MainLoop::NOTIFICATION_WM_QUIT_REQUEST);
 	return false;
 }
@@ -152,39 +157,36 @@ void HaikuDirectWindow::HandleMouseButton(BMessage *message) {
 	}
 	*/
 
-	Ref<InputEvent> mouse_event;
-	mouse_event.type = Ref<InputEvent>::MOUSE_BUTTON;
-	mouse_event.device = 0;
+	Ref<InputEventMouseButton> mouse_event;
+	mouse_event.instance();
 
-	mouse_event.mouse_button.mod = GetKeyModifierState(modifiers);
-	mouse_event->get_button_mask() = GetMouseButtonState(buttons);
-	mouse_event->get_position().x = where.x;
-	mouse_event->get_position().y = where.y;
-	mouse_event.mouse_button.global_x = where.x;
-	mouse_event.mouse_button.global_y = where.y;
+	mouse_event->set_button_mask(GetMouseButtonState(buttons));
+	mouse_event->set_position({where.x, where.y});
+	mouse_event->set_global_position({where.x, where.y});
+	GetKeyModifierState(mouse_event, modifiers);
 
 	switch (button) {
 		default:
 		case B_PRIMARY_MOUSE_BUTTON:
-			mouse_event->get_button_index() = 1;
+			mouse_event->set_button_index(1);
 			break;
 
 		case B_SECONDARY_MOUSE_BUTTON:
-			mouse_event->get_button_index() = 2;
+			mouse_event->set_button_index(2);
 			break;
 
 		case B_TERTIARY_MOUSE_BUTTON:
-			mouse_event->get_button_index() = 3;
+			mouse_event->set_button_index(3);
 			break;
 	}
 
-	mouse_event->is_pressed() = (message->what == B_MOUSE_DOWN);
+	mouse_event->set_pressed(message->what == B_MOUSE_DOWN);
 
 	if (message->what == B_MOUSE_DOWN && mouse_event->get_button_index() == 1) {
 		int32 clicks = message->FindInt32("clicks");
 
 		if (clicks > 1) {
-			mouse_event.mouse_button.doubleclick = true;
+			mouse_event->set_doubleclick(true);
 		}
 	}
 
@@ -208,22 +210,18 @@ void HaikuDirectWindow::HandleMouseMoved(BMessage *message) {
 
 	Point2i rel = pos - last_mouse_position;
 
-	Ref<InputEvent> motion_event;
-	motion_event.type = Ref<InputEvent>::MOUSE_MOTION;
-	motion_event.device = 0;
+	Ref<InputEventMouseMotion> motion_event;
+	motion_event.instance();
+	GetKeyModifierState(motion_event, modifiers);
 
-	motion_event.mouse_motion.mod = GetKeyModifierState(modifiers);
-	motion_event->get_button_mask() = GetMouseButtonState(buttons);
-	motion_event.mouse_motion.x = pos.x;
-	motion_event.mouse_motion.y = pos.y;
+	motion_event->set_button_mask(GetMouseButtonState(buttons));
+	motion_event->set_position({pos.x, pos.y});
 	input->set_mouse_position(pos);
-	motion_event.mouse_motion.global_x = pos.x;
-	motion_event.mouse_motion.global_y = pos.y;
-	motion_event.mouse_motion.speed_x = input->get_last_mouse_speed().x;
-	motion_event.mouse_motion.speed_y = input->get_last_mouse_speed().y;
+	motion_event->set_global_position({pos.x, pos.y});
+	motion_event->set_speed({input->get_last_mouse_speed().x,
+		input->get_last_mouse_speed().y});
 
-	motion_event->get_relative().x = rel.x;
-	motion_event->get_relative().y = rel.y;
+	motion_event->set_relative({rel.x, rel.y});
 
 	last_mouse_position = pos;
 
@@ -236,22 +234,21 @@ void HaikuDirectWindow::HandleMouseWheelChanged(BMessage *message) {
 		return;
 	}
 
-	Ref<InputEvent> mouse_event;
-	mouse_event.type = Ref<InputEvent>::MOUSE_BUTTON;
-	mouse_event.device = 0;
+	Ref<InputEventMouseButton> mouse_event;
+	mouse_event.instance();
+	//GetKeyModifierState(mouse_event, modifiers);
 
-	mouse_event->get_button_index() = wheel_delta_y < 0 ? 4 : 5;
-	mouse_event.mouse_button.mod = GetKeyModifierState(last_key_modifier_state);
-	mouse_event->get_button_mask() = last_button_mask;
-	mouse_event->get_position().x = last_mouse_position.x;
-	mouse_event->get_position().y = last_mouse_position.y;
-	mouse_event.mouse_button.global_x = last_mouse_position.x;
-	mouse_event.mouse_button.global_y = last_mouse_position.y;
+	mouse_event->set_button_index(wheel_delta_y < 0 ? 4 : 5);
+	mouse_event->set_button_mask(last_button_mask);
+	mouse_event->set_position({last_mouse_position.x,
+		last_mouse_position.y});
+	mouse_event->set_global_position({last_mouse_position.x,
+		last_mouse_position.y});
 
-	mouse_event->is_pressed() = true;
+	mouse_event->set_pressed(true);
 	input->parse_input_event(mouse_event);
 
-	mouse_event->is_pressed() = false;
+	mouse_event->set_pressed(false);
 	input->parse_input_event(mouse_event);
 }
 
@@ -272,24 +269,23 @@ void HaikuDirectWindow::HandleKeyboardEvent(BMessage *message) {
 		return;
 	}
 
-	Ref<InputEvent> event;
-	event.type = Ref<InputEvent>::KEY;
-	event.device = 0;
-	event.key.mod = GetKeyModifierState(modifiers);
-	event->is_pressed() = (message->what == B_KEY_DOWN);
-	event->get_scancode() = KeyMappingHaiku::get_keysym(raw_char, key);
-	event->is_echo() = message->HasInt32("be:key_repeat");
-	event.key.unicode = 0;
+	Ref<InputEventKey> event;
+	event.instance();
+	GetKeyModifierState(event, modifiers);
+	event->set_pressed(message->what == B_KEY_DOWN);
+	event->set_scancode(KeyMappingHaiku::get_keysym(raw_char, key));
+	event->set_echo(message->HasInt32("be:key_repeat"));
+	event->set_unicode(0);
 
 	const char *bytes = NULL;
 	if (message->FindString("bytes", &bytes) == B_OK) {
-		event.key.unicode = BUnicodeChar::FromUTF8(&bytes);
+		event->set_unicode(BUnicodeChar::FromUTF8(&bytes));
 	}
 
 	//make it consistent across platforms.
 	if (event->get_scancode() == KEY_BACKTAB) {
-		event->get_scancode() = KEY_TAB;
-		event->get_shift() = true;
+		event->set_scancode(KEY_TAB);
+		event->set_shift(true);
 	}
 
 	input->parse_input_event(event);
@@ -309,14 +305,14 @@ void HaikuDirectWindow::HandleKeyboardModifierEvent(BMessage *message) {
 
 	int32 key = old_modifiers ^ modifiers;
 
-	Ref<InputEvent> event;
-	event.type = Ref<InputEvent>::KEY;
-	event.device = 0;
-	event.key.mod = GetKeyModifierState(modifiers);
-	event->is_pressed() = ((modifiers & key) != 0);
-	event->get_scancode() = KeyMappingHaiku::get_modifier_keysym(key);
-	event->is_echo() = false;
-	event.key.unicode = 0;
+	Ref<InputEventWithModifiers> event;
+	event.instance();
+	GetKeyModifierState(event, modifiers);
+
+	event->set_shift(key & B_SHIFT_KEY);
+	event->set_alt(key & B_OPTION_KEY);
+	event->set_control(key & B_CONTROL_KEY);
+	event->set_command(key & B_COMMAND_KEY);
 
 	input->parse_input_event(event);
 }
@@ -333,18 +329,17 @@ void HaikuDirectWindow::HandleWindowResized(BMessage *message) {
 	current_video_mode->height = height;
 }
 
-inline InputModifierState HaikuDirectWindow::GetKeyModifierState(uint32 p_state) {
-	last_key_modifier_state = p_state;
-	InputModifierState state;
 
-	state.shift = (p_state & B_SHIFT_KEY) != 0;
-	state.control = (p_state & B_CONTROL_KEY) != 0;
-	state.alt = (p_state & B_OPTION_KEY) != 0;
-	state.meta = (p_state & B_COMMAND_KEY) != 0;
+inline void HaikuDirectWindow::GetKeyModifierState(Ref<InputEventWithModifiers> event, uint32 p_state) {
+	last_key_modifier_state = p_state;
 
-	return state;
+	event->set_shift(p_state & B_SHIFT_KEY);
+	event->set_control(p_state & B_CONTROL_KEY);
+	event->set_alt(p_state & B_OPTION_KEY);
+	event->set_metakey(p_state & B_COMMAND_KEY);
 }
 
+
 inline int HaikuDirectWindow::GetMouseButtonState(uint32 p_state) {
 	int state = 0;
 
diff --git a/platform/haiku/haiku_direct_window.h b/platform/haiku/haiku_direct_window.h
index 55c2f5f..9866d4a 100644
--- a/platform/haiku/haiku_direct_window.h
+++ b/platform/haiku/haiku_direct_window.h
@@ -31,8 +31,10 @@
 #ifndef HAIKU_DIRECT_WINDOW_H
 #define HAIKU_DIRECT_WINDOW_H
 
+#include <kernel/image.h> // DirectWindow.h includes <image.h>, but this
+                          // ends up including the godot header of the same
+						  // name.
 #include <DirectWindow.h>
-#include <kernel/image.h> // needed for image_id
 
 #include "core/os/os.h"
 #include "main/input_default.h"
@@ -61,9 +63,9 @@ private:
 	void HandleMouseMoved(BMessage *message);
 	void HandleMouseWheelChanged(BMessage *message);
 	void HandleWindowResized(BMessage *message);
+	inline void GetKeyModifierState(Ref<InputEventWithModifiers> event, uint32 p_state);
 	void HandleKeyboardEvent(BMessage *message);
 	void HandleKeyboardModifierEvent(BMessage *message);
-	inline InputModifierState GetKeyModifierState(uint32 p_state);
 	inline int GetMouseButtonState(uint32 p_state);
 
 public:
diff --git a/platform/haiku/haiku_gl_view.h b/platform/haiku/haiku_gl_view.h
index 1a694dc..5b067b0 100644
--- a/platform/haiku/haiku_gl_view.h
+++ b/platform/haiku/haiku_gl_view.h
@@ -31,8 +31,8 @@
 #ifndef HAIKU_GL_VIEW_H
 #define HAIKU_GL_VIEW_H
 
-#include <GLView.h>
 #include <kernel/image.h> // needed for image_id
+#include <GLView.h>
 
 class HaikuGLView : public BGLView {
 public:
diff --git a/platform/haiku/os_haiku.cpp b/platform/haiku/os_haiku.cpp
index 97fab5c..5fcc9cf 100644
--- a/platform/haiku/os_haiku.cpp
+++ b/platform/haiku/os_haiku.cpp
@@ -28,9 +28,10 @@
 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
 /*************************************************************************/
 
+#include "drivers/gles3/rasterizer_gles3.h"
+
 #include "os_haiku.h"
 
-#include "drivers/gles3/rasterizer_gles3.h"
 #include "main/main.h"
 #include "servers/physics/physics_server_sw.h"
 #include "servers/visual/visual_server_raster.h"
@@ -106,14 +107,13 @@ Error OS_Haiku::initialize(const VideoMode &p_desired, int p_video_driver, int p
 	context_gl = memnew(ContextGL_Haiku(window));
 	context_gl->initialize();
 	context_gl->make_current();
+	RasterizerGLES3::register_config();
+	RasterizerGLES3::make_current();
 	context_gl->set_use_vsync(current_video_mode.use_vsync);
 
-	/* Port to GLES 3 rasterizer */
-	//rasterizer = memnew(RasterizerGLES2);
-
 #endif
 
-	visual_server = memnew(VisualServerRaster(rasterizer));
+	visual_server = memnew(VisualServerRaster());
 
 	ERR_FAIL_COND_V(!visual_server, ERR_UNAVAILABLE);
 
@@ -132,8 +132,6 @@ Error OS_Haiku::initialize(const VideoMode &p_desired, int p_video_driver, int p
 
 	AudioDriverManager::initialize(p_audio_driver);
 
-	power_manager = memnew(PowerHaiku);
-
 	return OK;
 }
 
@@ -146,7 +144,6 @@ void OS_Haiku::finalize() {
 
 	visual_server->finish();
 	memdelete(visual_server);
-	memdelete(rasterizer);
 
 	memdelete(input);
 
@@ -357,3 +354,19 @@ String OS_Haiku::get_cache_path() const {
 		return get_config_path();
 	}
 }
+
+OS::PowerState OS_Haiku::get_power_state() {
+		WARN_PRINT("Power management is not implemented on this platform, defaulting to POWERSTATE_UNKNOWN");
+		return OS::POWERSTATE_UNKNOWN;
+}
+
+int OS_Haiku::get_power_seconds_left() {
+		WARN_PRINT("Power management is not implemented on this platform, defaulting to -1");
+		return -1;
+}
+
+int OS_Haiku::get_power_percent_left() {
+		WARN_PRINT("Power management is not implemented on this platform, defaulting to -1");
+		return -1;
+}
+
diff --git a/platform/haiku/os_haiku.h b/platform/haiku/os_haiku.h
index 615ae68..bef031a 100644
--- a/platform/haiku/os_haiku.h
+++ b/platform/haiku/os_haiku.h
@@ -37,9 +37,7 @@
 #include "haiku_application.h"
 #include "haiku_direct_window.h"
 #include "main/input_default.h"
-#include "power_haiku.h"
 #include "servers/audio_server.h"
-#include "servers/visual/rasterizer.h"
 #include "servers/visual_server.h"
 
 class OS_Haiku : public OS_Unix {
@@ -48,10 +46,8 @@ private:
 	HaikuDirectWindow *window;
 	MainLoop *main_loop;
 	InputDefault *input;
-	Rasterizer *rasterizer;
 	VisualServer *visual_server;
 	VideoMode current_video_mode;
-	PowerHaiku *power_manager;
 
 #ifdef MEDIA_KIT_ENABLED
 	AudioDriverMediaKit driver_media_kit;
diff --git a/platform/haiku/power_haiku.cpp b/platform/haiku/power_haiku.cpp
deleted file mode 100644
index 2a26dd0..0000000
--- a/platform/haiku/power_haiku.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/*************************************************************************/
-/*  power_haiku.cpp                                                      */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)    */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#include "core/error_macros.h"
-
-#include "power_haiku.h"
-
-bool PowerHaiku::UpdatePowerInfo() {
-
-	return false;
-}
-
-OS::PowerState PowerHaiku::get_power_state() {
-	if (UpdatePowerInfo()) {
-		return power_state;
-	} else {
-		WARN_PRINT("Power management is not implemented on this platform, defaulting to POWERSTATE_UNKNOWN");
-		return OS::POWERSTATE_UNKNOWN;
-	}
-}
-
-int PowerX11::get_power_seconds_left() {
-	if (UpdatePowerInfo()) {
-		return nsecs_left;
-	} else {
-		WARN_PRINT("Power management is not implemented on this platform, defaulting to -1");
-		return -1;
-	}
-}
-
-int PowerX11::get_power_percent_left() {
-	if (UpdatePowerInfo()) {
-		return percent_left;
-	} else {
-		WARN_PRINT("Power management is not implemented on this platform, defaulting to -1");
-		return -1;
-	}
-}
-
-PowerHaiku::PowerHaiku() :
-		nsecs_left(-1),
-		percent_left(-1),
-		power_state(OS::POWERSTATE_UNKNOWN) {
-}
-
-PowerHaiku::~PowerHaiku() {
-}
diff --git a/platform/haiku/power_haiku.h b/platform/haiku/power_haiku.h
deleted file mode 100644
index 2fe85cd..0000000
--- a/platform/haiku/power_haiku.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*************************************************************************/
-/*  power_haiku.h                                                        */
-/*************************************************************************/
-/*                       This file is part of:                           */
-/*                           GODOT ENGINE                                */
-/*                      https://godotengine.org                          */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.                 */
-/* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)    */
-/*                                                                       */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the       */
-/* "Software"), to deal in the Software without restriction, including   */
-/* without limitation the rights to use, copy, modify, merge, publish,   */
-/* distribute, sublicense, and/or sell copies of the Software, and to    */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions:                                             */
-/*                                                                       */
-/* The above copyright notice and this permission notice shall be        */
-/* included in all copies or substantial portions of the Software.       */
-/*                                                                       */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
-/*************************************************************************/
-
-#ifndef PLATFORM_HAIKU_POWER_HAIKU_H_
-#define PLATFORM_HAIKU_POWER_HAIKU_H_
-
-#include <os/os.h>
-
-class PowerHaiku {
-private:
-	int nsecs_left;
-	int percent_left;
-	OS::PowerState power_state;
-
-	bool UpdatePowerInfo();
-
-public:
-	PowerHaiku();
-	virtual ~PowerHaiku();
-
-	OS::PowerState get_power_state();
-	int get_power_seconds_left();
-	int get_power_percent_left();
-};
-
-#endif /* PLATFORM_HAIKU_POWER_HAIKU_H_ */
diff --git a/thirdparty/glad/glad.c b/thirdparty/glad/glad.c
index f87ec8c..81795c2 100644
--- a/thirdparty/glad/glad.c
+++ b/thirdparty/glad/glad.c
@@ -55,7 +55,7 @@ void close_gl(void) {
 #include <dlfcn.h>
 static void* libGL;
 
-#ifndef __APPLE__
+#if !defined(__APPLE__) && !defined(__HAIKU__)
 typedef void* (APIENTRYP PFNGLXGETPROCADDRESSPROC_PRIVATE)(const char*);
 static PFNGLXGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr;
 #endif
@@ -78,7 +78,7 @@ int open_gl(void) {
         libGL = dlopen(NAMES[index], RTLD_NOW | RTLD_GLOBAL);
 
         if(libGL != NULL) {
-#ifdef __APPLE__
+#if defined(__APPLE__) || defined(__HAIKU__)
             return 1;
 #else
             gladGetProcAddressPtr = (PFNGLXGETPROCADDRESSPROC_PRIVATE)dlsym(libGL,
@@ -105,7 +105,7 @@ void* get_proc(const char *namez) {
     void* result = NULL;
     if(libGL == NULL) return NULL;
 
-#ifndef __APPLE__
+#if !defined(__APPLE__) && !defined(__HAIKU__)
     if(gladGetProcAddressPtr != NULL) {
         result = gladGetProcAddressPtr(namez);
     }
@@ -127,7 +127,7 @@ int gladLoadGL(void) {
     if(open_gl()) {
         status = gladLoadGLLoader(&get_proc);
         close_gl();
-    }
+	}
 
     return status;
 }
diff --git a/thirdparty/thekla_atlas/nvcore/nvcore.h b/thirdparty/thekla_atlas/nvcore/nvcore.h
index a3deb66..5ef6966 100644
--- a/thirdparty/thekla_atlas/nvcore/nvcore.h
+++ b/thirdparty/thekla_atlas/nvcore/nvcore.h
@@ -44,6 +44,9 @@
 #elif defined POSH_OS_FREEBSD
 #   define NV_OS_FREEBSD 1
 #   define NV_OS_UNIX 1
+#elif defined POSH_OS_HAIKU
+#   define NV_OS_HAIKU 1
+#   define NV_OS_UNIX 1
 #elif defined POSH_OS_OPENBSD
 #   define NV_OS_OPENBSD 1
 #   define NV_OS_UNIX 1
@@ -341,7 +344,7 @@ template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N];
 #elif NV_CC_GNUC
 #   if NV_OS_LINUX
 #       include "DefsGnucLinux.h"
-#   elif NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD
+#   elif NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD || NV_OS_HAIKU
 #       include "DefsGnucDarwin.h"
 #   elif NV_OS_ORBIS
 #       include "DefsOrbis.h"
diff --git a/thirdparty/thekla_atlas/nvmath/nvmath.h b/thirdparty/thekla_atlas/nvmath/nvmath.h
index f2b6942..09690b1 100644
--- a/thirdparty/thekla_atlas/nvmath/nvmath.h
+++ b/thirdparty/thekla_atlas/nvmath/nvmath.h
@@ -181,7 +181,7 @@ namespace nv
     {
 #if NV_OS_WIN32 || NV_OS_XBOX || NV_OS_DURANGO
         return _finite(f) != 0;
-#elif NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD || NV_OS_ORBIS
+#elif NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD || NV_OS_ORBIS || NV_OS_HAIKU
         return isfinite(f);
 #elif NV_OS_LINUX
         return finitef(f);
@@ -196,7 +196,7 @@ namespace nv
     {
 #if NV_OS_WIN32 || NV_OS_XBOX || NV_OS_DURANGO
         return _isnan(f) != 0;
-#elif NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD || NV_OS_ORBIS
+#elif NV_OS_DARWIN || NV_OS_FREEBSD || NV_OS_OPENBSD || NV_OS_ORBIS || NV_OS_HAIKU
         return isnan(f);
 #elif NV_OS_LINUX
         return isnanf(f);
diff --git a/thirdparty/thekla_atlas/poshlib/posh.h b/thirdparty/thekla_atlas/poshlib/posh.h
index 3038297..16dc694 100644
--- a/thirdparty/thekla_atlas/poshlib/posh.h
+++ b/thirdparty/thekla_atlas/poshlib/posh.h
@@ -298,8 +298,13 @@ Metrowerks:
 #  define POSH_OS_STRING "Linux"
 #endif
 
+#if defined __HAIKU__
+#  define POSH_OS_HAIKU 1
+#  define POSH_OS_STRING "Haiku"
+#endif
+
 #if defined __FreeBSD__
-#  define POSH_OS_FREEBSD 1 
+#  define POSH_OS_FREEBSD 1
 #  define POSH_OS_STRING "FreeBSD"
 #endif
 
-- 
2.19.1


From 0c979385909db4218199ed39ee9d21e4aa13f142 Mon Sep 17 00:00:00 2001
From: Adrien Destugues <pulkomandy@pulkomandy.tk>
Date: Tue, 10 Jul 2018 15:26:41 +0200
Subject: Update patches for Godot 3.0.6

- OpenSSL was replaced with mbedtls
- libwebsockets cannot use an external version yet and need some
  configuration patches

diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index 407272d..82a7678 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -66,9 +66,6 @@ def configure(env):
 
     ## Dependencies
 
-    if not env['builtin_openssl']:
-        env.ParseConfig('pkg-config openssl --cflags --libs')
-
     if not env['builtin_libwebp']:
         env.ParseConfig('pkg-config libwebp --cflags --libs')
 
@@ -131,6 +128,18 @@ def configure(env):
         if any(platform.machine() in s for s in list_of_x86):
             env["x86_libtheora_opt_gcc"] = True
 
+    if not env['builtin_libwebsockets']:
+        env.ParseConfig('pkg-config libwebsockets --cflags --libs')
+
+    if not env['builtin_mbedtls']:
+        # mbedTLS does not provide a pkgconfig config yet. See https://github.com/ARMmbed/mbedtls/issues/228
+        env.Append(LIBS=['mbedtls', 'mbedcrypto', 'mbedx509'])
+
+    if not env['builtin_miniupnpc']:
+        # No pkgconfig file so far, hardcode default paths.
+        env.Append(CPPPATH=["/system/develop/headers/x86/miniupnpc"])
+        env.Append(LIBS=["miniupnpc"])
+
     # On Linux wchar_t should be 32-bits
     # 16-bit library shouldn't be required due to compiler optimisations
     if not env['builtin_pcre2']:
diff --git a/platform/haiku/platform_config.h b/platform/haiku/platform_config.h
index bbd72df..72c8ee2 100644
--- a/platform/haiku/platform_config.h
+++ b/platform/haiku/platform_config.h
@@ -34,3 +34,4 @@
 #define _BSD_SOURCE 1
 
 #define GLES3_INCLUDE_H "glad/glad.h"
+#define GLES2_INCLUDE_H "glad/glad.h"
-- 
2.19.1


From 0403b96697d19cf1e42c970cf39379b7529514fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
Date: Tue, 20 Nov 2018 20:32:05 +0100
Subject: Godot: platform detection patch for AMD64 arch.


diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index 82a7678..8546319 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -61,8 +61,12 @@ def configure(env):
 
     ## Compiler configuration
 
-    env["CC"] = "gcc-x86"
-    env["CXX"] = "g++-x86"
+    if (is64):
+        env["CC"] = "gcc"
+        env["CXX"] = "g++"
+    else:
+        env["CC"] = "gcc-x86"
+        env["CXX"] = "g++-x86"
 
     ## Dependencies
 
-- 
2.19.1


From a8208b396179460c667e0d9855483c8b01b32be9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
Date: Tue, 20 Nov 2018 20:39:43 +0100
Subject: Header location fix for upnpc


diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index 8546319..43dcbf3 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -141,8 +141,11 @@ def configure(env):
 
     if not env['builtin_miniupnpc']:
         # No pkgconfig file so far, hardcode default paths.
-        env.Append(CPPPATH=["/system/develop/headers/x86/miniupnpc"])
         env.Append(LIBS=["miniupnpc"])
+        if (is64):
+            env.Append(CPPPATH=["/system/develop/headers/miniupnpc"])
+        else:
+            env.Append(CPPPATH=["/system/develop/headers/x86/miniupnpc"])
 
     # On Linux wchar_t should be 32-bits
     # 16-bit library shouldn't be required due to compiler optimisations
-- 
2.19.1


From 2d323c5fe1bcec60e47a46dff00d26678cf6aa8e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
Date: Wed, 28 Nov 2018 21:28:36 +0100
Subject: No websockets anymore


diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index 43dcbf3..97dbc33 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -132,9 +132,6 @@ def configure(env):
         if any(platform.machine() in s for s in list_of_x86):
             env["x86_libtheora_opt_gcc"] = True
 
-    if not env['builtin_libwebsockets']:
-        env.ParseConfig('pkg-config libwebsockets --cflags --libs')
-
     if not env['builtin_mbedtls']:
         # mbedTLS does not provide a pkgconfig config yet. See https://github.com/ARMmbed/mbedtls/issues/228
         env.Append(LIBS=['mbedtls', 'mbedcrypto', 'mbedx509'])
-- 
2.19.1


From 9522327086f3253ea29def0536f8041b70478147 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
Date: Wed, 28 Nov 2018 21:29:54 +0100
Subject: No mbedtls either


diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index 97dbc33..c5d7d95 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -132,10 +132,6 @@ def configure(env):
         if any(platform.machine() in s for s in list_of_x86):
             env["x86_libtheora_opt_gcc"] = True
 
-    if not env['builtin_mbedtls']:
-        # mbedTLS does not provide a pkgconfig config yet. See https://github.com/ARMmbed/mbedtls/issues/228
-        env.Append(LIBS=['mbedtls', 'mbedcrypto', 'mbedx509'])
-
     if not env['builtin_miniupnpc']:
         # No pkgconfig file so far, hardcode default paths.
         env.Append(LIBS=["miniupnpc"])
-- 
2.19.1


From bbf3f9573103bb6d15eef1ac66216cb08e557893 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
Date: Wed, 28 Nov 2018 21:30:46 +0100
Subject: No miniupnpc either


diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index c5d7d95..210b2e5 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -132,14 +132,6 @@ def configure(env):
         if any(platform.machine() in s for s in list_of_x86):
             env["x86_libtheora_opt_gcc"] = True
 
-    if not env['builtin_miniupnpc']:
-        # No pkgconfig file so far, hardcode default paths.
-        env.Append(LIBS=["miniupnpc"])
-        if (is64):
-            env.Append(CPPPATH=["/system/develop/headers/miniupnpc"])
-        else:
-            env.Append(CPPPATH=["/system/develop/headers/x86/miniupnpc"])
-
     # On Linux wchar_t should be 32-bits
     # 16-bit library shouldn't be required due to compiler optimisations
     if not env['builtin_pcre2']:
-- 
2.19.1


From 4711a904703e3ef2c56d454739b02a5878308046 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
Date: Wed, 5 Dec 2018 12:53:32 +0100
Subject: OpenSSL required


diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index 210b2e5..466092c 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -132,6 +132,9 @@ def configure(env):
         if any(platform.machine() in s for s in list_of_x86):
             env["x86_libtheora_opt_gcc"] = True
 
+    if not env['builtin_openssl']:
+        env.ParseConfig('pkg-config openssl --cflags --libs')
+
     # On Linux wchar_t should be 32-bits
     # 16-bit library shouldn't be required due to compiler optimisations
     if not env['builtin_pcre2']:
-- 
2.19.1


From 1df73d87cc38bc8363a9666b6d0fd6ddd5eb4829 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
Date: Thu, 6 Dec 2018 19:16:26 +0100
Subject: x86 pkg-config support


diff --git a/platform/haiku/detect.py b/platform/haiku/detect.py
index 466092c..2eacd7e 100644
--- a/platform/haiku/detect.py
+++ b/platform/haiku/detect.py
@@ -64,14 +64,16 @@ def configure(env):
     if (is64):
         env["CC"] = "gcc"
         env["CXX"] = "g++"
+        pkgconf = "pkg-config"
     else:
         env["CC"] = "gcc-x86"
         env["CXX"] = "g++-x86"
+        pkgconf = "pkg-config_x86"
 
     ## Dependencies
 
     if not env['builtin_libwebp']:
-        env.ParseConfig('pkg-config libwebp --cflags --libs')
+        env.ParseConfig('pkgconf libwebp --cflags --libs')
 
     # freetype depends on libpng and zlib, so bundling one of them while keeping others
     # as shared libraries leads to weird issues
@@ -81,29 +83,29 @@ def configure(env):
         env['builtin_zlib'] = True
 
     if not env['builtin_freetype']:
-        env.ParseConfig('pkg-config freetype2 --cflags --libs')
+        env.ParseConfig('pkgconf freetype2 --cflags --libs')
 
     if not env['builtin_libpng']:
-        env.ParseConfig('pkg-config libpng --cflags --libs')
+        env.ParseConfig('pkgconf libpng --cflags --libs')
 
     if not env['builtin_bullet']:
         # We need at least version 2.88
         import subprocess
-        bullet_version = subprocess.check_output(['pkg-config', 'bullet', '--modversion']).strip()
+        bullet_version = subprocess.check_output(['pkgconf', 'bullet', '--modversion']).strip()
         if bullet_version < "2.88":
             # Abort as system bullet was requested but too old
             print("Bullet: System version {0} does not match minimal requirements ({1}). Aborting.".format(bullet_version, "2.88"))
             sys.exit(255)
-        env.ParseConfig('pkg-config bullet --cflags --libs')
+        env.ParseConfig('pkgconf bullet --cflags --libs')
 
     if not env['builtin_enet']:
-        env.ParseConfig('pkg-config libenet --cflags --libs')
+        env.ParseConfig('pkgconf libenet --cflags --libs')
 
     if not env['builtin_squish'] and env['tools']:
-        env.ParseConfig('pkg-config libsquish --cflags --libs')
+        env.ParseConfig('pkgconf libsquish --cflags --libs')
 
     if not env['builtin_zstd']:
-        env.ParseConfig('pkg-config libzstd --cflags --libs')
+        env.ParseConfig('pkgconf libzstd --cflags --libs')
 
     # Sound and video libraries
     # Keep the order as it triggers chained dependencies (ogg needed by others, etc.)
@@ -111,21 +113,21 @@ def configure(env):
     if not env['builtin_libtheora']:
         env['builtin_libogg'] = False  # Needed to link against system libtheora
         env['builtin_libvorbis'] = False  # Needed to link against system libtheora
-        env.ParseConfig('pkg-config theora theoradec --cflags --libs')
+        env.ParseConfig('pkgconf theora theoradec --cflags --libs')
 
     if not env['builtin_libvpx']:
-        env.ParseConfig('pkg-config vpx --cflags --libs')
+        env.ParseConfig('pkgconf vpx --cflags --libs')
 
     if not env['builtin_libvorbis']:
         env['builtin_libogg'] = False  # Needed to link against system libvorbis
-        env.ParseConfig('pkg-config vorbis vorbisfile --cflags --libs')
+        env.ParseConfig('pkgconf vorbis vorbisfile --cflags --libs')
 
     if not env['builtin_opus']:
         env['builtin_libogg'] = False  # Needed to link against system opus
-        env.ParseConfig('pkg-config opus opusfile --cflags --libs')
+        env.ParseConfig('pkgconf opus opusfile --cflags --libs')
 
     if not env['builtin_libogg']:
-        env.ParseConfig('pkg-config ogg --cflags --libs')
+        env.ParseConfig('pkgconf ogg --cflags --libs')
 
     if env['builtin_libtheora']:
         list_of_x86 = ['x86_64', 'x86', 'i386', 'i586']
@@ -133,12 +135,12 @@ def configure(env):
             env["x86_libtheora_opt_gcc"] = True
 
     if not env['builtin_openssl']:
-        env.ParseConfig('pkg-config openssl --cflags --libs')
+        env.ParseConfig('pkgconf openssl --cflags --libs')
 
     # On Linux wchar_t should be 32-bits
     # 16-bit library shouldn't be required due to compiler optimisations
     if not env['builtin_pcre2']:
-        env.ParseConfig('pkg-config libpcre2-32 --cflags --libs')
+        env.ParseConfig('pkgconf libpcre2-32 --cflags --libs')
 
 
     ## Flags
-- 
2.19.1

