diff options
-rw-r--r-- | platform/iphone/gl_view.mm | 9 | ||||
-rw-r--r-- | platform/iphone/os_iphone.cpp | 57 | ||||
-rw-r--r-- | scene/gui/color_picker.cpp | 34 |
3 files changed, 74 insertions, 26 deletions
diff --git a/platform/iphone/gl_view.mm b/platform/iphone/gl_view.mm index 5b4d1f8226..054c066224 100644 --- a/platform/iphone/gl_view.mm +++ b/platform/iphone/gl_view.mm @@ -47,6 +47,7 @@ @end */ +bool gles3_available = true; int gl_view_base_fb; static String keyboard_text; static GLView *_instance = NULL; @@ -288,8 +289,12 @@ static void clear_touches() { context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3]; if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) { - [self release]; - return nil; + context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; + gles3_available = false; + if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) { + [self release]; + return nil; + } } // Default the animation interval to 1/60th of a second. diff --git a/platform/iphone/os_iphone.cpp b/platform/iphone/os_iphone.cpp index e996a5905b..dd764b7173 100644 --- a/platform/iphone/os_iphone.cpp +++ b/platform/iphone/os_iphone.cpp @@ -32,6 +32,7 @@ #include "os_iphone.h" +#include "drivers/gles2/rasterizer_gles2.h" #include "drivers/gles3/rasterizer_gles3.h" #include "servers/visual/visual_server_raster.h" #include "servers/visual/visual_server_wrap_mt.h" @@ -51,12 +52,19 @@ int OSIPhone::get_video_driver_count() const { - return 1; + return 2; }; const char *OSIPhone::get_video_driver_name(int p_driver) const { - return "GLES3"; + switch (p_driver) { + case VIDEO_DRIVER_GLES3: + return "GLES3"; + case VIDEO_DRIVER_GLES2: + return "GLES2"; + } + ERR_EXPLAIN("Invalid video driver index " + itos(p_driver)); + ERR_FAIL_V(NULL); }; OSIPhone *OSIPhone::get_singleton() { @@ -97,16 +105,48 @@ int OSIPhone::get_current_video_driver() const { return video_driver_index; } +extern bool gles3_available; // from gl_view.mm + Error OSIPhone::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) { - video_driver_index = VIDEO_DRIVER_GLES3; + bool use_gl3 = GLOBAL_GET("rendering/quality/driver/driver_name") == "GLES3"; + bool gl_initialization_error = false; + + while (true) { + if (use_gl3) { + if (RasterizerGLES3::is_viable() == OK && gles3_available) { + RasterizerGLES3::register_config(); + RasterizerGLES3::make_current(); + break; + } else { + if (GLOBAL_GET("rendering/quality/driver/driver_fallback") == "Best") { + p_video_driver = VIDEO_DRIVER_GLES2; + use_gl3 = false; + continue; + } else { + gl_initialization_error = true; + break; + } + } + } else { + if (RasterizerGLES2::is_viable() == OK) { + RasterizerGLES2::register_config(); + RasterizerGLES2::make_current(); + break; + } else { + gl_initialization_error = true; + break; + } + } + } - if (RasterizerGLES3::is_viable() != OK) { + if (gl_initialization_error) { + OS::get_singleton()->alert("Your device does not support any of the supported OpenGL versions.", + "Unable to initialize Video driver"); return ERR_UNAVAILABLE; } - RasterizerGLES3::register_config(); - RasterizerGLES3::make_current(); + video_driver_index = p_video_driver; visual_server = memnew(VisualServerRaster); // FIXME: Reimplement threaded rendering if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) { @@ -117,7 +157,10 @@ Error OSIPhone::initialize(const VideoMode &p_desired, int p_video_driver, int p //visual_server->cursor_set_visible(false, 0); // reset this to what it should be, it will have been set to 0 after visual_server->init() is called - RasterizerStorageGLES3::system_fbo = gl_view_base_fb; + if (use_gl3) + RasterizerStorageGLES3::system_fbo = gl_view_base_fb; + else + RasterizerStorageGLES2::system_fbo = gl_view_base_fb; AudioDriverManager::initialize(p_audio_driver); diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 19c6cde111..523e07087b 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -204,22 +204,9 @@ void ColorPicker::_update_presets() { preset->draw_texture_rect(get_icon("preset_bg", "ColorPicker"), Rect2(Point2(), preset_size), true); -#ifdef TOOLS_ENABLED - if (Engine::get_singleton()->is_editor_hint()) { - PoolColorArray arr_to_save = PoolColorArray(); - - for (int i = 0; i < presets.size(); i++) { - preset->draw_rect(Rect2(Point2(size.width * i, 0), size), presets[i]); - arr_to_save.insert(i, presets[i]); - } - - EditorSettings::get_singleton()->set_project_metadata("color_picker", "presets", arr_to_save); - } -#else for (int i = 0; i < presets.size(); i++) { preset->draw_rect(Rect2(Point2(size.width * i, 0), size), presets[i]); } -#endif } void ColorPicker::_text_type_toggled() { @@ -251,6 +238,13 @@ void ColorPicker::add_preset(const Color &p_color) { preset->update(); if (presets.size() == 10) bt_add_preset->hide(); + +#ifdef TOOLS_ENABLED + if (Engine::get_singleton()->is_editor_hint()) { + PoolColorArray arr_to_save = get_presets(); + EditorSettings::get_singleton()->set_project_metadata("color_picker", "presets", arr_to_save); + } +#endif } void ColorPicker::erase_preset(const Color &p_color) { @@ -258,6 +252,13 @@ void ColorPicker::erase_preset(const Color &p_color) { if (presets.find(p_color)) { presets.erase(presets.find(p_color)); preset->update(); + +#ifdef TOOLS_ENABLED + if (Engine::get_singleton()->is_editor_hint()) { + PoolColorArray arr_to_save = get_presets(); + EditorSettings::get_singleton()->set_project_metadata("color_picker", "presets", arr_to_save); + } +#endif } } @@ -462,16 +463,15 @@ void ColorPicker::_preset_input(const Ref<InputEvent> &p_event) { if (bev->is_pressed() && bev->get_button_index() == BUTTON_LEFT) { int index = bev->get_position().x / (preset->get_size().x / presets.size()); set_pick_color(presets[index]); + _update_color(); + emit_signal("color_changed", color); } else if (bev->is_pressed() && bev->get_button_index() == BUTTON_RIGHT) { int index = bev->get_position().x / (preset->get_size().x / presets.size()); Color clicked_preset = presets[index]; - presets.erase(clicked_preset); + erase_preset(clicked_preset); emit_signal("preset_removed", clicked_preset); - preset->update(); bt_add_preset->show(); } - _update_color(); - emit_signal("color_changed", color); } Ref<InputEventMouseMotion> mev = p_event; |