diff options
27 files changed, 175 insertions, 99 deletions
@@ -1,29 +1,69 @@ +Alexander Holland <alexander.holland@live.de> +Alexander Holland <alexander.holland@live.de> <alexander.holland@haw-hamburg.de> +Alexander Holland <alexander.holland@live.de> <AlexHolly> Andrea Catania <info@andreacatania.com> Andreas Haas <liu.gam3@gmail.com> -Andreas Haas <Hinsbart@users.noreply.github.com> -Andreas Haas <entenflugstuhl@gmail.com> +Andreas Haas <liu.gam3@gmail.com> <hinsbart@gmail.com> +Andreas Haas <liu.gam3@gmail.com> <hinsbart@users.noreply.github.com> +Andreas Haas <liu.gam3@gmail.com> <entenflugstuhl@gmail.com> Ariel Manzur <ariel@godotengine.org> -Ariel Manzur <ariel@okamstudio.com> +Ariel Manzur <ariel@godotengine.org> <punto@godotengine.org> +Ariel Manzur <ariel@godotengine.org> <ariel@okamstudio.com> +Ariel Manzur <ariel@godotengine.org> <punto@Ariels-Mac-mini.local> +Ariel Manzur <ariel@godotengine.org> <punto@Ariels-Mac-mini-2.local> Bastiaan Olij <mux213@gmail.com> -Bernhard Liebl <poke1024@gmx.de> -Bernhard Liebl <poke1024@gmx.org> +Bernhard Liebl <Bernhard.Liebl@gmx.org> <poke1024@gmx.de> +Bernhard Liebl <Bernhard.Liebl@gmx.org> <poke1024@gmx.org> +Chris Bradfield <chris@kidscancode.org> <cb@scribe.net> +Clay John <claynjohn@gmail.com> +Clay John <claynjohn@gmail.com> <clayjohn@shaw.ca> +Dana Olson <dana@shineuponthee.com> <adolson@gmail.com> +Daniel J. Ramirez <djrmuv@gmail.com> +Ferenc Arn <tagcup@yahoo.com> +Ferenc Arn <tagcup@yahoo.com> <tagcup@users.noreply.github.com> Geequlim <geequlim@gmail.com> -Hugo Locurcio <hugo.locurcio@hugo.pro> +Gilles Roudiere <gilles.roudiere@gmail.com> +Gilles Roudiere <gilles.roudiere@gmail.com> <gilles.roudiere@laas.fr> +Guilherme Felipe <guilhermefelipecgs@gmail.com> Hugo Locurcio <hugo.locurcio@hugo.pro> <hugo.l@openmailbox.org> Hugo Locurcio <hugo.locurcio@hugo.pro> <Calinou@users.noreply.github.com> +Hugo Locurcio <hugo.locurcio@hugo.pro> Calinou <calinou@opmbx.org> +Ian Bishop <ianb96@gmail.com> Ignacio Etcheverry <ignalfonsore@gmail.com> +Ignacio Etcheverry <ignalfonsore@gmail.com> <neikeq@users.noreply.github.com> Indah Sylvia <ISylvox@yahoo.com> +J08nY <johny@neuromancer.sk> <jancar.jj@gmail.com> +J08nY <johny@neuromancer.sk> <J08nY@users.noreply.github.com> Jakub Grzesik <kubecz3k@gmail.com> +Jérôme Gully <jerome.gully0@gmail.com> Juan Linietsky <reduzio@gmail.com> -Juan Linietsky <juan@okamstudio.com> -Juan Linietsky <reduz@Juans-MBP.fibertel.com.ar> +Juan Linietsky <reduzio@gmail.com> <juan@godotengine.org> +Juan Linietsky <reduzio@gmail.com> <juan@okamstudio.com> +Juan Linietsky <reduzio@gmail.com> <reduz@Juans-MBP.fibertel.com.ar> +Juan Linietsky <reduzio@gmail.com> <red@kyoko> Julian Murgia <the.straton@gmail.com> -Leon Krause <eska@eska.me> -Leon Krause <eska@eska.me> <eska014@users.noreply.github.com> +Kelly Thomas <kelly.thomas@hotmail.com.au> +Leon Krause <lk@leonkrause.com> <eska@eska.me> +Leon Krause <lk@leonkrause.com> <eska014@users.noreply.github.com> Marcelo Fernandez <marcelofg55@gmail.com> +Marcin Zawiejski <dragmz@gmail.com> Mariano Javier Suligoy <marianognu.easyrpg@gmail.com> +Mario Schlack <m4r10.5ch14ck@gmail.com> +Max Hilbrunner <m.hilbrunner@gmail.com> +Max Hilbrunner <m.hilbrunner@gmail.com> <mhilbrunner@users.noreply.github.com> +Nathan Warden <nathan@nathanwarden.com> <nathanwardenlee@icloud.com> +Nuno Donato <nunodonato@gmail.com> <n.donato@estrelasustentavel.pt> +Pedro J. Estébanez <pedrojrulez@gmail.com> <RandomShaper@users.noreply.github.com> Paul Batty <p_batty@hotmail.co.uk> +Paul Batty <p_batty@hotmail.co.uk> <Paulb23@users.noreply.github.com> +Pieter-Jan Briers <pieterjan.briers+git@gmail.com> +Pieter-Jan Briers <pieterjan.briers+git@gmail.com> <pieterjan.briers@gmail.com> Poommetee Ketson <poommetee@protonmail.com> +Rémi Verschelde <rverschelde@gmail.com> <remi@verschelde.fr> +Ruslan Mustakov <r.mustakov@gmail.com> <ruslan.mustakov@xored.com> Saracen <SaracenOne@gmail.com> +Theo Hallenius <redsymbzone@hotmail.com> Thomas Herzog <therzog@mail.de> +Thomas Herzog <therzog@mail.de> <thomas.herzog@mail.com> +Thomas Herzog <therzog@mail.de> <thomas.herzog@simedis.com> Zher Huei Lee <lee.zh.92@gmail.com> diff --git a/AUTHORS.md b/AUTHORS.md index 7859a3cd37..b7eca2d9b1 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -25,16 +25,16 @@ name is available. ## Developers -(in alphabetical order, with 10 commits or more excluding merges) +(in alphabetical order, with over 10 commits excluding merges) Aaron Franke (aaronfranke) Alexander Holland (AlexHolly) - Alexey Velikiy (jonyrock) Alket Rexhepi (alketii) Andrea Catania (AndreaCatania) Andreas Haas (Hinsbart) Andrii Doroshenko (Xrayez) Andy Moss (MillionOstrich) + Anish Bhobe (KidRigger) Anton Yabchinskiy (a12n) Aren Villanueva (kurikaesu) Ariel Manzur (punto-) @@ -46,6 +46,7 @@ name is available. Bojidar Marinov (bojidar-bg) bruvzg Carl Olsson (not-surt) + Carter Anderson (cart) Chris Bradfield (cbscribe) Clay John (clayjohn) Dana Olson (adolson) @@ -61,13 +62,13 @@ name is available. Ferenc Arn (tagcup) Franklin Sobrinho (TheHX) Geequlim - Gen (dbsGen) George Marques (vnen) Gerrit Großkopf (Grosskopf) Gilles Roudiere (groud) Guilherme Felipe de C. G. da Silva (guilhermefelipecgs) Hein-Pieter van Braam (hpvb) Hiroshi Ogawa (hi-ogawa) + homer666 Hubert Jarosz (Marqin) Hugo Locurcio (Calinou) Ian Bishop (ianb96) @@ -76,7 +77,7 @@ name is available. Indah Sylvia (ISylvox) J08nY Jakub Grzesik (kubecz3k) - Jérôme GULLY (Nutriz) + Jérôme Gully (Nutriz) Joan Fons Sanchez (JFonS) Johan Manuel (29jm) Joshua Grams (JoshuaGrams) @@ -94,6 +95,7 @@ name is available. Mariano Javier Suligoy (MarianoGnu) Mario Schlack (hurikhan) Martin Capitanio (capnm) + Martin Liška (marxin) Martin Sjursen (binbitten) marynate Masoud BH (masoudbh3) @@ -124,6 +126,7 @@ name is available. Saniko (sanikoyes) SaracenOne sersoong + Simon Wenner (swenner) Theo Hallenius (TheoXD) Thomas Herzog (karroffel) Timo (toger5) @@ -18,10 +18,12 @@ generous deed immortalized in the next stable release of Godot Engine. Gamblify <https://www.gamblify.com> Image Campus <https://www.imagecampus.edu.ar> + Yakaz.com <https://yakaz.com> ## Mini sponsors Alan Beauchamp + Anandarup Mallik Andrew Dunai Arda Erol Brandon Lamb @@ -36,7 +38,6 @@ generous deed immortalized in the next stable release of Godot Engine. Jay Sistar Justin Arnold Kyle Szklenski - Leona Eden Leonard Meagher Ludosity AB Matthieu Huvé @@ -45,7 +46,6 @@ generous deed immortalized in the next stable release of Godot Engine. Nathan Warden Neal Gompa (Conan Kudo) Patrick Aarstad - Pers "Rainway " Ruslan Mustakov Slobodan Milnovic @@ -54,6 +54,7 @@ generous deed immortalized in the next stable release of Godot Engine. Stoney Meyerhoeffer thechris VilliHaukka + Zashi ## Gold donors @@ -61,17 +62,15 @@ generous deed immortalized in the next stable release of Godot Engine. Brandon Waite cheese65536 David Gehrig - Edward E Florian Krick + Jakub Grzesik K9Kraken Manuele Finocchiaro Nathanael Beisiegel Officine Pixel S.n.c. Retro Village - Zashi Zaven Muradyan - 13MHz Allen Schade Andreas Schüle Asher Glick @@ -79,6 +78,7 @@ generous deed immortalized in the next stable release of Godot Engine. Daniel James Daniel Lynn David Giardi + Edward E Florian Breisch Gary Oberbrunner Gero @@ -113,10 +113,9 @@ generous deed immortalized in the next stable release of Godot Engine. Dean Harmon Ivan Trombley Joan Fons - John Krzysztof Jankowski + Lord Bloodhound Lucas Ferreira Franca - Markus Wiesner Nathan Lundquist Pascal Grüter Petr Malac @@ -128,10 +127,10 @@ generous deed immortalized in the next stable release of Godot Engine. Thomas Bjarnelöf Wojciech Chojnacki Xavier PATRICELLI - Zaq Poi Alessandra Pereyra Alexey Dyadchenko + Andrew Bowen Benjamin W Flint Chau Siu Hung Chris Goddard @@ -159,10 +158,12 @@ generous deed immortalized in the next stable release of Godot Engine. Jose Malheiro Juan T Chen Juraj Móza + Kasper Jeppesen Klavdij Voncina Leandro Voltolino Lukáš Rendvanský Marius Kamm + Markus Wiesner Martin Eigel Marvin Matt Eunson @@ -170,6 +171,8 @@ generous deed immortalized in the next stable release of Godot Engine. Nick Nikitin Oliver Dick oziatek + Paul Hocker + Paul Von Zimmerman Pete Goodwin Ranoller ray-tracer @@ -199,16 +202,17 @@ generous deed immortalized in the next stable release of Godot Engine. Anthony Bongiovanni Arbor Interactive Arthur S. Muszynski - Artur Barichello Aubrey Falconer Avencherus Bailey + Balázs Batári Bastian Böhm Benedikt Ben Vercammen Bernd Jänichen Blair Allen Brandon + Brandon Schaffer Bryan Stevenson Carl Winder Carwyn Edwards @@ -226,7 +230,7 @@ generous deed immortalized in the next stable release of Godot Engine. David Cravens David May Dominik Wetzel - DOXA + Duobix Edward Herbert Egon Elbre Elmeri '- Duy Kevin Nguyen @@ -238,13 +242,13 @@ generous deed immortalized in the next stable release of Godot Engine. fengjiongmax Foomf G3Dev sàrl - George Lesica Gerrit Großkopf Grant Clarke Greg Olson Guldoman Haley Aycock Heribert Hirth + Hiroshi Naruo Hunter Jones ialex32x Igor Buzatovic @@ -254,13 +258,11 @@ generous deed immortalized in the next stable release of Godot Engine. Jeff Hungerford Jeremy Kahn Jesse Dubay - Joao Senerchia Joel Fivat Johannes Wuensch Jonas Rudlang Jonas Yamazaki Jonathan G - Jonathan Martin Jonathan Nieto Jonathon Jon Bonazza @@ -270,6 +272,7 @@ generous deed immortalized in the next stable release of Godot Engine. Juan Negrier Judd Julian Murgia + Kajornthep Piyanun KC Chan Kevin Boyer Kiyohiro Kawamura (kyorohiro) @@ -278,6 +281,7 @@ generous deed immortalized in the next stable release of Godot Engine. KsyTek Games Kuan Cheang kycho + Levi Lindsey Linus Lind Lundgren Luis Moraes Macil @@ -288,21 +292,26 @@ generous deed immortalized in the next stable release of Godot Engine. Matthias Grandis Matt Welke Maxwell + medecau Mertcan Mermerkaya + mhilbrunner Michael Dürwald Michael Gringauz Michael Labbe Mikael Olsson + Mikayla Hutchinson MoM Moritz Laass Moritz Weissenberger Natrim nee Neil Blakey-Milner + Nerdforge Nick Pavlica Niclas Eriksen Nicolás Montaña Nicolas SAN AGUSTIN + Oscar Norlander Pan Ip Patrick Nafarrete Paul Gieske @@ -331,7 +340,6 @@ generous deed immortalized in the next stable release of Godot Engine. Simon Wenner Sootstone Theo Cranmore - Théo Hay Thibault Barbaroux Thomas Bell Thomas Holmes diff --git a/core/object.cpp b/core/object.cpp index c46ecc5193..8b693f039c 100644 --- a/core/object.cpp +++ b/core/object.cpp @@ -832,23 +832,22 @@ void Object::setvar(const Variant &p_key, const Variant &p_value, bool *r_valid) } Variant Object::callv(const StringName &p_method, const Array &p_args) { + const Variant **argptrs = NULL; - if (p_args.size() == 0) { - return call(p_method); - } - - Vector<Variant> args; - args.resize(p_args.size()); - Vector<const Variant *> argptrs; - argptrs.resize(p_args.size()); - - for (int i = 0; i < p_args.size(); i++) { - args.write[i] = p_args[i]; - argptrs.write[i] = &args[i]; + if (p_args.size() > 0) { + argptrs = (const Variant **)alloca(sizeof(Variant *) * p_args.size()); + for (int i = 0; i < p_args.size(); i++) { + argptrs[i] = &p_args[i]; + } } Variant::CallError ce; - return call(p_method, (const Variant **)argptrs.ptr(), p_args.size(), ce); + Variant ret = call(p_method, argptrs, p_args.size(), ce); + if (ce.error != Variant::CallError::CALL_OK) { + ERR_EXPLAIN("Error calling method from 'callv': " + Variant::get_call_error_text(this, p_method, argptrs, p_args.size(), ce)); + ERR_FAIL_V(Variant()); + } + return ret; } Variant Object::call(const StringName &p_name, VARIANT_ARG_DECLARE) { diff --git a/doc/classes/Font.xml b/doc/classes/Font.xml index 3e47b167ef..6cb5e0b17a 100644 --- a/doc/classes/Font.xml +++ b/doc/classes/Font.xml @@ -4,7 +4,7 @@ Internationalized font and text drawing support. </brief_description> <description> - Font contains a unicode compatible character set, as well as the ability to draw it with variable width, ascent, descent and kerning. For creating fonts from TTF files (or other font formats), see the editor support for fonts. TODO check wikipedia for graph of ascent/baseline/descent/height/etc. + Font contains a unicode compatible character set, as well as the ability to draw it with variable width, ascent, descent and kerning. For creating fonts from TTF files (or other font formats), see the editor support for fonts. </description> <tutorials> </tutorials> diff --git a/doc/classes/KinematicBody.xml b/doc/classes/KinematicBody.xml index a4fade6ab2..83abd723d0 100644 --- a/doc/classes/KinematicBody.xml +++ b/doc/classes/KinematicBody.xml @@ -91,7 +91,7 @@ Moves the body along a vector. If the body collides with another, it will slide along the other body rather than stop immediately. If the other body is a [code]KinematicBody[/code] or [RigidBody], it will also be affected by the motion of the other body. You can use this to make moving or rotating platforms, or to make nodes push other nodes. [code]linear_velocity[/code] is the velocity vector (typically meters per second). Unlike in [method move_and_collide], you should [i]not[/i] multiply it by [code]delta[/code] — the physics engine handles applying the velocity. [code]floor_normal[/code] is the up direction, used to determine what is a wall and what is a floor or a ceiling. If set to the default value of [code]Vector3(0, 0, 0)[/code], everything is considered a wall. This is useful for topdown games. - [i]TODO: Update for new stop_on_slode argument.[/i] If the body is standing on a slope and the horizontal speed (relative to the floor's speed) goes below [code]slope_stop_min_velocity[/code], the body will stop completely. This prevents the body from sliding down slopes when you include gravity in [code]linear_velocity[/code]. When set to lower values, the body will not be able to stand still on steep slopes. + If the body is standing on a slope and the horizontal speed (relative to the floor's speed) goes below [code]slope_stop_min_velocity[/code], the body will stop completely. This prevents the body from sliding down slopes when you include gravity in [code]linear_velocity[/code]. When set to lower values, the body will not be able to stand still on steep slopes. If the body collides, it will change direction a maximum of [code]max_slides[/code] times before it stops. [code]floor_max_angle[/code] is the maximum angle (in radians) where a slope is still considered a floor (or a ceiling), rather than a wall. The default value equals 45 degrees. Returns the movement that remained when the body stopped. To get more detailed information about collisions that occurred, use [method get_slide_collision]. diff --git a/doc/classes/KinematicBody2D.xml b/doc/classes/KinematicBody2D.xml index f1aac2c765..d5bfc91f66 100644 --- a/doc/classes/KinematicBody2D.xml +++ b/doc/classes/KinematicBody2D.xml @@ -91,7 +91,7 @@ Moves the body along a vector. If the body collides with another, it will slide along the other body rather than stop immediately. If the other body is a [code]KinematicBody2D[/code] or [RigidBody2D], it will also be affected by the motion of the other body. You can use this to make moving or rotating platforms, or to make nodes push other nodes. [code]linear_velocity[/code] is the velocity vector in pixels per second. Unlike in [method move_and_collide], you should [i]not[/i] multiply it by [code]delta[/code] — the physics engine handles applying the velocity. [code]floor_normal[/code] is the up direction, used to determine what is a wall and what is a floor or a ceiling. If set to the default value of [code]Vector2(0, 0)[/code], everything is considered a wall. This is useful for topdown games. - [i]TODO: Update for stop_on_slope argument.[/i] If the body is standing on a slope and the horizontal speed (relative to the floor's speed) goes below [code]slope_stop_min_velocity[/code], the body will stop completely. This prevents the body from sliding down slopes when you include gravity in [code]linear_velocity[/code]. When set to lower values, the body will not be able to stand still on steep slopes. + If the body is standing on a slope and the horizontal speed (relative to the floor's speed) goes below [code]slope_stop_min_velocity[/code], the body will stop completely. This prevents the body from sliding down slopes when you include gravity in [code]linear_velocity[/code]. When set to lower values, the body will not be able to stand still on steep slopes. If the body collides, it will change direction a maximum of [code]max_slides[/code] times before it stops. [code]floor_max_angle[/code] is the maximum angle (in radians) where a slope is still considered a floor (or a ceiling), rather than a wall. The default value equals 45 degrees. Returns the [code]linear_velocity[/code] vector, rotated and/or scaled if a slide collision occurred. To get more detailed information about collisions that occurred, use [method get_slide_collision]. diff --git a/doc/classes/SpotLight.xml b/doc/classes/SpotLight.xml index 11f914aac2..56ba2fc5b9 100644 --- a/doc/classes/SpotLight.xml +++ b/doc/classes/SpotLight.xml @@ -4,7 +4,7 @@ Spotlight [Light], such as a reflector spotlight or a lantern. </brief_description> <description> - A SpotLight light is a type of [Light] node that emits lights in a specific direction, in the shape of a cone. The light is attenuated through the distance and this attenuation can be configured by changing the energy, radius and attenuation parameters of [Light]. TODO: Image of a spotlight. + A SpotLight light is a type of [Light] node that emits lights in a specific direction, in the shape of a cone. The light is attenuated through the distance and this attenuation can be configured by changing the energy, radius and attenuation parameters of [Light]. </description> <tutorials> <link>https://docs.godotengine.org/en/latest/tutorials/3d/lights_and_shadows.html</link> diff --git a/doc/tools/makerst.py b/doc/tools/makerst.py index 22c0b5d1fd..4b5785f604 100755 --- a/doc/tools/makerst.py +++ b/doc/tools/makerst.py @@ -950,6 +950,12 @@ def make_method_signature(class_def, method_def, make_ref, state): # type: (Cla if arg.default_value is not None: out += '=' + arg.default_value + if isinstance(method_def, MethodDef) and method_def.qualifiers is not None and 'vararg' in method_def.qualifiers: + if len(method_def.parameters) > 0: + out += ', ...' + else: + out += '...' + out += ' **)**' if isinstance(method_def, MethodDef) and method_def.qualifiers is not None: diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 75708431ec..249bbb2a39 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -1456,6 +1456,10 @@ List<String> EditorExportPlatformPC::get_binary_extensions(const Ref<EditorExpor Error EditorExportPlatformPC::export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags) { ExportNotifier notifier(*this, p_preset, p_debug, p_path, p_flags); + if (!FileAccess::exists(p_path.get_base_dir())) { + return ERR_FILE_BAD_PATH; + } + String custom_debug = p_preset->get("custom_template/debug"); String custom_release = p_preset->get("custom_template/release"); diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index cdc06503e9..da16c16966 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -1205,8 +1205,10 @@ void EditorFileDialog::_update_favorites() { if (name == current) setthis = true; name = "/"; + + favorites->add_item(name, folder_icon); } else if (name.ends_with("/")) { - if (name == current) + if (name == current || name == current + "/") setthis = true; name = name.substr(0, name.length() - 1); name = name.get_file(); @@ -1229,6 +1231,8 @@ void EditorFileDialog::_favorite_toggled(bool p_toggle) { bool res = access == ACCESS_RESOURCES; String cd = get_current_dir(); + if (!cd.ends_with("/")) + cd += "/"; Vector<String> favorited = EditorSettings::get_singleton()->get_favorites(); @@ -1244,13 +1248,10 @@ void EditorFileDialog::_favorite_toggled(bool p_toggle) { } } - if (found) { + if (found) favorited.erase(cd); - favorite->set_pressed(false); - } else { + else favorited.push_back(cd); - favorite->set_pressed(true); - } EditorSettings::get_singleton()->set_favorites(favorited); @@ -1494,7 +1495,9 @@ EditorFileDialog::EditorFileDialog() { HBoxContainer *pathhb = memnew(HBoxContainer); dir_prev = memnew(ToolButton); + dir_prev->set_tooltip(TTR("Previous Folder")); dir_next = memnew(ToolButton); + dir_next->set_tooltip(TTR("Next Folder")); dir_up = memnew(ToolButton); dir_up->set_tooltip(TTR("Go to parent folder")); @@ -1513,12 +1516,14 @@ EditorFileDialog::EditorFileDialog() { dir->set_h_size_flags(SIZE_EXPAND_FILL); refresh = memnew(ToolButton); + refresh->set_tooltip(TTR("Refresh")); refresh->connect("pressed", this, "_update_file_list"); pathhb->add_child(refresh); favorite = memnew(ToolButton); favorite->set_flat(true); favorite->set_toggle_mode(true); + favorite->set_tooltip(TTR("(Un)favorite current folder.")); favorite->connect("toggled", this, "_favorite_toggled"); pathhb->add_child(favorite); @@ -1532,6 +1537,7 @@ EditorFileDialog::EditorFileDialog() { mode_thumbnails->set_toggle_mode(true); mode_thumbnails->set_pressed(display_mode == DISPLAY_THUMBNAILS); mode_thumbnails->set_button_group(view_mode_group); + mode_thumbnails->set_tooltip(TTR("View items as a grid of thumbnails.")); pathhb->add_child(mode_thumbnails); mode_list = memnew(ToolButton); @@ -1539,6 +1545,7 @@ EditorFileDialog::EditorFileDialog() { mode_list->set_toggle_mode(true); mode_list->set_pressed(display_mode == DISPLAY_LIST); mode_list->set_button_group(view_mode_group); + mode_list->set_tooltip(TTR("View items as a list.")); pathhb->add_child(mode_list); drives = memnew(OptionButton); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 66deb42c11..b5d9071199 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -283,7 +283,7 @@ void FileSystemDock::_notification(int p_what) { String ei = "EditorIcons"; button_reload->set_icon(get_icon("Reload", ei)); button_toggle_display_mode->set_icon(get_icon("Panels2", ei)); - button_file_list_display_mode->connect("toggled", this, "_toggle_file_display"); + button_file_list_display_mode->connect("pressed", this, "_toggle_file_display"); files->connect("item_activated", this, "_file_list_activate_file"); button_hist_next->connect("pressed", this, "_fw_history"); @@ -350,7 +350,7 @@ void FileSystemDock::_notification(int p_what) { button_toggle_display_mode->set_icon(get_icon("Panels2", ei)); button_hist_next->set_icon(get_icon("Forward", ei)); button_hist_prev->set_icon(get_icon("Back", ei)); - if (button_file_list_display_mode->is_pressed()) { + if (file_list_display_mode == FILE_LIST_DISPLAY_LIST) { button_file_list_display_mode->set_icon(get_icon("FileThumbnail", "EditorIcons")); } else { button_file_list_display_mode->set_icon(get_icon("FileList", "EditorIcons")); @@ -501,8 +501,8 @@ void FileSystemDock::_tree_thumbnail_done(const String &p_path, const Ref<Textur } } -void FileSystemDock::_toggle_file_display(bool p_active) { - _set_file_display(p_active); +void FileSystemDock::_toggle_file_display() { + _set_file_display(file_list_display_mode != FILE_LIST_DISPLAY_LIST); emit_signal("display_mode_changed"); } @@ -1692,8 +1692,7 @@ void FileSystemDock::set_file_list_display_mode(FileListDisplayMode p_mode) { if (p_mode == file_list_display_mode) return; - button_file_list_display_mode->set_pressed(p_mode == FILE_LIST_DISPLAY_LIST); - _toggle_file_display(p_mode == FILE_LIST_DISPLAY_LIST); + _toggle_file_display(); } Variant FileSystemDock::get_drag_data_fw(const Point2 &p_point, Control *p_from) { @@ -2377,29 +2376,6 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { tree_search_box->connect("text_changed", this, "_search_changed", varray(tree_search_box)); toolbar2_hbc->add_child(tree_search_box); - //toolbar_hbc->add_spacer(); - - //Control *spacer = memnew( Control); - - /* - button_open = memnew( Button ); - button_open->set_flat(true); - button_open->connect("pressed",this,"_tree_toggle_collapsed"); - toolbar_hbc->add_child(button_open); - button_open->hide(); - button_open->set_focus_mode(FOCUS_NONE); - button_open->set_tooltip("Open the selected file.\nOpen as scene if a scene, or as resource otherwise."); - - - button_instance = memnew( Button ); - button_instance->set_flat(true); - button_instance->connect("pressed",this,"_instance_pressed"); - toolbar_hbc->add_child(button_instance); - button_instance->hide(); - button_instance->set_focus_mode(FOCUS_NONE); - button_instance->set_tooltip(TTR("Instance the selected scene(s) as child of the selected node.")); - -*/ file_list_popup = memnew(PopupMenu); file_list_popup->set_hide_on_window_lose_focus(true); add_child(file_list_popup); @@ -2441,7 +2417,6 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { path_hb->add_child(file_list_search_box); button_file_list_display_mode = memnew(ToolButton); - button_file_list_display_mode->set_toggle_mode(true); path_hb->add_child(button_file_list_display_mode); files = memnew(ItemList); diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h index 7cf37a7634..cd052f9700 100644 --- a/editor/filesystem_dock.h +++ b/editor/filesystem_dock.h @@ -181,7 +181,7 @@ private: void _tree_gui_input(Ref<InputEvent> p_event); void _update_file_list(bool p_keep_selection); - void _toggle_file_display(bool p_active); + void _toggle_file_display(); void _set_file_display(bool p_active); void _fs_changed(); diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index ab3936407b..a9e9607bc5 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -177,6 +177,8 @@ void EditorAssetLibraryItemDescription::set_image(int p_type, int p_index, const thumbnail = thumbnail->duplicate(); Point2 overlay_pos = Point2((thumbnail->get_width() - overlay->get_width()) / 2, (thumbnail->get_height() - overlay->get_height()) / 2); + // Overlay and thumbnail need the same format for `blend_rect` to work. + thumbnail->convert(Image::FORMAT_RGBA8); thumbnail->lock(); thumbnail->blend_rect(overlay, overlay->get_used_rect(), overlay_pos); thumbnail->unlock(); diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index 1e9ff87fd3..ed11d26f25 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -2108,9 +2108,11 @@ void SpatialEditorViewport::_notification(int p_what) { set_process(visible); - if (visible) + if (visible) { _update_camera(0); - + } else { + set_freelook_active(false); + } call_deferred("update_transform_gizmo_view"); } diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp index e041c3d62e..5b54384ee0 100644 --- a/editor/plugins/tile_set_editor_plugin.cpp +++ b/editor/plugins/tile_set_editor_plugin.cpp @@ -337,13 +337,13 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) { tools[SELECT_NEXT] = memnew(ToolButton); tool_hb->add_child(tools[SELECT_NEXT]); tool_hb->move_child(tools[SELECT_NEXT], WORKSPACE_CREATE_SINGLE); - tools[SELECT_NEXT]->set_shortcut(ED_SHORTCUT("tileset_editor/next_shape", TTR("Select next coordinate"), KEY_PAGEDOWN)); + tools[SELECT_NEXT]->set_shortcut(ED_SHORTCUT("tileset_editor/next_shape", TTR("Next Coordinate"), KEY_PAGEDOWN)); tools[SELECT_NEXT]->connect("pressed", this, "_on_tool_clicked", varray(SELECT_NEXT)); tools[SELECT_NEXT]->set_tooltip(TTR("Select the next shape, subtile, or Tile.")); tools[SELECT_PREVIOUS] = memnew(ToolButton); tool_hb->add_child(tools[SELECT_PREVIOUS]); tool_hb->move_child(tools[SELECT_PREVIOUS], WORKSPACE_CREATE_SINGLE); - tools[SELECT_PREVIOUS]->set_shortcut(ED_SHORTCUT("tileset_editor/previous_shape", TTR("Select previous coordinate"), KEY_PAGEUP)); + tools[SELECT_PREVIOUS]->set_shortcut(ED_SHORTCUT("tileset_editor/previous_shape", TTR("Previous Coordinate"), KEY_PAGEUP)); tools[SELECT_PREVIOUS]->set_tooltip(TTR("Select the previous shape, subtile, or Tile.")); tools[SELECT_PREVIOUS]->connect("pressed", this, "_on_tool_clicked", varray(SELECT_PREVIOUS)); @@ -2918,7 +2918,8 @@ void TileSetEditor::update_texture_list_icon() { for (int current_idx = 0; current_idx < texture_list->get_item_count(); current_idx++) { RID rid = texture_list->get_item_metadata(current_idx); texture_list->set_item_icon(current_idx, texture_map[rid]); - texture_list->set_item_icon_region(current_idx, Rect2(0, 0, 150, 100)); + Size2 texture_size = texture_map[rid]->get_size(); + texture_list->set_item_icon_region(current_idx, Rect2(0, 0, MIN(texture_size.x, 150), MIN(texture_size.y, 100))); } texture_list->update(); } @@ -2931,10 +2932,14 @@ void TileSetEditor::update_workspace_tile_mode() { for (int i = 1; i < WORKSPACE_MODE_MAX; i++) { tool_workspacemode[i]->set_disabled(true); } + tools[SELECT_NEXT]->set_disabled(true); + tools[SELECT_PREVIOUS]->set_disabled(true); } else { for (int i = 1; i < WORKSPACE_MODE_MAX; i++) { tool_workspacemode[i]->set_disabled(false); } + tools[SELECT_NEXT]->set_disabled(false); + tools[SELECT_PREVIOUS]->set_disabled(false); } if (workspace_mode != WORKSPACE_EDIT) { diff --git a/editor/project_export.cpp b/editor/project_export.cpp index 831ebde3a6..82a6a07805 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -1012,7 +1012,11 @@ void ProjectExportDialog::_export_all(bool p_debug) { Error err = platform->export_project(preset, p_debug, preset->get_export_path(), 0); if (err != OK) { - error_dialog->set_text(TTR("Export templates for this platform are missing/corrupted:") + " " + platform->get_name()); + if (err == ERR_FILE_BAD_PATH) { + error_dialog->set_text(TTR("The given export path doesn't exist:") + "\n" + preset->get_export_path().get_base_dir()); + } else { + error_dialog->set_text(TTR("Export templates for this platform are missing/corrupted:") + " " + platform->get_name()); + } error_dialog->show(); error_dialog->popup_centered_minsize(Size2(300, 80)); ERR_PRINT("Failed to export project"); diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index d931d5bb37..084830ed7b 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -336,9 +336,13 @@ void SceneTreeDock::_tool_selected(int p_tool, bool p_confirm_override) { } break; case TOOL_ATTACH_SCRIPT: { + List<Node *> selection = editor_selection->get_selected_node_list(); + if (selection.empty()) + break; + Node *selected = scene_tree->get_selected(); if (!selected) - break; + selected = selection.front()->get(); Ref<Script> existing = selected->get_script(); diff --git a/main/input_default.cpp b/main/input_default.cpp index fd76b91a0b..e8133f9eba 100644 --- a/main/input_default.cpp +++ b/main/input_default.cpp @@ -685,7 +685,7 @@ void InputDefault::set_use_accumulated_input(bool p_enable) { InputDefault::InputDefault() { - use_accumulated_input = false; + use_accumulated_input = true; mouse_button_mask = 0; emulate_touch_from_mouse = false; emulate_mouse_from_touch = false; diff --git a/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist b/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist index 1c68c72385..b7cd94e3d5 100644 --- a/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist +++ b/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist @@ -34,8 +34,6 @@ </array> <key>NSCameraUsageDescription</key> <string>$camera_usage_description</string> - <key>NSMicrophoneUsageDescription</key> - <string>$microphone_usage_description</string> <key>NSPhotoLibraryUsageDescription</key> <string>$photolibrary_usage_description</string> <key>UIRequiresFullScreen</key> diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index 8ffd355219..0f2455914d 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -1489,6 +1489,10 @@ public: } } + if (!FileAccess::exists(p_path.get_base_dir())) { + return ERR_FILE_BAD_PATH; + } + FileAccess *src_f = NULL; zlib_filefunc_def io = zipio_create_io_from_file(&src_f); diff --git a/platform/iphone/export/export.cpp b/platform/iphone/export/export.cpp index c45931fdfd..05907be020 100644 --- a/platform/iphone/export/export.cpp +++ b/platform/iphone/export/export.cpp @@ -266,7 +266,6 @@ void EditorExportPlatformIOS::get_export_options(List<ExportOption> *r_options) r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "capabilities/push_notifications"), false)); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "privacy/camera_usage_description"), "Godot would like to use your camera")); - r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "privacy/microphone_usage_description"), "Godot would like to use your microphone")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "privacy/photolibrary_usage_description"), "Godot would like to use your photos")); r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "orientation/portrait"), true)); @@ -396,9 +395,6 @@ void EditorExportPlatformIOS::_fix_config_file(const Ref<EditorExportPreset> &p_ } else if (lines[i].find("$camera_usage_description") != -1) { String description = p_preset->get("privacy/camera_usage_description"); strnew += lines[i].replace("$camera_usage_description", description) + "\n"; - } else if (lines[i].find("$microphone_usage_description") != -1) { - String description = p_preset->get("privacy/microphone_usage_description"); - strnew += lines[i].replace("$microphone_usage_description", description) + "\n"; } else if (lines[i].find("$photolibrary_usage_description") != -1) { String description = p_preset->get("privacy/photolibrary_usage_description"); strnew += lines[i].replace("$photolibrary_usage_description", description) + "\n"; @@ -840,6 +836,10 @@ Error EditorExportPlatformIOS::export_project(const Ref<EditorExportPreset> &p_p } } + if (!FileAccess::exists(dest_dir)) { + return ERR_FILE_BAD_PATH; + } + DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); if (da) { String current_dir = da->get_current_dir(); diff --git a/platform/javascript/export/export.cpp b/platform/javascript/export/export.cpp index 5704433650..b7ca1eb1d7 100644 --- a/platform/javascript/export/export.cpp +++ b/platform/javascript/export/export.cpp @@ -211,6 +211,10 @@ Error EditorExportPlatformJavaScript::export_project(const Ref<EditorExportPrese template_path = find_export_template(EXPORT_TEMPLATE_WEBASSEMBLY_RELEASE); } + if (!FileAccess::exists(p_path.get_base_dir())) { + return ERR_FILE_BAD_PATH; + } + if (template_path != String() && !FileAccess::exists(template_path)) { EditorNode::get_singleton()->show_warning(TTR("Template file not found:") + "\n" + template_path); return ERR_FILE_NOT_FOUND; @@ -360,7 +364,7 @@ Error EditorExportPlatformJavaScript::run(const Ref<EditorExportPreset> &p_prese if (err) { return err; } - OS::get_singleton()->shell_open(path); + OS::get_singleton()->shell_open(String("file://") + path); return OK; } diff --git a/platform/osx/export/export.cpp b/platform/osx/export/export.cpp index b8f6977b39..a0eccceed0 100644 --- a/platform/osx/export/export.cpp +++ b/platform/osx/export/export.cpp @@ -425,6 +425,10 @@ Error EditorExportPlatformOSX::export_project(const Ref<EditorExportPreset> &p_p } } + if (!FileAccess::exists(p_path.get_base_dir())) { + return ERR_FILE_BAD_PATH; + } + FileAccess *src_f = NULL; zlib_filefunc_def io = zipio_create_io_from_file(&src_f); diff --git a/platform/uwp/export/export.cpp b/platform/uwp/export/export.cpp index a4655117a7..8405608dd6 100644 --- a/platform/uwp/export/export.cpp +++ b/platform/uwp/export/export.cpp @@ -1265,6 +1265,10 @@ public: } } + if (!FileAccess::exists(p_path.get_base_dir())) { + return ERR_FILE_BAD_PATH; + } + Error err = OK; FileAccess *fa_pack = FileAccess::open(p_path, FileAccess::WRITE, &err); diff --git a/scene/audio/audio_stream_player.cpp b/scene/audio/audio_stream_player.cpp index 5c95cf4279..2688041d18 100644 --- a/scene/audio/audio_stream_player.cpp +++ b/scene/audio/audio_stream_player.cpp @@ -91,8 +91,10 @@ void AudioStreamPlayer::_mix_internal(bool p_fadeout) { void AudioStreamPlayer::_mix_audio() { - if (!stream_playback.is_valid() || !active) + if (!stream_playback.is_valid() || !active || + (stream_paused && !stream_fade)) { return; + } if (stream_fade) { _mix_internal(true); diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 5599c64daa..059e59ea21 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -861,7 +861,7 @@ FileDialog::FileDialog() { HBoxContainer *hbc = memnew(HBoxContainer); dir_up = memnew(ToolButton); - dir_up->set_tooltip(RTR("Go to parent folder")); + dir_up->set_tooltip(RTR("Go to parent folder.")); hbc->add_child(dir_up); dir_up->connect("pressed", this, "_go_up"); @@ -871,6 +871,7 @@ FileDialog::FileDialog() { dir->set_h_size_flags(SIZE_EXPAND_FILL); refresh = memnew(ToolButton); + refresh->set_tooltip(RTR("Refresh")); refresh->connect("pressed", this, "_update_file_list"); hbc->add_child(refresh); |