Browse Source

-Project/Editor settings now use new inspector
-Project/Editor settings now show tooltips properly
-Settings thar require restart now will show a restart warning
-Video driver is now visible all the time, can be changed easily
-Added function to request current video driver

Juan Linietsky 7 years ago
parent
commit
c69de2ba46
47 changed files with 1028 additions and 81 deletions
  1. 1 1
      core/message_queue.cpp
  2. 12 0
      core/os/os.cpp
  3. 9 1
      core/os/os.h
  4. 10 2
      core/project_settings.cpp
  5. 6 1
      core/project_settings.h
  6. 1 1
      core/register_core_types.cpp
  7. 2 2
      drivers/coreaudio/audio_driver_coreaudio.cpp
  8. 2 2
      drivers/gles3/rasterizer_canvas_gles3.cpp
  9. 1 1
      drivers/gles3/rasterizer_scene_gles3.cpp
  10. 1 1
      drivers/gles3/rasterizer_storage_gles3.cpp
  11. 2 2
      drivers/pulseaudio/audio_driver_pulseaudio.cpp
  12. 2 2
      drivers/rtaudio/audio_driver_rtaudio.cpp
  13. 1 1
      drivers/wasapi/audio_driver_wasapi.cpp
  14. 1 1
      drivers/xaudio2/audio_driver_xaudio2.cpp
  15. 38 3
      editor/editor_inspector.cpp
  16. 10 0
      editor/editor_inspector.h
  17. 89 8
      editor/editor_node.cpp
  18. 11 0
      editor/editor_node.h
  19. 306 0
      editor/editor_sectioned_inspector.cpp
  20. 42 0
      editor/editor_sectioned_inspector.h
  21. 22 4
      editor/editor_settings.cpp
  22. 6 1
      editor/editor_settings.h
  23. 2 1
      editor/editor_spin_slider.cpp
  24. 55 0
      editor/icons/icon_g_l_e_s_2.svg
  25. 54 0
      editor/icons/icon_g_l_e_s_3.svg
  26. 127 0
      editor/icons/icon_vulkan.svg
  27. 57 16
      editor/project_settings_editor.cpp
  28. 12 3
      editor/project_settings_editor.h
  29. 56 14
      editor/settings_config_dialog.cpp
  30. 16 2
      editor/settings_config_dialog.h
  31. 11 2
      main/main.cpp
  32. 2 2
      platform/android/audio_driver_jandroid.cpp
  33. 5 0
      platform/android/os_android.cpp
  34. 3 0
      platform/android/os_android.h
  35. 1 1
      platform/haiku/audio_driver_media_kit.cpp
  36. 6 0
      platform/iphone/os_iphone.cpp
  37. 4 0
      platform/iphone/os_iphone.h
  38. 5 0
      platform/javascript/os_javascript.cpp
  39. 4 0
      platform/javascript/os_javascript.h
  40. 3 0
      platform/osx/os_osx.h
  41. 6 0
      platform/osx/os_osx.mm
  42. 6 0
      platform/windows/os_windows.cpp
  43. 3 0
      platform/windows/os_windows.h
  44. 8 2
      platform/x11/os_x11.cpp
  45. 3 0
      platform/x11/os_x11.h
  46. 1 1
      servers/audio/audio_driver_dummy.cpp
  47. 3 3
      servers/audio_server.cpp

+ 1 - 1
core/message_queue.cpp

@@ -342,7 +342,7 @@ MessageQueue::MessageQueue() {
 
 
 	buffer_end = 0;
 	buffer_end = 0;
 	buffer_max_used = 0;
 	buffer_max_used = 0;
-	buffer_size = GLOBAL_DEF("memory/limits/message_queue/max_size_kb", DEFAULT_QUEUE_SIZE_KB);
+	buffer_size = GLOBAL_DEF_RST("memory/limits/message_queue/max_size_kb", DEFAULT_QUEUE_SIZE_KB);
 	buffer_size *= 1024;
 	buffer_size *= 1024;
 	buffer = memnew_arr(uint8_t, buffer_size);
 	buffer = memnew_arr(uint8_t, buffer_size);
 }
 }

+ 12 - 0
core/os/os.cpp

@@ -659,6 +659,18 @@ const char *OS::get_audio_driver_name(int p_driver) const {
 	return AudioDriverManager::get_driver(p_driver)->get_name();
 	return AudioDriverManager::get_driver(p_driver)->get_name();
 }
 }
 
 
+void OS::set_restart_on_exit(bool p_restart, const List<String> &p_restart_arguments) {
+	restart_on_exit = p_restart;
+	restart_commandline = p_restart_arguments;
+}
+
+bool OS::is_restart_on_exit_set() const {
+	return restart_on_exit;
+}
+List<String> OS::get_restart_on_exit_argumens() const {
+	return restart_commandline;
+}
+
 OS::OS() {
 OS::OS() {
 	void *volatile stack_bottom;
 	void *volatile stack_bottom;
 
 

+ 9 - 1
core/os/os.h

@@ -74,6 +74,9 @@ class OS {
 
 
 	CompositeLogger *_logger;
 	CompositeLogger *_logger;
 
 
+	bool restart_on_exit;
+	List<String> restart_commandline;
+
 protected:
 protected:
 	void _set_logger(CompositeLogger *p_logger);
 	void _set_logger(CompositeLogger *p_logger);
 
 
@@ -182,7 +185,7 @@ public:
 
 
 	virtual int get_video_driver_count() const;
 	virtual int get_video_driver_count() const;
 	virtual const char *get_video_driver_name(int p_driver) const;
 	virtual const char *get_video_driver_name(int p_driver) const;
-
+	virtual int get_current_video_driver() const = 0;
 	virtual int get_audio_driver_count() const;
 	virtual int get_audio_driver_count() const;
 	virtual const char *get_audio_driver_name(int p_driver) const;
 	virtual const char *get_audio_driver_name(int p_driver) const;
 
 
@@ -496,6 +499,11 @@ public:
 
 
 	bool is_layered_allowed() const { return _allow_layered; }
 	bool is_layered_allowed() const { return _allow_layered; }
 	bool is_hidpi_allowed() const { return _allow_hidpi; }
 	bool is_hidpi_allowed() const { return _allow_hidpi; }
+
+	void set_restart_on_exit(bool p_restart, const List<String> &p_restart_arguments);
+	bool is_restart_on_exit_set() const;
+	List<String> get_restart_on_exit_argumens() const;
+
 	OS();
 	OS();
 	virtual ~OS();
 	virtual ~OS();
 };
 };

+ 10 - 2
core/project_settings.cpp

@@ -105,6 +105,11 @@ void ProjectSettings::set_initial_value(const String &p_name, const Variant &p_v
 	ERR_FAIL_COND(!props.has(p_name));
 	ERR_FAIL_COND(!props.has(p_name));
 	props[p_name].initial = p_value;
 	props[p_name].initial = p_value;
 }
 }
+void ProjectSettings::set_restart_if_changed(const String &p_name, bool p_restart) {
+
+	ERR_FAIL_COND(!props.has(p_name));
+	props[p_name].restart_if_changed = p_restart;
+}
 
 
 String ProjectSettings::globalize_path(const String &p_path) const {
 String ProjectSettings::globalize_path(const String &p_path) const {
 
 
@@ -225,6 +230,9 @@ void ProjectSettings::_get_property_list(List<PropertyInfo> *p_list) const {
 		else
 		else
 			vc.flags = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_STORAGE;
 			vc.flags = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_STORAGE;
 
 
+		if (v->restart_if_changed) {
+			vc.flags |= PROPERTY_USAGE_RESTART_IF_CHANGED;
+		}
 		vclist.insert(vc);
 		vclist.insert(vc);
 	}
 	}
 
 
@@ -817,7 +825,7 @@ Error ProjectSettings::save_custom(const String &p_path, const CustomMap &p_cust
 	return OK;
 	return OK;
 }
 }
 
 
-Variant _GLOBAL_DEF(const String &p_var, const Variant &p_default) {
+Variant _GLOBAL_DEF(const String &p_var, const Variant &p_default, bool p_restart_if_changed) {
 
 
 	Variant ret;
 	Variant ret;
 	if (!ProjectSettings::get_singleton()->has_setting(p_var)) {
 	if (!ProjectSettings::get_singleton()->has_setting(p_var)) {
@@ -827,6 +835,7 @@ Variant _GLOBAL_DEF(const String &p_var, const Variant &p_default) {
 
 
 	ProjectSettings::get_singleton()->set_initial_value(p_var, p_default);
 	ProjectSettings::get_singleton()->set_initial_value(p_var, p_default);
 	ProjectSettings::get_singleton()->set_builtin_order(p_var);
 	ProjectSettings::get_singleton()->set_builtin_order(p_var);
+	ProjectSettings::get_singleton()->set_restart_if_changed(p_var, p_restart_if_changed);
 	return ret;
 	return ret;
 }
 }
 
 
@@ -1080,7 +1089,6 @@ ProjectSettings::ProjectSettings() {
 	custom_prop_info["rendering/threads/thread_model"] = PropertyInfo(Variant::INT, "rendering/threads/thread_model", PROPERTY_HINT_ENUM, "Single-Unsafe,Single-Safe,Multi-Threaded");
 	custom_prop_info["rendering/threads/thread_model"] = PropertyInfo(Variant::INT, "rendering/threads/thread_model", PROPERTY_HINT_ENUM, "Single-Unsafe,Single-Safe,Multi-Threaded");
 	custom_prop_info["physics/2d/thread_model"] = PropertyInfo(Variant::INT, "physics/2d/thread_model", PROPERTY_HINT_ENUM, "Single-Unsafe,Single-Safe,Multi-Threaded");
 	custom_prop_info["physics/2d/thread_model"] = PropertyInfo(Variant::INT, "physics/2d/thread_model", PROPERTY_HINT_ENUM, "Single-Unsafe,Single-Safe,Multi-Threaded");
 	custom_prop_info["rendering/quality/intended_usage/framebuffer_allocation"] = PropertyInfo(Variant::INT, "rendering/quality/intended_usage/framebuffer_allocation", PROPERTY_HINT_ENUM, "2D,2D Without Sampling,3D,3D Without Effects");
 	custom_prop_info["rendering/quality/intended_usage/framebuffer_allocation"] = PropertyInfo(Variant::INT, "rendering/quality/intended_usage/framebuffer_allocation", PROPERTY_HINT_ENUM, "2D,2D Without Sampling,3D,3D Without Effects");
-	GLOBAL_DEF("rendering/quality/intended_usage/framebuffer_mode", 2);
 
 
 	GLOBAL_DEF("debug/settings/profiler/max_functions", 16384);
 	GLOBAL_DEF("debug/settings/profiler/max_functions", 16384);
 
 

+ 6 - 1
core/project_settings.h

@@ -59,11 +59,13 @@ protected:
 		Variant initial;
 		Variant initial;
 		bool hide_from_editor;
 		bool hide_from_editor;
 		bool overridden;
 		bool overridden;
+		bool restart_if_changed;
 		VariantContainer() :
 		VariantContainer() :
 				order(0),
 				order(0),
 				persist(false),
 				persist(false),
 				hide_from_editor(false),
 				hide_from_editor(false),
 				overridden(false) {
 				overridden(false) {
+			restart_if_changed = false;
 		}
 		}
 		VariantContainer(const Variant &p_variant, int p_order, bool p_persist = false) :
 		VariantContainer(const Variant &p_variant, int p_order, bool p_persist = false) :
 				order(p_order),
 				order(p_order),
@@ -71,6 +73,7 @@ protected:
 				variant(p_variant),
 				variant(p_variant),
 				hide_from_editor(false),
 				hide_from_editor(false),
 				overridden(false) {
 				overridden(false) {
+			restart_if_changed = false;
 		}
 		}
 	};
 	};
 
 
@@ -120,6 +123,7 @@ public:
 	String globalize_path(const String &p_path) const;
 	String globalize_path(const String &p_path) const;
 
 
 	void set_initial_value(const String &p_name, const Variant &p_value);
 	void set_initial_value(const String &p_name, const Variant &p_value);
+	void set_restart_if_changed(const String &p_name, bool p_restart);
 	bool property_can_revert(const String &p_name);
 	bool property_can_revert(const String &p_name);
 	Variant property_get_revert(const String &p_name);
 	Variant property_get_revert(const String &p_name);
 
 
@@ -158,8 +162,9 @@ public:
 };
 };
 
 
 //not a macro any longer
 //not a macro any longer
-Variant _GLOBAL_DEF(const String &p_var, const Variant &p_default);
+Variant _GLOBAL_DEF(const String &p_var, const Variant &p_default, bool p_restart_if_changed = false);
 #define GLOBAL_DEF(m_var, m_value) _GLOBAL_DEF(m_var, m_value)
 #define GLOBAL_DEF(m_var, m_value) _GLOBAL_DEF(m_var, m_value)
+#define GLOBAL_DEF_RST(m_var, m_value) _GLOBAL_DEF(m_var, m_value, true)
 #define GLOBAL_GET(m_var) ProjectSettings::get_singleton()->get(m_var)
 #define GLOBAL_GET(m_var) ProjectSettings::get_singleton()->get(m_var)
 
 
 #endif
 #endif

+ 1 - 1
core/register_core_types.cpp

@@ -191,7 +191,7 @@ void register_core_types() {
 
 
 void register_core_settings() {
 void register_core_settings() {
 	//since in register core types, globals may not e present
 	//since in register core types, globals may not e present
-	GLOBAL_DEF("network/limits/packet_peer_stream/max_buffer_po2", (16));
+	GLOBAL_DEF_RST("network/limits/packet_peer_stream/max_buffer_po2", (16));
 }
 }
 
 
 void register_core_singletons() {
 void register_core_singletons() {

+ 2 - 2
drivers/coreaudio/audio_driver_coreaudio.cpp

@@ -102,7 +102,7 @@ Error AudioDriverCoreAudio::init() {
 			break;
 			break;
 	}
 	}
 
 
-	mix_rate = GLOBAL_DEF("audio/mix_rate", DEFAULT_MIX_RATE);
+	mix_rate = GLOBAL_DEF_RST("audio/mix_rate", DEFAULT_MIX_RATE);
 
 
 	zeromem(&strdesc, sizeof(strdesc));
 	zeromem(&strdesc, sizeof(strdesc));
 	strdesc.mFormatID = kAudioFormatLinearPCM;
 	strdesc.mFormatID = kAudioFormatLinearPCM;
@@ -117,7 +117,7 @@ Error AudioDriverCoreAudio::init() {
 	result = AudioUnitSetProperty(audio_unit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &strdesc, sizeof(strdesc));
 	result = AudioUnitSetProperty(audio_unit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, kOutputBus, &strdesc, sizeof(strdesc));
 	ERR_FAIL_COND_V(result != noErr, FAILED);
 	ERR_FAIL_COND_V(result != noErr, FAILED);
 
 
-	int latency = GLOBAL_DEF("audio/output_latency", DEFAULT_OUTPUT_LATENCY);
+	int latency = GLOBAL_DEF_RST("audio/output_latency", DEFAULT_OUTPUT_LATENCY);
 	// Sample rate is independent of channels (ref: https://stackoverflow.com/questions/11048825/audio-sample-frequency-rely-on-channels)
 	// Sample rate is independent of channels (ref: https://stackoverflow.com/questions/11048825/audio-sample-frequency-rely-on-channels)
 	buffer_frames = closest_power_of_2(latency * mix_rate / 1000);
 	buffer_frames = closest_power_of_2(latency * mix_rate / 1000);
 
 

+ 2 - 2
drivers/gles3/rasterizer_canvas_gles3.cpp

@@ -1895,7 +1895,7 @@ void RasterizerCanvasGLES3::initialize() {
 	}
 	}
 	{
 	{
 
 
-		uint32_t poly_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_buffer_size_kb", 128);
+		uint32_t poly_size = GLOBAL_DEF_RST("rendering/limits/buffers/canvas_polygon_buffer_size_kb", 128);
 		poly_size *= 1024; //kb
 		poly_size *= 1024; //kb
 		poly_size = MAX(poly_size, (2 + 2 + 4) * 4 * sizeof(float));
 		poly_size = MAX(poly_size, (2 + 2 + 4) * 4 * sizeof(float));
 		glGenBuffers(1, &data.polygon_buffer);
 		glGenBuffers(1, &data.polygon_buffer);
@@ -1942,7 +1942,7 @@ void RasterizerCanvasGLES3::initialize() {
 
 
 		glGenVertexArrays(1, &data.polygon_buffer_pointer_array);
 		glGenVertexArrays(1, &data.polygon_buffer_pointer_array);
 
 
-		uint32_t index_size = GLOBAL_DEF("rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", 128);
+		uint32_t index_size = GLOBAL_DEF_RST("rendering/limits/buffers/canvas_polygon_index_buffer_size_kb", 128);
 		index_size *= 1024; //kb
 		index_size *= 1024; //kb
 		glGenBuffers(1, &data.polygon_index_buffer);
 		glGenBuffers(1, &data.polygon_index_buffer);
 		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);
 		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.polygon_index_buffer);

+ 1 - 1
drivers/gles3/rasterizer_scene_gles3.cpp

@@ -4866,7 +4866,7 @@ void RasterizerSceneGLES3::initialize() {
 	glBufferData(GL_UNIFORM_BUFFER, sizeof(State::EnvironmentRadianceUBO), &state.env_radiance_ubo, GL_DYNAMIC_DRAW);
 	glBufferData(GL_UNIFORM_BUFFER, sizeof(State::EnvironmentRadianceUBO), &state.env_radiance_ubo, GL_DYNAMIC_DRAW);
 	glBindBuffer(GL_UNIFORM_BUFFER, 0);
 	glBindBuffer(GL_UNIFORM_BUFFER, 0);
 
 
-	render_list.max_elements = GLOBAL_DEF("rendering/limits/rendering/max_renderable_elements", (int)RenderList::DEFAULT_MAX_ELEMENTS);
+	render_list.max_elements = GLOBAL_DEF_RST("rendering/limits/rendering/max_renderable_elements", (int)RenderList::DEFAULT_MAX_ELEMENTS);
 	if (render_list.max_elements > 1000000)
 	if (render_list.max_elements > 1000000)
 		render_list.max_elements = 1000000;
 		render_list.max_elements = 1000000;
 	if (render_list.max_elements < 1024)
 	if (render_list.max_elements < 1024)

+ 1 - 1
drivers/gles3/rasterizer_storage_gles3.cpp

@@ -7463,7 +7463,7 @@ void RasterizerStorageGLES3::initialize() {
 
 
 	{
 	{
 		//transform feedback buffers
 		//transform feedback buffers
-		uint32_t xf_feedback_size = GLOBAL_DEF("rendering/limits/buffers/blend_shape_max_buffer_size_kb", 4096);
+		uint32_t xf_feedback_size = GLOBAL_DEF_RST("rendering/limits/buffers/blend_shape_max_buffer_size_kb", 4096);
 		for (int i = 0; i < 2; i++) {
 		for (int i = 0; i < 2; i++) {
 
 
 			glGenBuffers(1, &resources.transform_feedback_buffers[i]);
 			glGenBuffers(1, &resources.transform_feedback_buffers[i]);

+ 2 - 2
drivers/pulseaudio/audio_driver_pulseaudio.cpp

@@ -155,7 +155,7 @@ Error AudioDriverPulseAudio::init_device() {
 			break;
 			break;
 	}
 	}
 
 
-	int latency = GLOBAL_DEF("audio/output_latency", DEFAULT_OUTPUT_LATENCY);
+	int latency = GLOBAL_DEF_RST("audio/output_latency", DEFAULT_OUTPUT_LATENCY);
 	buffer_frames = closest_power_of_2(latency * mix_rate / 1000);
 	buffer_frames = closest_power_of_2(latency * mix_rate / 1000);
 	pa_buffer_size = buffer_frames * pa_map.channels;
 	pa_buffer_size = buffer_frames * pa_map.channels;
 
 
@@ -204,7 +204,7 @@ Error AudioDriverPulseAudio::init() {
 	thread_exited = false;
 	thread_exited = false;
 	exit_thread = false;
 	exit_thread = false;
 
 
-	mix_rate = GLOBAL_DEF("audio/mix_rate", DEFAULT_MIX_RATE);
+	mix_rate = GLOBAL_DEF_RST("audio/mix_rate", DEFAULT_MIX_RATE);
 
 
 	pa_ml = pa_mainloop_new();
 	pa_ml = pa_mainloop_new();
 	ERR_FAIL_COND_V(pa_ml == NULL, ERR_CANT_OPEN);
 	ERR_FAIL_COND_V(pa_ml == NULL, ERR_CANT_OPEN);

+ 2 - 2
drivers/rtaudio/audio_driver_rtaudio.cpp

@@ -88,7 +88,7 @@ Error AudioDriverRtAudio::init() {
 
 
 	// FIXME: Adapt to the OutputFormat -> SpeakerMode change
 	// FIXME: Adapt to the OutputFormat -> SpeakerMode change
 	/*
 	/*
-	String channels = GLOBAL_DEF("audio/output","stereo");
+	String channels = GLOBAL_DEF_RST("audio/output","stereo");
 
 
 	if (channels=="5.1")
 	if (channels=="5.1")
 		output_format=OUTPUT_5_1;
 		output_format=OUTPUT_5_1;
@@ -108,7 +108,7 @@ Error AudioDriverRtAudio::init() {
 	options.numberOfBuffers = 4;
 	options.numberOfBuffers = 4;
 
 
 	parameters.firstChannel = 0;
 	parameters.firstChannel = 0;
-	mix_rate = GLOBAL_DEF("audio/mix_rate", DEFAULT_MIX_RATE);
+	mix_rate = GLOBAL_DEF_RST("audio/mix_rate", DEFAULT_MIX_RATE);
 
 
 	int latency = GLOBAL_DEF("audio/output_latency", DEFAULT_OUTPUT_LATENCY);
 	int latency = GLOBAL_DEF("audio/output_latency", DEFAULT_OUTPUT_LATENCY);
 	unsigned int buffer_frames = closest_power_of_2(latency * mix_rate / 1000);
 	unsigned int buffer_frames = closest_power_of_2(latency * mix_rate / 1000);

+ 1 - 1
drivers/wasapi/audio_driver_wasapi.cpp

@@ -318,7 +318,7 @@ Error AudioDriverWASAPI::finish_device() {
 
 
 Error AudioDriverWASAPI::init() {
 Error AudioDriverWASAPI::init() {
 
 
-	mix_rate = GLOBAL_DEF("audio/mix_rate", DEFAULT_MIX_RATE);
+	mix_rate = GLOBAL_DEF_RST("audio/mix_rate", DEFAULT_MIX_RATE);
 
 
 	Error err = init_device();
 	Error err = init_device();
 	if (err != OK) {
 	if (err != OK) {

+ 1 - 1
drivers/xaudio2/audio_driver_xaudio2.cpp

@@ -50,7 +50,7 @@ Error AudioDriverXAudio2::init() {
 	speaker_mode = SPEAKER_MODE_STEREO;
 	speaker_mode = SPEAKER_MODE_STEREO;
 	channels = 2;
 	channels = 2;
 
 
-	int latency = GLOBAL_DEF("audio/output_latency", 25);
+	int latency = GLOBAL_DEF_RST("audio/output_latency", 25);
 	buffer_size = closest_power_of_2(latency * mix_rate / 1000);
 	buffer_size = closest_power_of_2(latency * mix_rate / 1000);
 
 
 	samples_in = memnew_arr(int32_t, buffer_size * channels);
 	samples_in = memnew_arr(int32_t, buffer_size * channels);

+ 38 - 3
editor/editor_inspector.cpp

@@ -1507,12 +1507,19 @@ void EditorInspector::update_tree() {
 			checked = p.usage & PROPERTY_USAGE_CHECKED;
 			checked = p.usage & PROPERTY_USAGE_CHECKED;
 		}
 		}
 
 
+		if (p.usage & PROPERTY_USAGE_RESTART_IF_CHANGED) {
+			restart_request_props.insert(p.name);
+		}
+
 		String doc_hint;
 		String doc_hint;
 
 
 		if (use_doc_hints) {
 		if (use_doc_hints) {
 
 
 			StringName classname = object->get_class_name();
 			StringName classname = object->get_class_name();
-			StringName propname = p.name;
+			if (object_class != String()) {
+				classname = object_class;
+			}
+			StringName propname = property_prefix + p.name;
 			String descr;
 			String descr;
 			bool found = false;
 			bool found = false;
 
 
@@ -1580,9 +1587,9 @@ void EditorInspector::update_tree() {
 					ep->connect("resource_selected", this, "_resource_selected", varray(), CONNECT_DEFERRED);
 					ep->connect("resource_selected", this, "_resource_selected", varray(), CONNECT_DEFERRED);
 					ep->connect("object_id_selected", this, "_object_id_selected", varray(), CONNECT_DEFERRED);
 					ep->connect("object_id_selected", this, "_object_id_selected", varray(), CONNECT_DEFERRED);
 					if (doc_hint != String()) {
 					if (doc_hint != String()) {
-						ep->set_tooltip(TTR("Property: ") + p.name + "\n\n" + doc_hint);
+						ep->set_tooltip(TTR("Property: ") + property_prefix + p.name + "\n\n" + doc_hint);
 					} else {
 					} else {
-						ep->set_tooltip(TTR("Property: ") + p.name);
+						ep->set_tooltip(TTR("Property: ") + property_prefix + p.name);
 					}
 					}
 					ep->set_draw_red(draw_red);
 					ep->set_draw_red(draw_red);
 					ep->set_use_folding(use_folding);
 					ep->set_use_folding(use_folding);
@@ -1659,6 +1666,7 @@ void EditorInspector::_clear() {
 	editor_property_map.clear();
 	editor_property_map.clear();
 	sections.clear();
 	sections.clear();
 	pending.clear();
 	pending.clear();
+	restart_request_props.clear();
 }
 }
 
 
 void EditorInspector::refresh() {
 void EditorInspector::refresh() {
@@ -1902,6 +1910,10 @@ void EditorInspector::_property_changed(const String &p_path, const Variant &p_v
 
 
 	if (changing)
 	if (changing)
 		this->changing--;
 		this->changing--;
+
+	if (restart_request_props.has(p_path)) {
+		emit_signal("restart_requested");
+	}
 }
 }
 
 
 void EditorInspector::_property_changed_update_all(const String &p_path, const Variant &p_value) {
 void EditorInspector::_property_changed_update_all(const String &p_path, const Variant &p_value) {
@@ -1921,6 +1933,9 @@ void EditorInspector::_multiple_properties_changed(Vector<String> p_paths, Array
 	undo_redo->create_action(TTR("Set Multiple:") + " " + names, UndoRedo::MERGE_ENDS);
 	undo_redo->create_action(TTR("Set Multiple:") + " " + names, UndoRedo::MERGE_ENDS);
 	for (int i = 0; i < p_paths.size(); i++) {
 	for (int i = 0; i < p_paths.size(); i++) {
 		_edit_set(p_paths[i], p_values[i], false, "");
 		_edit_set(p_paths[i], p_values[i], false, "");
+		if (restart_request_props.has(p_paths[i])) {
+			emit_signal("restart_requested");
+		}
 	}
 	}
 	changing++;
 	changing++;
 	undo_redo->commit_action();
 	undo_redo->commit_action();
@@ -1993,6 +2008,8 @@ void EditorInspector::_property_selected(const String &p_path, int p_focusable)
 				E->get()->deselect();
 				E->get()->deselect();
 		}
 		}
 	}
 	}
+
+	emit_signal("property_selected", p_path);
 }
 }
 
 
 void EditorInspector::_object_id_selected(const String &p_path, ObjectID p_id) {
 void EditorInspector::_object_id_selected(const String &p_path, ObjectID p_id) {
@@ -2090,6 +2107,21 @@ void EditorInspector::_vscroll_changed(double p_offset) {
 		scroll_cache[object->get_instance_id()] = p_offset;
 		scroll_cache[object->get_instance_id()] = p_offset;
 	}
 	}
 }
 }
+void EditorInspector::set_property_prefix(const String &p_prefix) {
+	property_prefix = p_prefix;
+}
+
+String EditorInspector::get_property_prefix() const {
+	return property_prefix;
+}
+
+void EditorInspector::set_object_class(const String &p_class) {
+	object_class = p_class;
+}
+
+String EditorInspector::get_object_class() const {
+	return object_class;
+}
 
 
 void EditorInspector::_bind_methods() {
 void EditorInspector::_bind_methods() {
 
 
@@ -2110,9 +2142,12 @@ void EditorInspector::_bind_methods() {
 
 
 	ClassDB::bind_method("refresh", &EditorInspector::refresh);
 	ClassDB::bind_method("refresh", &EditorInspector::refresh);
 
 
+	ADD_SIGNAL(MethodInfo("property_selected", PropertyInfo(Variant::STRING, "property")));
 	ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING, "property")));
 	ADD_SIGNAL(MethodInfo("property_keyed", PropertyInfo(Variant::STRING, "property")));
 	ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::OBJECT, "res"), PropertyInfo(Variant::STRING, "prop")));
 	ADD_SIGNAL(MethodInfo("resource_selected", PropertyInfo(Variant::OBJECT, "res"), PropertyInfo(Variant::STRING, "prop")));
 	ADD_SIGNAL(MethodInfo("object_id_selected", PropertyInfo(Variant::INT, "id")));
 	ADD_SIGNAL(MethodInfo("object_id_selected", PropertyInfo(Variant::INT, "id")));
+	ADD_SIGNAL(MethodInfo("property_edited", PropertyInfo(Variant::STRING, "property")));
+	ADD_SIGNAL(MethodInfo("restart_requested"));
 }
 }
 
 
 EditorInspector::EditorInspector() {
 EditorInspector::EditorInspector() {

+ 10 - 0
editor/editor_inspector.h

@@ -267,9 +267,13 @@ class EditorInspector : public ScrollContainer {
 
 
 	Map<StringName, Map<StringName, String> > descr_cache;
 	Map<StringName, Map<StringName, String> > descr_cache;
 	Map<StringName, String> class_descr_cache;
 	Map<StringName, String> class_descr_cache;
+	Set<StringName> restart_request_props;
 
 
 	Map<ObjectID, int> scroll_cache;
 	Map<ObjectID, int> scroll_cache;
 
 
+	String property_prefix; //used for sectioned inspector
+	String object_class;
+
 	void _edit_set(const String &p_name, const Variant &p_value, bool p_refresh_all, const String &p_changed_field);
 	void _edit_set(const String &p_name, const Variant &p_value, bool p_refresh_all, const String &p_changed_field);
 
 
 	void _property_changed(const String &p_path, const Variant &p_value, bool changing = false);
 	void _property_changed(const String &p_path, const Variant &p_value, bool changing = false);
@@ -343,6 +347,12 @@ public:
 	void set_scroll_offset(int p_offset);
 	void set_scroll_offset(int p_offset);
 	int get_scroll_offset() const;
 	int get_scroll_offset() const;
 
 
+	void set_property_prefix(const String &p_prefix);
+	String get_property_prefix() const;
+
+	void set_object_class(const String &p_class);
+	String get_object_class() const;
+
 	void set_use_sub_inspector_bg(bool p_enable);
 	void set_use_sub_inspector_bg(bool p_enable);
 
 
 	EditorInspector();
 	EditorInspector();

+ 89 - 8
editor/editor_node.cpp

@@ -1068,6 +1068,32 @@ void EditorNode::_save_scene(String p_file, int idx) {
 	}
 	}
 }
 }
 
 
+void EditorNode::save_all_scenes_and_restart() {
+
+	_menu_option_confirm(RUN_STOP, true);
+	exiting = true;
+
+	_save_all_scenes();
+
+	String to_reopen;
+	if (get_tree()->get_edited_scene_root()) {
+		to_reopen = get_tree()->get_edited_scene_root()->get_filename();
+	}
+
+	get_tree()->quit();
+	String exec = OS::get_singleton()->get_executable_path();
+
+	List<String> args;
+	args.push_back("--path");
+	args.push_back(ProjectSettings::get_singleton()->get_resource_path());
+	args.push_back("-e");
+	if (to_reopen != String()) {
+		args.push_back(to_reopen);
+	}
+
+	OS::get_singleton()->set_restart_on_exit(true, args);
+}
+
 void EditorNode::_save_all_scenes() {
 void EditorNode::_save_all_scenes() {
 
 
 	for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
 	for (int i = 0; i < editor_data.get_edited_scene_count(); i++) {
@@ -2204,6 +2230,13 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
 			about->popup_centered_minsize(Size2(780, 500) * EDSCALE);
 			about->popup_centered_minsize(Size2(780, 500) * EDSCALE);
 		} break;
 		} break;
 
 
+		case SET_VIDEO_DRIVER_SAVE_AND_RESTART: {
+
+			ProjectSettings::get_singleton()->set("rendering/quality/driver/driver_name", video_driver_request);
+			ProjectSettings::get_singleton()->save();
+
+			save_all_scenes_and_restart();
+		} break;
 		default: {
 		default: {
 			if (p_option >= IMPORT_PLUGIN_BASE) {
 			if (p_option >= IMPORT_PLUGIN_BASE) {
 			}
 			}
@@ -4390,6 +4423,21 @@ void EditorNode::_bottom_panel_raise_toggled(bool p_pressed) {
 	}
 	}
 }
 }
 
 
+void EditorNode::_video_driver_selected(int p_which) {
+
+	String driver = video_driver->get_item_metadata(p_which);
+
+	String current = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver());
+
+	if (driver == current) {
+		return;
+	}
+
+	video_driver_request = driver;
+	video_restart_dialog->popup_centered_minsize();
+	video_driver->select(video_driver_current);
+}
+
 void EditorNode::_bind_methods() {
 void EditorNode::_bind_methods() {
 
 
 	ClassDB::bind_method("_menu_option", &EditorNode::_menu_option);
 	ClassDB::bind_method("_menu_option", &EditorNode::_menu_option);
@@ -4460,6 +4508,8 @@ void EditorNode::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("_resources_reimported"), &EditorNode::_resources_reimported);
 	ClassDB::bind_method(D_METHOD("_resources_reimported"), &EditorNode::_resources_reimported);
 	ClassDB::bind_method(D_METHOD("_bottom_panel_raise_toggled"), &EditorNode::_bottom_panel_raise_toggled);
 	ClassDB::bind_method(D_METHOD("_bottom_panel_raise_toggled"), &EditorNode::_bottom_panel_raise_toggled);
 
 
+	ClassDB::bind_method(D_METHOD("_video_driver_selected"), &EditorNode::_video_driver_selected);
+
 	ADD_SIGNAL(MethodInfo("play_pressed"));
 	ADD_SIGNAL(MethodInfo("play_pressed"));
 	ADD_SIGNAL(MethodInfo("pause_pressed"));
 	ADD_SIGNAL(MethodInfo("pause_pressed"));
 	ADD_SIGNAL(MethodInfo("stop_pressed"));
 	ADD_SIGNAL(MethodInfo("stop_pressed"));
@@ -4656,19 +4706,19 @@ EditorNode::EditorNode() {
 	ClassDB::set_class_enabled("RootMotionView", true);
 	ClassDB::set_class_enabled("RootMotionView", true);
 
 
 	//defs here, use EDITOR_GET in logic
 	//defs here, use EDITOR_GET in logic
-	EDITOR_DEF("interface/scene_tabs/always_show_close_button", false);
-	EDITOR_DEF("interface/scene_tabs/resize_if_many_tabs", true);
-	EDITOR_DEF("interface/scene_tabs/minimum_width", 50);
+	EDITOR_DEF_RST("interface/scene_tabs/always_show_close_button", false);
+	EDITOR_DEF_RST("interface/scene_tabs/resize_if_many_tabs", true);
+	EDITOR_DEF_RST("interface/scene_tabs/minimum_width", 50);
 	EDITOR_DEF("run/output/always_clear_output_on_play", true);
 	EDITOR_DEF("run/output/always_clear_output_on_play", true);
 	EDITOR_DEF("run/output/always_open_output_on_play", true);
 	EDITOR_DEF("run/output/always_open_output_on_play", true);
 	EDITOR_DEF("run/output/always_close_output_on_stop", true);
 	EDITOR_DEF("run/output/always_close_output_on_stop", true);
 	EDITOR_DEF("run/auto_save/save_before_running", true);
 	EDITOR_DEF("run/auto_save/save_before_running", true);
-	EDITOR_DEF("interface/editor/save_each_scene_on_quit", true);
+	EDITOR_DEF_RST("interface/editor/save_each_scene_on_quit", true);
 	EDITOR_DEF("interface/editor/quit_confirmation", true);
 	EDITOR_DEF("interface/editor/quit_confirmation", true);
-	EDITOR_DEF("interface/scene_tabs/restore_scenes_on_load", false);
-	EDITOR_DEF("interface/scene_tabs/show_thumbnail_on_hover", true);
-	EDITOR_DEF("interface/inspector/capitalize_properties", true);
-	EDITOR_DEF("interface/inspector/disable_folding", false);
+	EDITOR_DEF_RST("interface/scene_tabs/restore_scenes_on_load", false);
+	EDITOR_DEF_RST("interface/scene_tabs/show_thumbnail_on_hover", true);
+	EDITOR_DEF_RST("interface/inspector/capitalize_properties", true);
+	EDITOR_DEF_RST("interface/inspector/disable_folding", false);
 	EDITOR_DEF("interface/inspector/open_resources_in_current_inspector", true);
 	EDITOR_DEF("interface/inspector/open_resources_in_current_inspector", true);
 	EDITOR_DEF("interface/inspector/resources_types_to_open_in_new_inspector", "SpatialMaterial");
 	EDITOR_DEF("interface/inspector/resources_types_to_open_in_new_inspector", "SpatialMaterial");
 	EDITOR_DEF("run/auto_save/save_before_running", true);
 	EDITOR_DEF("run/auto_save/save_before_running", true);
@@ -5191,6 +5241,37 @@ EditorNode::EditorNode() {
 	play_custom_scene_button->set_shortcut(ED_SHORTCUT("editor/play_custom_scene", TTR("Play Custom Scene"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F5));
 	play_custom_scene_button->set_shortcut(ED_SHORTCUT("editor/play_custom_scene", TTR("Play Custom Scene"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F5));
 #endif
 #endif
 
 
+	video_driver = memnew(OptionButton);
+	video_driver->set_flat(true);
+	video_driver->set_focus_mode(Control::FOCUS_NONE);
+	video_driver->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
+	String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/quality/driver/driver_name"].hint_string;
+	String current_video_driver = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver());
+	menu_hb->add_child(video_driver);
+	video_driver_current = 0;
+	for (int i = 0; i < video_drivers.get_slice_count(","); i++) {
+		String driver = video_drivers.get_slice(",", i);
+		if (gui_base->has_icon(driver, "EditorIcons")) {
+			video_driver->add_icon_item(gui_base->get_icon(driver, "EditorIcons"), "");
+		} else {
+			video_driver->add_item(driver);
+		}
+
+		video_driver->set_item_metadata(i, driver);
+
+		if (current_video_driver == driver) {
+			video_driver->select(i);
+			video_driver_current = i;
+		}
+	}
+
+	video_driver->connect("item_selected", this, "_video_driver_selected");
+	video_restart_dialog = memnew(ConfirmationDialog);
+	video_restart_dialog->set_text(TTR("Changing the video driver requires restarting the editor."));
+	video_restart_dialog->get_ok()->set_text(TTR("Save & Restart"));
+	video_restart_dialog->connect("confirmed", this, "_menu_option", varray(SET_VIDEO_DRIVER_SAVE_AND_RESTART));
+	add_child(video_restart_dialog);
+
 	progress_hb = memnew(BackgroundProgress);
 	progress_hb = memnew(BackgroundProgress);
 
 
 	HBoxContainer *right_menu_hb = memnew(HBoxContainer);
 	HBoxContainer *right_menu_hb = memnew(HBoxContainer);

+ 11 - 0
editor/editor_node.h

@@ -182,6 +182,8 @@ private:
 		HELP_COMMUNITY,
 		HELP_COMMUNITY,
 		HELP_ABOUT,
 		HELP_ABOUT,
 
 
+		SET_VIDEO_DRIVER_SAVE_AND_RESTART,
+
 		IMPORT_PLUGIN_BASE = 100,
 		IMPORT_PLUGIN_BASE = 100,
 
 
 		TOOL_MENU_BASE = 1000
 		TOOL_MENU_BASE = 1000
@@ -194,6 +196,13 @@ private:
 	Control *gui_base;
 	Control *gui_base;
 	VBoxContainer *main_vbox;
 	VBoxContainer *main_vbox;
 	PanelContainer *play_button_panel;
 	PanelContainer *play_button_panel;
+	OptionButton *video_driver;
+
+	ConfirmationDialog *video_restart_dialog;
+
+	int video_driver_current;
+	String video_driver_request;
+	void _video_driver_selected(int);
 
 
 	//split
 	//split
 
 
@@ -745,6 +754,8 @@ public:
 	void add_tool_submenu_item(const String &p_name, PopupMenu *p_submenu);
 	void add_tool_submenu_item(const String &p_name, PopupMenu *p_submenu);
 	void remove_tool_menu_item(const String &p_name);
 	void remove_tool_menu_item(const String &p_name);
 
 
+	void save_all_scenes_and_restart();
+
 	void dim_editor(bool p_dimming);
 	void dim_editor(bool p_dimming);
 
 
 	void edit_current() { _edit_current(); };
 	void edit_current() { _edit_current(); };

+ 306 - 0
editor/editor_sectioned_inspector.cpp

@@ -0,0 +1,306 @@
+#include "editor_sectioned_inspector.h"
+#include "editor_scale.h"
+class SectionedInspectorFilter : public Object {
+
+	GDCLASS(SectionedInspectorFilter, Object);
+
+	Object *edited;
+	String section;
+	bool allow_sub;
+
+	bool _set(const StringName &p_name, const Variant &p_value) {
+
+		if (!edited)
+			return false;
+
+		String name = p_name;
+		if (section != "") {
+			name = section + "/" + name;
+		}
+
+		bool valid;
+		edited->set(name, p_value, &valid);
+		return valid;
+	}
+
+	bool _get(const StringName &p_name, Variant &r_ret) const {
+
+		if (!edited)
+			return false;
+
+		String name = p_name;
+		if (section != "") {
+			name = section + "/" + name;
+		}
+
+		bool valid = false;
+
+		r_ret = edited->get(name, &valid);
+		return valid;
+	}
+	void _get_property_list(List<PropertyInfo> *p_list) const {
+
+		if (!edited)
+			return;
+
+		List<PropertyInfo> pinfo;
+		edited->get_property_list(&pinfo);
+		for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
+
+			PropertyInfo pi = E->get();
+			int sp = pi.name.find("/");
+
+			if (pi.name == "resource_path" || pi.name == "resource_name" || pi.name == "resource_local_to_scene" || pi.name.begins_with("script/")) //skip resource stuff
+				continue;
+
+			if (sp == -1) {
+				pi.name = "global/" + pi.name;
+			}
+
+			if (pi.name.begins_with(section + "/")) {
+				pi.name = pi.name.replace_first(section + "/", "");
+				if (!allow_sub && pi.name.find("/") != -1)
+					continue;
+				p_list->push_back(pi);
+			}
+		}
+	}
+
+	bool property_can_revert(const String &p_name) {
+
+		return edited->call("property_can_revert", section + "/" + p_name);
+	}
+
+	Variant property_get_revert(const String &p_name) {
+
+		return edited->call("property_get_revert", section + "/" + p_name);
+	}
+
+protected:
+	static void _bind_methods() {
+
+		ClassDB::bind_method("property_can_revert", &SectionedInspectorFilter::property_can_revert);
+		ClassDB::bind_method("property_get_revert", &SectionedInspectorFilter::property_get_revert);
+	}
+
+public:
+	void set_section(const String &p_section, bool p_allow_sub) {
+
+		section = p_section;
+		allow_sub = p_allow_sub;
+		_change_notify();
+	}
+
+	void set_edited(Object *p_edited) {
+		edited = p_edited;
+		_change_notify();
+	}
+
+	SectionedInspectorFilter() {
+		edited = NULL;
+	}
+};
+
+void SectionedInspector::_bind_methods() {
+
+	ClassDB::bind_method("_section_selected", &SectionedInspector::_section_selected);
+	ClassDB::bind_method("_search_changed", &SectionedInspector::_search_changed);
+
+	ClassDB::bind_method("update_category_list", &SectionedInspector::update_category_list);
+}
+
+void SectionedInspector::_section_selected() {
+
+	if (!sections->get_selected())
+		return;
+
+	filter->set_section(sections->get_selected()->get_metadata(0), sections->get_selected()->get_children() == NULL);
+	inspector->set_property_prefix(String(sections->get_selected()->get_metadata(0)) + "/");
+}
+
+void SectionedInspector::set_current_section(const String &p_section) {
+
+	if (section_map.has(p_section)) {
+		section_map[p_section]->select(0);
+	}
+}
+
+String SectionedInspector::get_current_section() const {
+
+	if (sections->get_selected())
+		return sections->get_selected()->get_metadata(0);
+	else
+		return "";
+}
+
+String SectionedInspector::get_full_item_path(const String &p_item) {
+
+	String base = get_current_section();
+
+	if (base != "")
+		return base + "/" + p_item;
+	else
+		return p_item;
+}
+
+void SectionedInspector::edit(Object *p_object) {
+
+	if (!p_object) {
+		obj = -1;
+		sections->clear();
+
+		filter->set_edited(NULL);
+		inspector->edit(NULL);
+
+		return;
+	}
+
+	ObjectID id = p_object->get_instance_id();
+
+	inspector->set_object_class(p_object->get_class());
+
+	if (obj != id) {
+
+		obj = id;
+		update_category_list();
+
+		filter->set_edited(p_object);
+		inspector->edit(filter);
+
+		if (sections->get_root()->get_children()) {
+			sections->get_root()->get_children()->select(0);
+		}
+	} else {
+
+		update_category_list();
+	}
+}
+
+void SectionedInspector::update_category_list() {
+
+	String selected_category = get_current_section();
+	sections->clear();
+
+	Object *o = ObjectDB::get_instance(obj);
+
+	if (!o)
+		return;
+
+	List<PropertyInfo> pinfo;
+	o->get_property_list(&pinfo);
+
+	section_map.clear();
+
+	TreeItem *root = sections->create_item();
+	section_map[""] = root;
+
+	for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) {
+
+		PropertyInfo pi = E->get();
+
+		if (pi.usage & PROPERTY_USAGE_CATEGORY)
+			continue;
+		else if (!(pi.usage & PROPERTY_USAGE_EDITOR))
+			continue;
+
+		if (pi.name.find(":") != -1 || pi.name == "script" || pi.name == "resource_name" || pi.name == "resource_path" || pi.name == "resource_local_to_scene")
+			continue;
+
+		if (search_box && search_box->get_text() != String() && pi.name.findn(search_box->get_text()) == -1)
+			continue;
+
+		int sp = pi.name.find("/");
+		if (sp == -1)
+			pi.name = "Global/" + pi.name;
+
+		Vector<String> sectionarr = pi.name.split("/");
+		String metasection;
+
+		int sc = MIN(2, sectionarr.size() - 1);
+
+		for (int i = 0; i < sc; i++) {
+
+			TreeItem *parent = section_map[metasection];
+			parent->set_custom_bg_color(0, get_color("prop_subsection", "Editor"));
+
+			if (i > 0) {
+				metasection += "/" + sectionarr[i];
+			} else {
+				metasection = sectionarr[i];
+			}
+
+			if (!section_map.has(metasection)) {
+				TreeItem *ms = sections->create_item(parent);
+				section_map[metasection] = ms;
+				ms->set_text(0, sectionarr[i].capitalize());
+				ms->set_metadata(0, metasection);
+				ms->set_selectable(0, false);
+			}
+
+			if (i == sc - 1) {
+				//if it has children, make selectable
+				section_map[metasection]->set_selectable(0, true);
+			}
+		}
+	}
+
+	if (section_map.has(selected_category)) {
+		section_map[selected_category]->select(0);
+	}
+
+	inspector->update_tree();
+}
+
+void SectionedInspector::register_search_box(LineEdit *p_box) {
+
+	search_box = p_box;
+	inspector->register_text_enter(p_box);
+	search_box->connect("text_changed", this, "_search_changed");
+}
+
+void SectionedInspector::_search_changed(const String &p_what) {
+
+	update_category_list();
+}
+
+EditorInspector *SectionedInspector::get_inspector() {
+
+	return inspector;
+}
+
+SectionedInspector::SectionedInspector() {
+
+	obj = -1;
+
+	search_box = NULL;
+
+	add_constant_override("autohide", 1); // Fixes the dragger always showing up
+
+	VBoxContainer *left_vb = memnew(VBoxContainer);
+	left_vb->set_custom_minimum_size(Size2(170, 0) * EDSCALE);
+	add_child(left_vb);
+
+	sections = memnew(Tree);
+	sections->set_v_size_flags(SIZE_EXPAND_FILL);
+	sections->set_hide_root(true);
+
+	left_vb->add_child(sections, true);
+
+	VBoxContainer *right_vb = memnew(VBoxContainer);
+	right_vb->set_custom_minimum_size(Size2(300, 0) * EDSCALE);
+	right_vb->set_h_size_flags(SIZE_EXPAND_FILL);
+	add_child(right_vb);
+
+	filter = memnew(SectionedInspectorFilter);
+	inspector = memnew(EditorInspector);
+	inspector->set_v_size_flags(SIZE_EXPAND_FILL);
+	right_vb->add_child(inspector, true);
+	inspector->set_use_doc_hints(true);
+
+	sections->connect("cell_selected", this, "_section_selected");
+}
+
+SectionedInspector::~SectionedInspector() {
+
+	memdelete(filter);
+}

+ 42 - 0
editor/editor_sectioned_inspector.h

@@ -0,0 +1,42 @@
+#ifndef EDITOR_SECTIONED_INSPECTOR_H
+#define EDITOR_SECTIONED_INSPECTOR_H
+
+#include "editor/editor_inspector.h"
+#include "scene/gui/split_container.h"
+#include "scene/gui/tree.h"
+
+class SectionedInspectorFilter;
+
+class SectionedInspector : public HSplitContainer {
+
+	GDCLASS(SectionedInspector, HSplitContainer);
+
+	ObjectID obj;
+
+	Tree *sections;
+	SectionedInspectorFilter *filter;
+
+	Map<String, TreeItem *> section_map;
+	EditorInspector *inspector;
+	LineEdit *search_box;
+
+	static void _bind_methods();
+	void _section_selected();
+
+	void _search_changed(const String &p_what);
+
+public:
+	void register_search_box(LineEdit *p_box);
+	EditorInspector *get_inspector();
+	void edit(Object *p_object);
+	String get_full_item_path(const String &p_item);
+
+	void set_current_section(const String &p_section);
+	String get_current_section() const;
+
+	void update_category_list();
+
+	SectionedInspector();
+	~SectionedInspector();
+};
+#endif // EDITOR_SECTIONED_INSPECTOR_H

+ 22 - 4
editor/editor_settings.cpp

@@ -165,6 +165,7 @@ struct _EVCSort {
 	Variant::Type type;
 	Variant::Type type;
 	int order;
 	int order;
 	bool save;
 	bool save;
+	bool restart_if_changed;
 
 
 	bool operator<(const _EVCSort &p_vcs) const { return order < p_vcs.order; }
 	bool operator<(const _EVCSort &p_vcs) const { return order < p_vcs.order; }
 };
 };
@@ -188,6 +189,7 @@ void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const {
 		vc.order = v->order;
 		vc.order = v->order;
 		vc.type = v->variant.get_type();
 		vc.type = v->variant.get_type();
 		vc.save = v->save;
 		vc.save = v->save;
+		vc.restart_if_changed = v->restart_if_changed;
 
 
 		vclist.insert(vc);
 		vclist.insert(vc);
 	}
 	}
@@ -210,6 +212,10 @@ void EditorSettings::_get_property_list(List<PropertyInfo> *p_list) const {
 		if (hints.has(E->get().name))
 		if (hints.has(E->get().name))
 			pi = hints[E->get().name];
 			pi = hints[E->get().name];
 
 
+		if (E->get().restart_if_changed) {
+			pi.usage |= PROPERTY_USAGE_RESTART_IF_CHANGED;
+		}
+
 		p_list->push_back(pi);
 		p_list->push_back(pi);
 	}
 	}
 
 
@@ -280,6 +286,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
 		}
 		}
 
 
 		_initial_set("interface/editor/editor_language", best);
 		_initial_set("interface/editor/editor_language", best);
+		set_restart_if_changed("interface/editor/editor_language", true);
 		hints["interface/editor/editor_language"] = PropertyInfo(Variant::STRING, "interface/editor/editor_language", PROPERTY_HINT_ENUM, lang_hint, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
 		hints["interface/editor/editor_language"] = PropertyInfo(Variant::STRING, "interface/editor/editor_language", PROPERTY_HINT_ENUM, lang_hint, PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
 	}
 	}
 
 
@@ -1017,6 +1024,14 @@ void EditorSettings::raise_order(const String &p_setting) {
 	props[p_setting].order = ++last_order;
 	props[p_setting].order = ++last_order;
 }
 }
 
 
+void EditorSettings::set_restart_if_changed(const StringName &p_setting, bool p_restart) {
+	_THREAD_SAFE_METHOD_
+
+	if (!props.has(p_setting))
+		return;
+	props[p_setting].restart_if_changed = p_restart;
+}
+
 void EditorSettings::set_initial_value(const StringName &p_setting, const Variant &p_value, bool p_update_current) {
 void EditorSettings::set_initial_value(const StringName &p_setting, const Variant &p_value, bool p_update_current) {
 
 
 	_THREAD_SAFE_METHOD_
 	_THREAD_SAFE_METHOD_
@@ -1030,16 +1045,19 @@ void EditorSettings::set_initial_value(const StringName &p_setting, const Varian
 	}
 	}
 }
 }
 
 
-Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default) {
+Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default, bool p_restart_if_changed) {
 
 
 	Variant ret = p_default;
 	Variant ret = p_default;
-	if (EditorSettings::get_singleton()->has_setting(p_setting))
+	if (EditorSettings::get_singleton()->has_setting(p_setting)) {
 		ret = EditorSettings::get_singleton()->get(p_setting);
 		ret = EditorSettings::get_singleton()->get(p_setting);
-	else
+	} else {
 		EditorSettings::get_singleton()->set_manually(p_setting, p_default);
 		EditorSettings::get_singleton()->set_manually(p_setting, p_default);
+		EditorSettings::get_singleton()->set_restart_if_changed(p_setting, p_restart_if_changed);
+	}
 
 
-	if (!EditorSettings::get_singleton()->has_default_value(p_setting))
+	if (!EditorSettings::get_singleton()->has_default_value(p_setting)) {
 		EditorSettings::get_singleton()->set_initial_value(p_setting, p_default);
 		EditorSettings::get_singleton()->set_initial_value(p_setting, p_default);
+	}
 
 
 	return ret;
 	return ret;
 }
 }

+ 6 - 1
editor/editor_settings.h

@@ -70,6 +70,7 @@ private:
 		bool has_default_value;
 		bool has_default_value;
 		bool hide_from_editor;
 		bool hide_from_editor;
 		bool save;
 		bool save;
+		bool restart_if_changed;
 		VariantContainer() {
 		VariantContainer() {
 			variant = Variant();
 			variant = Variant();
 			initial = Variant();
 			initial = Variant();
@@ -77,6 +78,7 @@ private:
 			hide_from_editor = false;
 			hide_from_editor = false;
 			has_default_value = false;
 			has_default_value = false;
 			save = false;
 			save = false;
+			restart_if_changed = false;
 		}
 		}
 		VariantContainer(const Variant &p_variant, int p_order) {
 		VariantContainer(const Variant &p_variant, int p_order) {
 			variant = p_variant;
 			variant = p_variant;
@@ -85,6 +87,7 @@ private:
 			hide_from_editor = false;
 			hide_from_editor = false;
 			has_default_value = false;
 			has_default_value = false;
 			save = false;
 			save = false;
+			restart_if_changed = false;
 		}
 		}
 	};
 	};
 
 
@@ -145,6 +148,7 @@ public:
 	void erase(const String &p_setting);
 	void erase(const String &p_setting);
 	void raise_order(const String &p_setting);
 	void raise_order(const String &p_setting);
 	void set_initial_value(const StringName &p_setting, const Variant &p_value, bool p_update_current = false);
 	void set_initial_value(const StringName &p_setting, const Variant &p_value, bool p_update_current = false);
+	void set_restart_if_changed(const StringName &p_setting, bool p_restart);
 	void set_manually(const StringName &p_setting, const Variant &p_value, bool p_emit_signal = false) {
 	void set_manually(const StringName &p_setting, const Variant &p_value, bool p_emit_signal = false) {
 		if (p_emit_signal)
 		if (p_emit_signal)
 			_set(p_setting, p_value);
 			_set(p_setting, p_value);
@@ -200,7 +204,8 @@ public:
 //not a macro any longer
 //not a macro any longer
 
 
 #define EDITOR_DEF(m_var, m_val) _EDITOR_DEF(m_var, Variant(m_val))
 #define EDITOR_DEF(m_var, m_val) _EDITOR_DEF(m_var, Variant(m_val))
-Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default);
+#define EDITOR_DEF_RST(m_var, m_val) _EDITOR_DEF(m_var, Variant(m_val), true)
+Variant _EDITOR_DEF(const String &p_setting, const Variant &p_default, bool p_restart_if_changed = false);
 
 
 #define EDITOR_GET(m_var) _EDITOR_GET(m_var)
 #define EDITOR_GET(m_var) _EDITOR_GET(m_var)
 Variant _EDITOR_GET(const String &p_setting);
 Variant _EDITOR_GET(const String &p_setting);

+ 2 - 1
editor/editor_spin_slider.cpp

@@ -268,7 +268,8 @@ void EditorSpinSlider::_notification(int p_what) {
 		update();
 		update();
 	}
 	}
 	if (p_what == NOTIFICATION_FOCUS_ENTER) {
 	if (p_what == NOTIFICATION_FOCUS_ENTER) {
-		/* Sorry, I dont like this, it makes navigating the different fields with arrows more difficult
+		/* Sorry, I dont like this, it makes navigating the different fields with arrows more difficult.
+		 * Just press enter to edit.
 		 * if (!Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT) && !value_input_just_closed) {
 		 * if (!Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT) && !value_input_just_closed) {
 			_focus_entered();
 			_focus_entered();
 		}*/
 		}*/

File diff suppressed because it is too large
+ 55 - 0
editor/icons/icon_g_l_e_s_2.svg


File diff suppressed because it is too large
+ 54 - 0
editor/icons/icon_g_l_e_s_3.svg


+ 127 - 0
editor/icons/icon_vulkan.svg

@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="svg2"
+   width="48"
+   height="16"
+   viewBox="0 0 47.999999 16"
+   sodipodi:docname="icon_vulkan.svg"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1853"
+     inkscape:window-height="1016"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="10.24"
+     inkscape:cx="9.4970674"
+     inkscape:cy="11.192118"
+     inkscape:window-x="67"
+     inkscape:window-y="27"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g8" />
+  <path
+     style="fill:#000000;stroke-width:1.06666672"
+     d=""
+     id="path819"
+     inkscape:connector-curvature="0" />
+  <path
+     style="fill:#000000;stroke-width:1.06666672"
+     d=""
+     id="path817"
+     inkscape:connector-curvature="0" />
+  <g
+     transform="matrix(0.04333868,0,0,0.04333868,-4.0493236,-3.7704963)"
+     id="g8">
+    <path
+       inkscape:connector-curvature="0"
+       d="m 724.1,432.41989 h -40.6 c 0,0 0,-99 0,-129.7 13,7.2 30.1,20.5 40.6,33.3 z"
+       id="path10"
+       style="fill:#e6555a;fill-opacity:1" />
+    <g
+       id="g12"
+       style="fill:#e6555a;fill-opacity:1"
+       transform="translate(0,47.319882)">
+      <path
+         inkscape:connector-curvature="0"
+         d="m 381.8,385.1 h -50.6 l -66,-204 h 46 l 45.4,143.5 h 0.6 l 46,-143.5 h 46.3 z"
+         id="path14"
+         style="fill:#e6555a;fill-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         d="M 585.5,385.1 H 546.9 V 364.5 H 546 c -5.1,8.6 -11.8,14.8 -20,18.6 -8.2,3.8 -16.6,5.7 -25.1,5.7 -10.9,0 -19.8,-1.4 -26.7,-4.3 -7,-2.9 -12.4,-6.9 -16.4,-12.1 -4,-5.2 -6.8,-11.6 -8.4,-19.1 -1.6,-7.5 -2.4,-15.9 -2.4,-25 v -90.9 h 40.6 v 83.4 c 0,12.2 1.9,21.3 5.7,27.3 3.8,6 10.6,9 20.3,9 11,0 19.1,-3.3 24,-9.9 5,-6.6 7.4,-17.4 7.4,-32.4 v -77.4 h 40.6 v 147.7 z"
+         id="path16"
+         style="fill:#e6555a;fill-opacity:1" />
+    </g>
+    <polygon
+       points="730.8,296.2 730.7,290.5 781.9,237.3 829.9,237.3 774.2,291.6 836.2,385.1 787,385.1 "
+       id="polygon18"
+       style="fill:#e6555a;fill-opacity:1"
+       transform="translate(0,47.319882)" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 843.6,330.11989 c 0.6,-9.5 3,-17.4 7.2,-23.7 4.2,-6.3 9.5,-11.3 16,-15.1 6.5,-3.8 13.8,-6.5 21.9,-8.1 8.1,-1.6 16.2,-2.4 24.4,-2.4 7.4,0 15,0.5 22.6,1.6 7.6,1.1 14.6,3.1 20.9,6.1 6.3,3.1 11.4,7.3 15.4,12.7 4,5.4 6,12.6 6,21.6 v 76.9 c 0,6.7 0.4,13.1 1.1,19.1 0.8,6.1 2.1,10.7 4,13.7 h -41.2 c -0.8,-2.3 -1.4,-4.6 -1.9,-7 -0.5,-2.4 -0.8,-4.8 -1,-7.3 -6.5,6.7 -14.1,11.3 -22.9,14 -8.8,2.7 -17.7,4 -26.9,4 -7,0 -13.6,-0.9 -19.7,-2.6 -6.1,-1.7 -11.4,-4.4 -16,-8 -4.6,-3.6 -8.2,-8.2 -10.7,-13.7 -2.6,-5.5 -3.9,-12.1 -3.9,-19.7 0,-8.4 1.5,-15.3 4.4,-20.7 3,-5.4 6.8,-9.8 11.4,-13 4.7,-3.2 10,-5.7 16,-7.3 6,-1.6 12,-2.9 18.1,-3.9 6.1,-0.9 12.1,-1.7 18,-2.3 5.9,-0.6 11.1,-1.4 15.7,-2.6 4.6,-1.1 8.2,-2.8 10.9,-5 2.7,-2.2 3.9,-5.4 3.7,-9.6 0,-4.4 -0.7,-7.9 -2.2,-10.4 -1.4,-2.6 -3.3,-4.6 -5.7,-6 -2.4,-1.4 -5.1,-2.4 -8.3,-2.9 -3.1,-0.5 -6.5,-0.7 -10.1,-0.7 -8,0 -14.3,1.7 -18.9,5.1 -4.6,3.4 -7.2,9.1 -8,17.1 h -40.3 z m 93.8,30 c -1.7,1.5 -3.9,2.7 -6.4,3.6 -2.6,0.9 -5.3,1.6 -8.3,2.2 -2.9,0.6 -6,1 -9.3,1.4 -3.2,0.4 -6.5,0.9 -9.7,1.4 -3,0.6 -6,1.3 -9,2.3 -3,1 -5.5,2.2 -7.7,3.9 -2.2,1.6 -4,3.7 -5.3,6.1 -1.3,2.5 -2,5.6 -2,9.4 0,3.6 0.7,6.7 2,9.1 1.3,2.5 3.1,4.4 5.4,5.9 2.3,1.4 5,2.4 8,3 3.1,0.6 6.2,0.9 9.4,0.9 8,0 14.2,-1.3 18.6,-4 4.4,-2.7 7.6,-5.9 9.7,-9.6 2.1,-3.7 3.4,-7.5 3.9,-11.3 0.5,-3.8 0.7,-6.9 0.7,-9.1 z"
+       id="path20"
+       style="fill:#e6555a;fill-opacity:1" />
+    <path
+       inkscape:connector-curvature="0"
+       d="m 1004.2,284.61989 h 38.6 v 20.6 h 0.9 c 5.1,-8.6 11.8,-14.8 20,-18.7 8.2,-3.9 16.6,-5.9 25.1,-5.9 10.9,0 19.8,1.5 26.7,4.4 7,3 12.4,7.1 16.4,12.3 4,5.2 6.8,11.6 8.4,19.1 1.6,7.5 2.4,15.9 2.4,25 v 90.9 h -40.6 v -83.4 c 0,-12.2 -1.9,-21.3 -5.7,-27.3 -3.8,-6 -10.6,-9 -20.3,-9 -11,0 -19,3.3 -24,9.9 -5,6.6 -7.4,17.4 -7.4,32.4 v 77.4 h -40.6 v -147.7 z"
+       id="path22"
+       style="fill:#e6555a;fill-opacity:1" />
+    <g
+       id="g24"
+       style="fill:#e6555a;fill-opacity:1"
+       transform="translate(0,47.319882)">
+      <path
+         inkscape:connector-curvature="0"
+         d="M 612.4,211.8 V 385 H 653 V 234.2 c -13.1,-8 -26.6,-15.5 -40.6,-22.4 z"
+         id="path26"
+         style="fill:#e6555a;fill-opacity:1" />
+    </g>
+    <path
+       inkscape:connector-curvature="0"
+       d="m 198.4,266.51989 c 23.5,-68.9 164.2,-94.2 314.1,-56.4 90,22.6 163.5,66.5 211.5,109.9 -21.7,-57.6 -127.3,-139.6 -272.8,-167.7 -164.5,-31.8 -326.7,-3.9 -346.8,69.1 -14.5,52.7 49.2,114.5 147.7,156.7 -44.3,-35.8 -65.8,-76 -53.7,-111.6 z"
+       id="path28"
+       style="fill:#e6555a;fill-opacity:1" />
+    <g
+       id="g30"
+       style="fill:#e6555a;fill-opacity:1"
+       transform="translate(0,47.319882)">
+      <path
+         inkscape:connector-curvature="0"
+         d="M 724.2,247.6 V 181 h -40.6 v 20.2 c 17.3,15.5 31,31.2 40.6,46.4 z"
+         id="path32"
+         style="fill:#e6555a;fill-opacity:1" />
+    </g>
+  </g>
+</svg>

+ 57 - 16
editor/project_settings_editor.cpp

@@ -106,6 +106,12 @@ void ProjectSettingsEditor::_notification(int p_what) {
 				translation_res_file_open->add_filter("*." + E->get());
 				translation_res_file_open->add_filter("*." + E->get());
 				translation_res_option_file_open->add_filter("*." + E->get());
 				translation_res_option_file_open->add_filter("*." + E->get());
 			}
 			}
+
+			restart_close_button->set_icon(get_icon("Close", "EditorIcons"));
+			restart_container->add_style_override("panel", get_stylebox("bg", "Tree"));
+			restart_icon->set_texture(get_icon("StatusWarning", "EditorIcons"));
+			restart_label->add_color_override("font_color", get_color("error_color", "Editor"));
+
 		} break;
 		} break;
 		case NOTIFICATION_POPUP_HIDE: {
 		case NOTIFICATION_POPUP_HIDE: {
 			EditorSettings::get_singleton()->set("interface/dialogs/project_settings_bounds", get_rect());
 			EditorSettings::get_singleton()->set("interface/dialogs/project_settings_bounds", get_rect());
@@ -800,15 +806,13 @@ void ProjectSettingsEditor::popup_project_settings() {
 	plugin_settings->update_plugins();
 	plugin_settings->update_plugins();
 }
 }
 
 
-void ProjectSettingsEditor::_item_selected() {
+void ProjectSettingsEditor::_item_selected(const String &p_path) {
 
 
-	TreeItem *ti = globals_editor->get_property_editor()->get_property_tree()->get_selected();
-	if (!ti)
-		return;
-	if (!ti->get_parent())
+	String selected_path = p_path;
+	if (selected_path == String())
 		return;
 		return;
 	category->set_text(globals_editor->get_current_section());
 	category->set_text(globals_editor->get_current_section());
-	property->set_text(ti->get_text(0));
+	property->set_text(selected_path);
 	popup_copy_to_feature->set_disabled(false);
 	popup_copy_to_feature->set_disabled(false);
 }
 }
 
 
@@ -865,7 +869,7 @@ void ProjectSettingsEditor::_item_add() {
 
 
 void ProjectSettingsEditor::_item_del() {
 void ProjectSettingsEditor::_item_del() {
 
 
-	String path = globals_editor->get_property_editor()->get_selected_path();
+	String path = globals_editor->get_inspector()->get_selected_path();
 	if (path == String()) {
 	if (path == String()) {
 		EditorNode::get_singleton()->show_warning(TTR("Select a setting item first!"));
 		EditorNode::get_singleton()->show_warning(TTR("Select a setting item first!"));
 		return;
 		return;
@@ -1043,7 +1047,7 @@ void ProjectSettingsEditor::_copy_to_platform_about_to_show() {
 
 
 void ProjectSettingsEditor::_copy_to_platform(int p_which) {
 void ProjectSettingsEditor::_copy_to_platform(int p_which) {
 
 
-	String path = globals_editor->get_property_editor()->get_selected_path();
+	String path = globals_editor->get_inspector()->get_selected_path();
 	if (path == String()) {
 	if (path == String()) {
 		EditorNode::get_singleton()->show_warning(TTR("Select a setting item first!"));
 		EditorNode::get_singleton()->show_warning(TTR("Select a setting item first!"));
 		return;
 		return;
@@ -1572,7 +1576,7 @@ void ProjectSettingsEditor::_update_translations() {
 
 
 void ProjectSettingsEditor::_toggle_search_bar(bool p_pressed) {
 void ProjectSettingsEditor::_toggle_search_bar(bool p_pressed) {
 
 
-	globals_editor->get_property_editor()->set_use_filter(p_pressed);
+	globals_editor->get_inspector()->set_use_filter(p_pressed);
 
 
 	if (p_pressed) {
 	if (p_pressed) {
 
 
@@ -1593,7 +1597,7 @@ void ProjectSettingsEditor::_clear_search_box() {
 		return;
 		return;
 
 
 	search_box->clear();
 	search_box->clear();
-	globals_editor->get_property_editor()->update_tree();
+	globals_editor->get_inspector()->update_tree();
 }
 }
 
 
 void ProjectSettingsEditor::set_plugins_page() {
 void ProjectSettingsEditor::set_plugins_page() {
@@ -1606,6 +1610,18 @@ TabContainer *ProjectSettingsEditor::get_tabs() {
 	return tab_container;
 	return tab_container;
 }
 }
 
 
+void ProjectSettingsEditor::_editor_restart() {
+	EditorNode::get_singleton()->save_all_scenes_and_restart();
+}
+
+void ProjectSettingsEditor::_editor_restart_request() {
+	restart_container->show();
+}
+
+void ProjectSettingsEditor::_editor_restart_close() {
+	restart_container->hide();
+}
+
 void ProjectSettingsEditor::_bind_methods() {
 void ProjectSettingsEditor::_bind_methods() {
 
 
 	ClassDB::bind_method(D_METHOD("_item_selected"), &ProjectSettingsEditor::_item_selected);
 	ClassDB::bind_method(D_METHOD("_item_selected"), &ProjectSettingsEditor::_item_selected);
@@ -1651,6 +1667,10 @@ void ProjectSettingsEditor::_bind_methods() {
 
 
 	ClassDB::bind_method(D_METHOD("_copy_to_platform_about_to_show"), &ProjectSettingsEditor::_copy_to_platform_about_to_show);
 	ClassDB::bind_method(D_METHOD("_copy_to_platform_about_to_show"), &ProjectSettingsEditor::_copy_to_platform_about_to_show);
 
 
+	ClassDB::bind_method(D_METHOD("_editor_restart_request"), &ProjectSettingsEditor::_editor_restart_request);
+	ClassDB::bind_method(D_METHOD("_editor_restart"), &ProjectSettingsEditor::_editor_restart);
+	ClassDB::bind_method(D_METHOD("_editor_restart_close"), &ProjectSettingsEditor::_editor_restart_close);
+
 	ClassDB::bind_method(D_METHOD("get_tabs"), &ProjectSettingsEditor::get_tabs);
 	ClassDB::bind_method(D_METHOD("get_tabs"), &ProjectSettingsEditor::get_tabs);
 }
 }
 
 
@@ -1737,16 +1757,17 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) {
 	search_bar->add_child(clear_button);
 	search_bar->add_child(clear_button);
 	clear_button->connect("pressed", this, "_clear_search_box");
 	clear_button->connect("pressed", this, "_clear_search_box");
 
 
-	globals_editor = memnew(SectionedPropertyEditor);
+	globals_editor = memnew(SectionedInspector);
 	props_base->add_child(globals_editor);
 	props_base->add_child(globals_editor);
-	globals_editor->get_property_editor()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo());
-	globals_editor->get_property_editor()->set_property_selectable(true);
+	globals_editor->get_inspector()->set_undo_redo(EditorNode::get_singleton()->get_undo_redo());
+	globals_editor->get_inspector()->set_property_selectable(true);
 	//globals_editor->hide_top_label();
 	//globals_editor->hide_top_label();
 	globals_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	globals_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
 	globals_editor->register_search_box(search_box);
 	globals_editor->register_search_box(search_box);
-	globals_editor->get_property_editor()->get_property_tree()->connect("cell_selected", this, "_item_selected");
-	globals_editor->get_property_editor()->connect("property_toggled", this, "_item_checked", varray(), CONNECT_DEFERRED);
-	globals_editor->get_property_editor()->connect("property_edited", this, "_settings_prop_edited");
+	globals_editor->get_inspector()->connect("property_selected", this, "_item_selected");
+	//globals_editor->get_inspector()->connect("property_toggled", this, "_item_checked", varray(), CONNECT_DEFERRED);
+	globals_editor->get_inspector()->connect("property_edited", this, "_settings_prop_edited");
+	globals_editor->get_inspector()->connect("restart_requested", this, "_editor_restart_request");
 
 
 	Button *del = memnew(Button);
 	Button *del = memnew(Button);
 	hbc->add_child(del);
 	hbc->add_child(del);
@@ -1766,6 +1787,26 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) {
 	get_ok()->set_text(TTR("Close"));
 	get_ok()->set_text(TTR("Close"));
 	set_hide_on_ok(true);
 	set_hide_on_ok(true);
 
 
+	restart_container = memnew(PanelContainer);
+	props_base->add_child(restart_container);
+	HBoxContainer *restart_hb = memnew(HBoxContainer);
+	restart_container->add_child(restart_hb);
+	restart_icon = memnew(TextureRect);
+	restart_icon->set_v_size_flags(SIZE_SHRINK_CENTER);
+	restart_hb->add_child(restart_icon);
+	restart_label = memnew(Label);
+	restart_label->set_text(TTR("Editor must be restarted for changes to take effect"));
+	restart_hb->add_child(restart_label);
+	restart_hb->add_spacer();
+	Button *restart_button = memnew(Button);
+	restart_button->connect("pressed", this, "_editor_restart");
+	restart_hb->add_child(restart_button);
+	restart_button->set_text(TTR("Save & Restart"));
+	restart_close_button = memnew(ToolButton);
+	restart_close_button->connect("pressed", this, "_editor_restart_close");
+	restart_hb->add_child(restart_close_button);
+	restart_container->hide();
+
 	message = memnew(AcceptDialog);
 	message = memnew(AcceptDialog);
 	add_child(message);
 	add_child(message);
 
 

+ 12 - 3
editor/project_settings_editor.h

@@ -35,7 +35,7 @@
 #include "editor/editor_autoload_settings.h"
 #include "editor/editor_autoload_settings.h"
 #include "editor/editor_data.h"
 #include "editor/editor_data.h"
 #include "editor/editor_plugin_settings.h"
 #include "editor/editor_plugin_settings.h"
-#include "editor/property_editor.h"
+#include "editor/editor_sectioned_inspector.h"
 #include "scene/gui/dialogs.h"
 #include "scene/gui/dialogs.h"
 #include "scene/gui/tab_container.h"
 #include "scene/gui/tab_container.h"
 
 
@@ -64,7 +64,7 @@ class ProjectSettingsEditor : public AcceptDialog {
 
 
 	EditorData *data;
 	EditorData *data;
 	UndoRedo *undo_redo;
 	UndoRedo *undo_redo;
-	SectionedPropertyEditor *globals_editor;
+	SectionedInspector *globals_editor;
 
 
 	HBoxContainer *search_bar;
 	HBoxContainer *search_bar;
 	Button *search_button;
 	Button *search_button;
@@ -112,7 +112,7 @@ class ProjectSettingsEditor : public AcceptDialog {
 
 
 	EditorPluginSettings *plugin_settings;
 	EditorPluginSettings *plugin_settings;
 
 
-	void _item_selected();
+	void _item_selected(const String &);
 	void _item_adds(String);
 	void _item_adds(String);
 	void _item_add();
 	void _item_add();
 	void _item_del();
 	void _item_del();
@@ -166,6 +166,15 @@ class ProjectSettingsEditor : public AcceptDialog {
 
 
 	static ProjectSettingsEditor *singleton;
 	static ProjectSettingsEditor *singleton;
 
 
+	Label *restart_label;
+	TextureRect *restart_icon;
+	PanelContainer *restart_container;
+	ToolButton *restart_close_button;
+
+	void _editor_restart_request();
+	void _editor_restart();
+	void _editor_restart_close();
+
 protected:
 protected:
 	void _notification(int p_what);
 	void _notification(int p_what);
 	static void _bind_methods();
 	static void _bind_methods();

+ 56 - 14
editor/settings_config_dialog.cpp

@@ -54,12 +54,12 @@ void EditorSettingsDialog::_settings_changed() {
 
 
 void EditorSettingsDialog::_settings_property_edited(const String &p_name) {
 void EditorSettingsDialog::_settings_property_edited(const String &p_name) {
 
 
-	String full_name = property_editor->get_full_item_path(p_name);
+	String full_name = inspector->get_full_item_path(p_name);
 
 
 	// Small usability workaround to update the text color settings when the
 	// Small usability workaround to update the text color settings when the
 	// color theme is changed
 	// color theme is changed
 	if (full_name == "text_editor/theme/color_theme") {
 	if (full_name == "text_editor/theme/color_theme") {
-		property_editor->get_property_editor()->update_tree();
+		inspector->get_inspector()->update_tree();
 	} else if (full_name == "interface/theme/accent_color" || full_name == "interface/theme/base_color" || full_name == "interface/theme/contrast") {
 	} else if (full_name == "interface/theme/accent_color" || full_name == "interface/theme/base_color" || full_name == "interface/theme/contrast") {
 		EditorSettings::get_singleton()->set_manually("interface/theme/preset", "Custom"); // set preset to Custom
 		EditorSettings::get_singleton()->set_manually("interface/theme/preset", "Custom"); // set preset to Custom
 	} else if (full_name.begins_with("text_editor/highlighting")) {
 	} else if (full_name.begins_with("text_editor/highlighting")) {
@@ -88,8 +88,8 @@ void EditorSettingsDialog::popup_edit_settings() {
 
 
 	EditorSettings::get_singleton()->list_text_editor_themes(); // make sure we have an up to date list of themes
 	EditorSettings::get_singleton()->list_text_editor_themes(); // make sure we have an up to date list of themes
 
 
-	property_editor->edit(EditorSettings::get_singleton());
-	property_editor->get_property_editor()->update_tree();
+	inspector->edit(EditorSettings::get_singleton());
+	inspector->get_inspector()->update_tree();
 
 
 	search_box->select_all();
 	search_box->select_all();
 	search_box->grab_focus();
 	search_box->grab_focus();
@@ -120,7 +120,7 @@ void EditorSettingsDialog::_clear_search_box() {
 		return;
 		return;
 
 
 	search_box->clear();
 	search_box->clear();
-	property_editor->get_property_editor()->update_tree();
+	inspector->get_inspector()->update_tree();
 }
 }
 
 
 void EditorSettingsDialog::_clear_shortcut_search_box() {
 void EditorSettingsDialog::_clear_shortcut_search_box() {
@@ -158,7 +158,7 @@ void EditorSettingsDialog::_notification(int p_what) {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
 			_update_icons();
 			_update_icons();
 			// Update theme colors.
 			// Update theme colors.
-			property_editor->update_category_list();
+			inspector->update_category_list();
 			_update_shortcuts();
 			_update_shortcuts();
 		} break;
 		} break;
 	}
 	}
@@ -202,6 +202,11 @@ void EditorSettingsDialog::_update_icons() {
 	shortcut_search_box->add_icon_override("right_icon", get_icon("Search", "EditorIcons"));
 	shortcut_search_box->add_icon_override("right_icon", get_icon("Search", "EditorIcons"));
 	clear_button->set_icon(get_icon("Close", "EditorIcons"));
 	clear_button->set_icon(get_icon("Close", "EditorIcons"));
 	shortcut_clear_button->set_icon(get_icon("Close", "EditorIcons"));
 	shortcut_clear_button->set_icon(get_icon("Close", "EditorIcons"));
+
+	restart_close_button->set_icon(get_icon("Close", "EditorIcons"));
+	restart_container->add_style_override("panel", get_stylebox("bg", "Tree"));
+	restart_icon->set_texture(get_icon("StatusWarning", "EditorIcons"));
+	restart_label->add_color_override("font_color", get_color("error_color", "Editor"));
 }
 }
 
 
 void EditorSettingsDialog::_update_shortcuts() {
 void EditorSettingsDialog::_update_shortcuts() {
@@ -388,6 +393,18 @@ void EditorSettingsDialog::_focus_current_search_box() {
 	}
 	}
 }
 }
 
 
+void EditorSettingsDialog::_editor_restart() {
+	EditorNode::get_singleton()->save_all_scenes_and_restart();
+}
+
+void EditorSettingsDialog::_editor_restart_request() {
+	restart_container->show();
+}
+
+void EditorSettingsDialog::_editor_restart_close() {
+	restart_container->hide();
+}
+
 void EditorSettingsDialog::_bind_methods() {
 void EditorSettingsDialog::_bind_methods() {
 
 
 	ClassDB::bind_method(D_METHOD("_unhandled_input"), &EditorSettingsDialog::_unhandled_input);
 	ClassDB::bind_method(D_METHOD("_unhandled_input"), &EditorSettingsDialog::_unhandled_input);
@@ -402,6 +419,10 @@ void EditorSettingsDialog::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("_press_a_key_confirm"), &EditorSettingsDialog::_press_a_key_confirm);
 	ClassDB::bind_method(D_METHOD("_press_a_key_confirm"), &EditorSettingsDialog::_press_a_key_confirm);
 	ClassDB::bind_method(D_METHOD("_wait_for_key"), &EditorSettingsDialog::_wait_for_key);
 	ClassDB::bind_method(D_METHOD("_wait_for_key"), &EditorSettingsDialog::_wait_for_key);
 	ClassDB::bind_method(D_METHOD("_tabs_tab_changed"), &EditorSettingsDialog::_tabs_tab_changed);
 	ClassDB::bind_method(D_METHOD("_tabs_tab_changed"), &EditorSettingsDialog::_tabs_tab_changed);
+
+	ClassDB::bind_method(D_METHOD("_editor_restart_request"), &EditorSettingsDialog::_editor_restart_request);
+	ClassDB::bind_method(D_METHOD("_editor_restart"), &EditorSettingsDialog::_editor_restart);
+	ClassDB::bind_method(D_METHOD("_editor_restart_close"), &EditorSettingsDialog::_editor_restart_close);
 }
 }
 
 
 EditorSettingsDialog::EditorSettingsDialog() {
 EditorSettingsDialog::EditorSettingsDialog() {
@@ -434,14 +455,35 @@ EditorSettingsDialog::EditorSettingsDialog() {
 	hbc->add_child(clear_button);
 	hbc->add_child(clear_button);
 	clear_button->connect("pressed", this, "_clear_search_box");
 	clear_button->connect("pressed", this, "_clear_search_box");
 
 
-	property_editor = memnew(SectionedPropertyEditor);
-	//property_editor->hide_top_label();
-	property_editor->get_property_editor()->set_use_filter(true);
-	property_editor->register_search_box(search_box);
-	property_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL);
-	property_editor->get_property_editor()->set_undo_redo(undo_redo);
-	tab_general->add_child(property_editor);
-	property_editor->get_property_editor()->connect("property_edited", this, "_settings_property_edited");
+	inspector = memnew(SectionedInspector);
+	//inspector->hide_top_label();
+	inspector->get_inspector()->set_use_filter(true);
+	inspector->register_search_box(search_box);
+	inspector->set_v_size_flags(Control::SIZE_EXPAND_FILL);
+	inspector->get_inspector()->set_undo_redo(undo_redo);
+	tab_general->add_child(inspector);
+	inspector->get_inspector()->connect("property_edited", this, "_settings_property_edited");
+	inspector->get_inspector()->connect("restart_requested", this, "_editor_restart_request");
+
+	restart_container = memnew(PanelContainer);
+	tab_general->add_child(restart_container);
+	HBoxContainer *restart_hb = memnew(HBoxContainer);
+	restart_container->add_child(restart_hb);
+	restart_icon = memnew(TextureRect);
+	restart_icon->set_v_size_flags(SIZE_SHRINK_CENTER);
+	restart_hb->add_child(restart_icon);
+	restart_label = memnew(Label);
+	restart_label->set_text(TTR("Editor must be restarted for changes to take effect"));
+	restart_hb->add_child(restart_label);
+	restart_hb->add_spacer();
+	Button *restart_button = memnew(Button);
+	restart_button->connect("pressed", this, "_editor_restart");
+	restart_hb->add_child(restart_button);
+	restart_button->set_text(TTR("Save & Restart"));
+	restart_close_button = memnew(ToolButton);
+	restart_close_button->connect("pressed", this, "_editor_restart_close");
+	restart_hb->add_child(restart_close_button);
+	restart_container->hide();
 
 
 	// Shortcuts Tab
 	// Shortcuts Tab
 
 

+ 16 - 2
editor/settings_config_dialog.h

@@ -31,9 +31,14 @@
 #ifndef SETTINGS_CONFIG_DIALOG_H
 #ifndef SETTINGS_CONFIG_DIALOG_H
 #define SETTINGS_CONFIG_DIALOG_H
 #define SETTINGS_CONFIG_DIALOG_H
 
 
-#include "property_editor.h"
+#include "editor/editor_sectioned_inspector.h"
+#include "editor_inspector.h"
+#include "scene/gui/dialogs.h"
+#include "scene/gui/panel_container.h"
 #include "scene/gui/rich_text_label.h"
 #include "scene/gui/rich_text_label.h"
 #include "scene/gui/tab_container.h"
 #include "scene/gui/tab_container.h"
+#include "scene/gui/texture_rect.h"
+#include "scene/gui/tool_button.h"
 
 
 class EditorSettingsDialog : public AcceptDialog {
 class EditorSettingsDialog : public AcceptDialog {
 
 
@@ -49,7 +54,7 @@ class EditorSettingsDialog : public AcceptDialog {
 	LineEdit *shortcut_search_box;
 	LineEdit *shortcut_search_box;
 	ToolButton *clear_button;
 	ToolButton *clear_button;
 	ToolButton *shortcut_clear_button;
 	ToolButton *shortcut_clear_button;
-	SectionedPropertyEditor *property_editor;
+	SectionedInspector *inspector;
 
 
 	Timer *timer;
 	Timer *timer;
 
 
@@ -89,6 +94,15 @@ class EditorSettingsDialog : public AcceptDialog {
 
 
 	static void _undo_redo_callback(void *p_self, const String &p_name);
 	static void _undo_redo_callback(void *p_self, const String &p_name);
 
 
+	Label *restart_label;
+	TextureRect *restart_icon;
+	PanelContainer *restart_container;
+	ToolButton *restart_close_button;
+
+	void _editor_restart_request();
+	void _editor_restart();
+	void _editor_restart_close();
+
 protected:
 protected:
 	static void _bind_methods();
 	static void _bind_methods();
 
 

+ 11 - 2
main/main.cpp

@@ -825,7 +825,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 	OS::get_singleton()->set_cmdline(execpath, main_args);
 	OS::get_singleton()->set_cmdline(execpath, main_args);
 
 
 	GLOBAL_DEF("rendering/quality/driver/driver_name", "GLES3");
 	GLOBAL_DEF("rendering/quality/driver/driver_name", "GLES3");
-	ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/driver/driver_name", PropertyInfo(Variant::STRING, "rendering/quality/driver/driver_name", PROPERTY_HINT_ENUM, "GLES3,GLES2"));
+	ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/driver/driver_name", PropertyInfo(Variant::STRING, "rendering/quality/driver/driver_name", PROPERTY_HINT_ENUM, "GLES2,GLES3"));
 	if (video_driver == "") {
 	if (video_driver == "") {
 		video_driver = GLOBAL_GET("rendering/quality/driver/driver_name");
 		video_driver = GLOBAL_GET("rendering/quality/driver/driver_name");
 	}
 	}
@@ -914,7 +914,7 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph
 	}
 	}
 
 
 	if (audio_driver == "") { // specified in project.godot
 	if (audio_driver == "") { // specified in project.godot
-		audio_driver = GLOBAL_DEF("audio/driver", OS::get_singleton()->get_audio_driver_name(0));
+		audio_driver = GLOBAL_DEF_RST("audio/driver", OS::get_singleton()->get_audio_driver_name(0));
 	}
 	}
 
 
 	for (int i = 0; i < OS::get_singleton()->get_audio_driver_count(); i++) {
 	for (int i = 0; i < OS::get_singleton()->get_audio_driver_count(); i++) {
@@ -1957,6 +1957,15 @@ void Main::cleanup() {
 	if (engine)
 	if (engine)
 		memdelete(engine);
 		memdelete(engine);
 
 
+	if (OS::get_singleton()->is_restart_on_exit_set()) {
+		//attempt to restart with arguments
+		String exec = OS::get_singleton()->get_executable_path();
+		List<String> args = OS::get_singleton()->get_restart_on_exit_argumens();
+		OS::ProcessID pid = 0;
+		OS::get_singleton()->execute(exec, args, false, &pid);
+		OS::get_singleton()->set_restart_on_exit(false, List<String>()); //clear list (uses memory)
+	}
+
 	unregister_core_driver_types();
 	unregister_core_driver_types();
 	unregister_core_types();
 	unregister_core_types();
 
 

+ 2 - 2
platform/android/audio_driver_jandroid.cpp

@@ -78,9 +78,9 @@ Error AudioDriverAndroid::init() {
 	//        __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "SDL audio: opening device");
 	//        __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "SDL audio: opening device");
 
 
 	JNIEnv *env = ThreadAndroid::get_env();
 	JNIEnv *env = ThreadAndroid::get_env();
-	int mix_rate = GLOBAL_DEF("audio/mix_rate", 44100);
+	int mix_rate = GLOBAL_DEF_RST("audio/mix_rate", 44100);
 
 
-	int latency = GLOBAL_DEF("audio/output_latency", 25);
+	int latency = GLOBAL_DEF_RST("audio/output_latency", 25);
 	unsigned int buffer_size = next_power_of_2(latency * mix_rate / 1000);
 	unsigned int buffer_size = next_power_of_2(latency * mix_rate / 1000);
 	if (OS::get_singleton()->is_stdout_verbose()) {
 	if (OS::get_singleton()->is_stdout_verbose()) {
 		print_line("audio buffer size: " + itos(buffer_size));
 		print_line("audio buffer size: " + itos(buffer_size));

+ 5 - 0
platform/android/os_android.cpp

@@ -123,6 +123,9 @@ void OS_Android::set_opengl_extensions(const char *p_gl_extensions) {
 	ERR_FAIL_COND(!p_gl_extensions);
 	ERR_FAIL_COND(!p_gl_extensions);
 	gl_extensions = p_gl_extensions;
 	gl_extensions = p_gl_extensions;
 }
 }
+int OS_Android::get_current_video_driver() const {
+	return video_driver_index;
+}
 
 
 Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
 Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
 
 
@@ -136,9 +139,11 @@ Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int
 	if (use_gl2) {
 	if (use_gl2) {
 		RasterizerGLES2::register_config();
 		RasterizerGLES2::register_config();
 		RasterizerGLES2::make_current();
 		RasterizerGLES2::make_current();
+		video_driver_index = VIDEO_DRIVER_GLES2;
 	} else {
 	} else {
 		RasterizerGLES3::register_config();
 		RasterizerGLES3::register_config();
 		RasterizerGLES3::make_current();
 		RasterizerGLES3::make_current();
+		video_driver_index = VIDEO_DRIVER_GLES3;
 	}
 	}
 
 
 	visual_server = memnew(VisualServerRaster);
 	visual_server = memnew(VisualServerRaster);

+ 3 - 0
platform/android/os_android.h

@@ -137,6 +137,7 @@ private:
 	AlertFunc alert_func;
 	AlertFunc alert_func;
 
 
 	//power_android *power_manager;
 	//power_android *power_manager;
+	int video_driver_index;
 
 
 public:
 public:
 	// functions used by main to initialize/deintialize the OS
 	// functions used by main to initialize/deintialize the OS
@@ -146,6 +147,8 @@ public:
 	virtual int get_audio_driver_count() const;
 	virtual int get_audio_driver_count() const;
 	virtual const char *get_audio_driver_name(int p_driver) const;
 	virtual const char *get_audio_driver_name(int p_driver) const;
 
 
+	virtual int get_current_video_driver() const;
+
 	virtual void initialize_core();
 	virtual void initialize_core();
 	virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
 	virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
 
 

+ 1 - 1
platform/haiku/audio_driver_media_kit.cpp

@@ -43,7 +43,7 @@ Error AudioDriverMediaKit::init() {
 	speaker_mode = SPEAKER_MODE_STEREO;
 	speaker_mode = SPEAKER_MODE_STEREO;
 	channels = 2;
 	channels = 2;
 
 
-	int latency = GLOBAL_DEF("audio/output_latency", 25);
+	int latency = GLOBAL_DEF_RST("audio/output_latency", 25);
 	buffer_size = next_power_of_2(latency * mix_rate / 1000);
 	buffer_size = next_power_of_2(latency * mix_rate / 1000);
 	samples_in = memnew_arr(int32_t, buffer_size * channels);
 	samples_in = memnew_arr(int32_t, buffer_size * channels);
 
 

+ 6 - 0
platform/iphone/os_iphone.cpp

@@ -93,8 +93,14 @@ void OSIPhone::initialize_core() {
 	set_data_dir(data_dir);
 	set_data_dir(data_dir);
 };
 };
 
 
+int OSIPhone::get_current_video_driver() const {
+	return video_driver_index;
+}
+
 Error OSIPhone::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
 Error OSIPhone::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
 
 
+	video_driver = p_video_driver; //this may be misleading
+
 	RasterizerGLES3::register_config();
 	RasterizerGLES3::register_config();
 	RasterizerGLES3::make_current();
 	RasterizerGLES3::make_current();
 
 

+ 4 - 0
platform/iphone/os_iphone.h

@@ -77,6 +77,8 @@ private:
 	virtual int get_video_driver_count() const;
 	virtual int get_video_driver_count() const;
 	virtual const char *get_video_driver_name(int p_driver) const;
 	virtual const char *get_video_driver_name(int p_driver) const;
 
 
+	virtual int get_current_video_driver() const;
+
 	virtual void initialize_core();
 	virtual void initialize_core();
 	virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
 	virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
 
 
@@ -112,6 +114,8 @@ private:
 
 
 	int virtual_keyboard_height;
 	int virtual_keyboard_height;
 
 
+	int video_driver_index;
+
 public:
 public:
 	bool iterate();
 	bool iterate();
 
 

+ 5 - 0
platform/javascript/os_javascript.cpp

@@ -643,6 +643,9 @@ const char *OS_JavaScript::get_audio_driver_name(int p_driver) const {
 }
 }
 
 
 // Lifecycle
 // Lifecycle
+int OS_JavaScript::get_current_video_driver() const {
+	return video_driver_index;
+}
 
 
 void OS_JavaScript::initialize_core() {
 void OS_JavaScript::initialize_core() {
 
 
@@ -669,6 +672,8 @@ Error OS_JavaScript::initialize(const VideoMode &p_desired, int p_video_driver,
 			RasterizerGLES2::make_current();
 			RasterizerGLES2::make_current();
 			break;
 			break;
 	}
 	}
+
+	video_driver_index = p_video_driver;
 	EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_create_context(NULL, &attributes);
 	EMSCRIPTEN_WEBGL_CONTEXT_HANDLE ctx = emscripten_webgl_create_context(NULL, &attributes);
 	ERR_EXPLAIN("WebGL " + itos(attributes.majorVersion) + ".0 not available");
 	ERR_EXPLAIN("WebGL " + itos(attributes.majorVersion) + ".0 not available");
 	ERR_FAIL_COND_V(emscripten_webgl_make_context_current(ctx) != EMSCRIPTEN_RESULT_SUCCESS, ERR_UNAVAILABLE);
 	ERR_FAIL_COND_V(emscripten_webgl_make_context_current(ctx) != EMSCRIPTEN_RESULT_SUCCESS, ERR_UNAVAILABLE);

+ 4 - 0
platform/javascript/os_javascript.h

@@ -81,7 +81,11 @@ class OS_JavaScript : public OS_Unix {
 
 
 	static void file_access_close_callback(const String &p_file, int p_flags);
 	static void file_access_close_callback(const String &p_file, int p_flags);
 
 
+	int video_driver_index;
+
 protected:
 protected:
+	virtual int get_current_video_driver() const;
+
 	virtual void initialize_core();
 	virtual void initialize_core();
 	virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
 	virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
 
 

+ 3 - 0
platform/osx/os_osx.h

@@ -137,6 +137,9 @@ public:
 
 
 	void _update_window();
 	void _update_window();
 
 
+	int video_driver_index;
+	virtual int get_current_video_driver() const;
+
 protected:
 protected:
 	virtual void initialize_core();
 	virtual void initialize_core();
 	virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
 	virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);

+ 6 - 0
platform/osx/os_osx.mm

@@ -1176,6 +1176,10 @@ static void displays_arrangement_changed(CGDirectDisplayID display_id, CGDisplay
 	displays_arrangement_dirty = true;
 	displays_arrangement_dirty = true;
 }
 }
 
 
+int OS_OSX::get_current_video_driver() const {
+	return video_driver_index;
+}
+
 Error OS_OSX::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
 Error OS_OSX::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
 
 
 	/*** OSX INITIALIZATION ***/
 	/*** OSX INITIALIZATION ***/
@@ -1272,6 +1276,8 @@ Error OS_OSX::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
 		ADD_ATTR2(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core);
 		ADD_ATTR2(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core);
 	}
 	}
 
 
+	video_driver_index = p_video_driver;
+
 	ADD_ATTR2(NSOpenGLPFAColorSize, colorBits);
 	ADD_ATTR2(NSOpenGLPFAColorSize, colorBits);
 
 
 	/*
 	/*

+ 6 - 0
platform/windows/os_windows.cpp

@@ -1012,6 +1012,10 @@ typedef enum _SHC_PROCESS_DPI_AWARENESS {
 	SHC_PROCESS_PER_MONITOR_DPI_AWARE = 2
 	SHC_PROCESS_PER_MONITOR_DPI_AWARE = 2
 } SHC_PROCESS_DPI_AWARENESS;
 } SHC_PROCESS_DPI_AWARENESS;
 
 
+int OS_Windows::get_current_video_driver() const {
+	return video_driver_index;
+}
+
 Error OS_Windows::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
 Error OS_Windows::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
 
 
 	main_loop = NULL;
 	main_loop = NULL;
@@ -1181,6 +1185,8 @@ Error OS_Windows::initialize(const VideoMode &p_desired, int p_video_driver, int
 		RasterizerGLES3::make_current();
 		RasterizerGLES3::make_current();
 	}
 	}
 
 
+	video_driver_index = p_video_driver; // FIXME TODO - FIX IF DRIVER DETECTION HAPPENS AND GLES2 MUST BE USED
+
 	gl_context->set_use_vsync(video_mode.use_vsync);
 	gl_context->set_use_vsync(video_mode.use_vsync);
 #endif
 #endif
 
 

+ 3 - 0
platform/windows/os_windows.h

@@ -134,6 +134,7 @@ class OS_Windows : public OS {
 
 
 	PowerWindows *power_manager;
 	PowerWindows *power_manager;
 
 
+	int video_driver_index;
 #ifdef WASAPI_ENABLED
 #ifdef WASAPI_ENABLED
 	AudioDriverWASAPI driver_wasapi;
 	AudioDriverWASAPI driver_wasapi;
 #endif
 #endif
@@ -153,6 +154,8 @@ class OS_Windows : public OS {
 
 
 	// functions used by main to initialize/deintialize the OS
 	// functions used by main to initialize/deintialize the OS
 protected:
 protected:
+	virtual int get_current_video_driver() const;
+
 	virtual void initialize_core();
 	virtual void initialize_core();
 	virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
 	virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
 
 

+ 8 - 2
platform/x11/os_x11.cpp

@@ -84,6 +84,10 @@ void OS_X11::initialize_core() {
 	OS_Unix::initialize_core();
 	OS_Unix::initialize_core();
 }
 }
 
 
+int OS_X11::get_current_video_driver() const {
+	return video_driver_index;
+}
+
 Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
 Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) {
 
 
 	long im_event_mask = 0;
 	long im_event_mask = 0;
@@ -285,6 +289,8 @@ Error OS_X11::initialize(const VideoMode &p_desired, int p_video_driver, int p_a
 		} break;
 		} break;
 	}
 	}
 
 
+	video_driver_index = p_video_driver; // FIXME TODO - FIX IF DRIVER DETECTION HAPPENS AND GLES2 MUST BE USED
+
 	context_gl->set_use_vsync(current_videomode.use_vsync);
 	context_gl->set_use_vsync(current_videomode.use_vsync);
 
 
 #endif
 #endif
@@ -1825,8 +1831,8 @@ void OS_X11::process_xevents() {
 							GrabModeAsync, GrabModeAsync, x11_window, None, CurrentTime);
 							GrabModeAsync, GrabModeAsync, x11_window, None, CurrentTime);
 				}
 				}
 #ifdef TOUCH_ENABLED
 #ifdef TOUCH_ENABLED
-				// Grab touch devices to avoid OS gesture interference
-				/*for (int i = 0; i < touch.devices.size(); ++i) {
+					// Grab touch devices to avoid OS gesture interference
+					/*for (int i = 0; i < touch.devices.size(); ++i) {
 					XIGrabDevice(x11_display, touch.devices[i], x11_window, CurrentTime, None, XIGrabModeAsync, XIGrabModeAsync, False, &touch.event_mask);
 					XIGrabDevice(x11_display, touch.devices[i], x11_window, CurrentTime, None, XIGrabModeAsync, XIGrabModeAsync, False, &touch.event_mask);
 				}*/
 				}*/
 #endif
 #endif

+ 3 - 0
platform/x11/os_x11.h

@@ -180,6 +180,7 @@ class OS_X11 : public OS_Unix {
 
 
 	CrashHandler crash_handler;
 	CrashHandler crash_handler;
 
 
+	int video_driver_index;
 	int audio_driver_index;
 	int audio_driver_index;
 	unsigned int capture_idle;
 	unsigned int capture_idle;
 	bool maximized;
 	bool maximized;
@@ -206,6 +207,8 @@ protected:
 	bool is_window_maximize_allowed();
 	bool is_window_maximize_allowed();
 
 
 public:
 public:
+	virtual int get_current_video_driver() const;
+
 	virtual String get_name();
 	virtual String get_name();
 
 
 	virtual void set_cursor_shape(CursorShape p_shape);
 	virtual void set_cursor_shape(CursorShape p_shape);

+ 1 - 1
servers/audio/audio_driver_dummy.cpp

@@ -44,7 +44,7 @@ Error AudioDriverDummy::init() {
 	speaker_mode = SPEAKER_MODE_STEREO;
 	speaker_mode = SPEAKER_MODE_STEREO;
 	channels = 2;
 	channels = 2;
 
 
-	int latency = GLOBAL_DEF("audio/output_latency", DEFAULT_OUTPUT_LATENCY);
+	int latency = GLOBAL_DEF_RST("audio/output_latency", DEFAULT_OUTPUT_LATENCY);
 	buffer_frames = closest_power_of_2(latency * mix_rate / 1000);
 	buffer_frames = closest_power_of_2(latency * mix_rate / 1000);
 
 
 	samples_in = memnew_arr(int32_t, buffer_frames * channels);
 	samples_in = memnew_arr(int32_t, buffer_frames * channels);

+ 3 - 3
servers/audio_server.cpp

@@ -903,8 +903,8 @@ void AudioServer::init_channels_and_buffers() {
 
 
 void AudioServer::init() {
 void AudioServer::init() {
 
 
-	channel_disable_threshold_db = GLOBAL_DEF("audio/channel_disable_threshold_db", -60.0);
-	channel_disable_frames = float(GLOBAL_DEF("audio/channel_disable_time", 2.0)) * get_mix_rate();
+	channel_disable_threshold_db = GLOBAL_DEF_RST("audio/channel_disable_threshold_db", -60.0);
+	channel_disable_frames = float(GLOBAL_DEF_RST("audio/channel_disable_time", 2.0)) * get_mix_rate();
 	buffer_size = 1024; //hardcoded for now
 	buffer_size = 1024; //hardcoded for now
 
 
 	init_channels_and_buffers();
 	init_channels_and_buffers();
@@ -920,7 +920,7 @@ void AudioServer::init() {
 	set_edited(false); //avoid editors from thinking this was edited
 	set_edited(false); //avoid editors from thinking this was edited
 #endif
 #endif
 
 
-	GLOBAL_DEF("audio/video_delay_compensation_ms", 0);
+	GLOBAL_DEF_RST("audio/video_delay_compensation_ms", 0);
 }
 }
 
 
 void AudioServer::update() {
 void AudioServer::update() {

Some files were not shown because too many files changed in this diff