diff --git a/.mailmap b/.mailmap index 4b427a8a5ec..f2f69eb9da2 100644 --- a/.mailmap +++ b/.mailmap @@ -2,10 +2,6 @@ Alexander Holland Alexander Holland Alexander Holland Andrea Catania -Andreas Haas -Andreas Haas -Andreas Haas -Andreas Haas Anish Bhobe Anutrix Aren Villanueva @@ -69,6 +65,11 @@ Kelly Thomas K. S. Ernest (iFire) Lee Leon Krause Leon Krause +Liz Haas <27thLiz@gmail.com> +Liz Haas <27thLiz@gmail.com> +Liz Haas <27thLiz@gmail.com> +Liz Haas <27thLiz@gmail.com> +Liz Haas <27thLiz@gmail.com> Manuel Strey Marcelo Fernandez Marcin Zawiejski diff --git a/AUTHORS.md b/AUTHORS.md index f1803c672c6..40aa50f8b67 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -32,7 +32,6 @@ name is available. Alexey Khoroshavin (allkhor) Alket Rexhepi (alketii) Andrea Catania (AndreaCatania) - Andreas Haas (Hinsbart) Andrii Doroshenko (Xrayez) Andy Moss (MillionOstrich) Anish Bhobe (KidRigger) @@ -97,6 +96,7 @@ name is available. Jakub Grzesik (kubecz3k) James Buck (jbuck3) Jérôme Gully (Nutriz) + Jia Jun Chai (SkyLucilfer) Joan Fons Sanchez (JFonS) Johan Manuel (29jm) Joshua Grams (JoshuaGrams) @@ -107,7 +107,8 @@ name is available. Kostadin Damyanov (Max-Might) K. S. Ernest (iFire) Lee (fire) lawnjelly - Leon Krause (eska014) + Leon Krause (leonkrause) + Liz Haas (27thLiz) Lucien Menassol (Kanabenki) m4nu3lf Maganty Rushyendra (mrushyendra) @@ -134,6 +135,7 @@ name is available. muiroc Nathan Warden (NathanWarden) Nils André-Chang (NilsIrl) + Noah Beard (TwistedTwigleg) Nuno Donato (nunodonato) Ovnuniarchos Pascal Richter (ShyRed) @@ -157,12 +159,15 @@ name is available. Robin Hübner (profan) romulox-x Ruslan Mustakov (endragor) + Ryan Roden-Corrent (rrcore) Saniko (sanikoyes) santouits SaracenOne + Sergey Minakov (naithar) sersoong Shiqing (kawa-yoiko) Simon Wenner (swenner) + Stijn Hinlopen (hinlopen) Swarnim Arun (minraws) Thakee Nathees (ThakeeNathees) Theo Hallenius (TheoXD) diff --git a/DONORS.md b/DONORS.md index 16a30b9489b..88e674f0431 100644 --- a/DONORS.md +++ b/DONORS.md @@ -12,26 +12,35 @@ generous deed immortalized in the next stable release of Godot Engine. ## Platinum sponsors + Gamblify Heroic Labs Interblock ## Gold sponsors - Gamblify + None currently, become one! + +## Silver sponsors + Moonwards +## Bronze sponsors + + Brandon Lamb + ## Mini sponsors AD Ford Alan Beauchamp albinaask Alejandro Saucedo + alex brown Andrew Dunai - Brandon Lamb Christian Baune Christopher Montesano Darkhan Baimyrza Darrin Massena + David Mydlarz Digital Grows Dov Zimring Edward Flick @@ -43,6 +52,7 @@ generous deed immortalized in the next stable release of Godot Engine. Jasper Brooks Javary Co. Jeffery Chiu + Jonah Stich Justin Arnold Kyle Szklenski Marcel Kräml @@ -51,45 +61,39 @@ generous deed immortalized in the next stable release of Godot Engine. Mike King Nathan Warden Neal Gompa (Conan Kudo) + Patrick Schmidt Ronnie Cheng Slobodan Milnovic Stephan Lanfermann Steve + Thomas Krampl Tristan Pemble VilliHaukka + Violin Iliev + 蕭惟允 ## Gold donors - Bjarke - David Gehrig - David Snopek - Ed Morley - Florian Rämisch - Jakub Grzesik - Manuele Finocchiaro - Officine Pixel S.n.c. - Rami - Ronan Zeegers - Sofox - Spicylewd - Taylor Ritenour - Zaven Muradyan - - Andreas Schüle - Andres Hernandez + Andrew Morsillo Asher Glick Austen McRae Bernhard Werner beVR Carlo Cabanilla + Chris Goddard Christopher Case Daniel James + David Gehrig David Giardi - Default Name + David Snopek + Ed Morley eggs + Ellen Poe Florian Breisch + Florian Rämisch Forge Gamejunkey + Jakub Grzesik Javier Roman Jon Woodward Karl Werf @@ -97,95 +101,89 @@ generous deed immortalized in the next stable release of Godot Engine. Lex Steers Luke Maciej Pendolski + Manuele Finocchiaro + Markus Wiesner Matthew Hillier Mohamed Ikbel Boulabiar Monster Vial + Officine Pixel S.n.c. + Rami Rene + Rene Tailleur Retro Village Rob Messick Roland Fredenhagen + Ronan Zeegers Ryan Badour Sandro Jenny Sarksus Scott Wadden Sergey - thechris + Sofox + Spicylewd + Taylor Ritenour Tom Langwaldt Tricky Fat Cat tukon William Wold + xagonist + Zaven Muradyan - Alex Khayrullin - alice gambrell - Andrew Harris - Barugon - Chris Goddard - Chris Serino - Christian Padilla - Conrad Curry - Craig Smith - Darrian Little - dragonage13 - GiulianoB - Hoai Nam Tran - Horváth Péter - Jeff Nyte - Joan Fons - Joshua Flores - Leo Fidel R Liban - Michael Dürwald - Péter Magyar - Petr Malac - Rob - Robert Willes - Ronnie Ashlock - SKison - Thomas Bjarnelöf - Valryia - Vincent Henderson - Vojtěch - Wojciech Chojnacki - Xavier PATRICELLI - Zoran Kukulj - + Aaron Winter Adam Nakonieczny Adam Neumann Alexander J Maynard Alexey Dyadchenko + Alex Khayrullin + alice gambrell Andreas Funke André Frélicot + Andrew Harris aoshiwik - Ben Powell + Barugon + Can Eris Carlos de Sousa Marques Charlie Whitfield Chase Taranto Chelsea Hash Chris Petrich + Chris Serino Christian Alexander Bjørklund Bøhler Christian Leth Jeppesen Cody Parker + Conrad Curry Craig Ostrin - curtis Kramer + Craig Smith D + Darrian Little Dev To be curious Digital Denizen Easypete Edgar Sun Eugenio Hugo Salgüero Jáñez + Felix Brückner flesk F S Gary Hulst gavlig GGGames.org + GiulianoB Guilherme Felipe de C. G. da Silva Heath Hayes + Hoai Nam Tran + Horváth Péter Hu Hund - Isaac Clausman + Jared Jared White - Joe Flood + Jeff Nyte + Joan Fons + Joel Fivat + Joel Höglund John G Gentzel Jose Malheiro Joseph Crane + Joshie Sparks + Joshua Flores Joshua Lesperance Juan Velandia Julian Todd @@ -194,14 +192,18 @@ generous deed immortalized in the next stable release of Godot Engine. Kelteseth kickmaniac kinfox + Lachie Lain Ballard + Leo Fidel R Liban luca duran + MadScientistCarl Marcelo Dornbusch Lopes - Marcelo Henrique Gonçalves + Marisa Clardy Markus Fehr - Markus Wiesner Martin Eigel Matt Eunson + Michael + Michael Dürwald Mikado069 m kaersten MuffinManKen @@ -211,48 +213,64 @@ generous deed immortalized in the next stable release of Godot Engine. Patrick Ting Paul Hocker Paul Von Zimmerman + Pedro Silva Pete Goodwin + Péter Magyar + Petr Malac PhaineOfCatz pl Ranoller + Raymond Harris + Ricardo Alcantara + Rob + Robert Willes Rob McInroy Rocknight Studios + Ronnie Ashlock Ryan + Ryan Wilson Samuel Judd Scott Pilet - Scott Ryan-Taylor Sean Morgan Sean Robertson Sébastien Serban Serafimescu + Shishir Tandale + SKison SleepCircle spilldata + Steven Landow Stoned Xander Tahiti Bos TheLevelOfDetail . + Thomas Bjarnelöf Thomas Kurz + Timothy Pulliam Tobias Bocanegra Trent Fehl - Urho + Valryia + VikFro + Vincent Henderson + Vojtěch William Foster + Wojciech Chojnacki + Xavier PATRICELLI + xzibiting Zhou Tuizhi Zie Weaver - 蕭惟允 + Zoran Kukulj ## Silver donors 1D_Inc Aaron - Aaron Winter - Abel Crunk Abraham Haskins Acheron Adam Adam Brunnmeier - Adam Carr + Adam Carr Adam Long Adam McCurdy - Adam Netzel Adam N Webber Adam Smeltzer Adam Szymański @@ -265,18 +283,22 @@ generous deed immortalized in the next stable release of Godot Engine. AleMax Alessandro Senese Alexander Erlemann + Alexandre Beaudoin alex clavelle + Ali Al-Khalifa Allan Davis Allen Schade Andreas Krampitz André Simões andrew james morris Andrew Mansuetti + Andrew Rosenwinkel Andrew Thomas Ano Nim Anthony Avina AP Condomines Arda Erol + Arisaka Mayuki Armin Preiml Arseniy M Arthur S. Muszynski @@ -285,43 +307,49 @@ generous deed immortalized in the next stable release of Godot Engine. Aubrey Falconer B A Balázs Batári - Balázs Hasprai Bartosz Bielecki Benedikt Ben Vercammen Bernd Jänichen - Bjarne + Bjarne Voigtländer Black Block Blair Allen Bobby CC Wong Bram brian + Brian mc gowan + Brodie Fairhall Burney Waring + Caleb Gartner Cameron Meyer Carl van der Geest Carwyn Edwards Cas Brugman Cassidy James + Chad Steadman Chris Brown Chris Chapin Christian Winter + Christoffer Dahlblom Christoffer Sundbom - Christoph Brodmann Christophe Gagnier Christopher Schmitt Christoph Woinke Clay Heaton Cole Johnson - Cuauhtemoc Moreno Curt King - Daniel Kimblad + CzechBlueBear + Daniel De Macedo Daniel Johnson DanielMaximiano + Daniel Szarfman Daniel Tebbutt + Daren Scot Wilson Dave Walker David May David Woodard - Dimitri Stanojevic + David Zanetti + Dmitry Fisher Dmytro Korchynskyi Dominik Wetzel Donn Eddy @@ -341,6 +369,7 @@ generous deed immortalized in the next stable release of Godot Engine. Eric Ellingson Eric Williams Erkki Seppälä + ET Garcia Evan Rose Fain Faisal Alkubaisi @@ -378,22 +407,20 @@ generous deed immortalized in the next stable release of Godot Engine. Jaiden Gerig Jaime Ruiz-Borau Vizárraga Jako Danar + James James A F Manley Jamiee H Jamie Massey Janders JARKKO PARVIAINEN + Jason Uechi Jean-Baptiste LEPESME Jeff Hungerford Jennifer Graves Jesse Dubay Joe Alden - Joel Fivat - Joel Höglund - Joel Setterberg - Johannes Goslar + Joe Klemmer John Gabriel - John Walker Jomei Jackson Jonas Jonas Bernemann @@ -405,7 +432,6 @@ generous deed immortalized in the next stable release of Godot Engine. Jon Sully Jordy Goodridge Jorge Antunes - Jose Aleman Jose C. Rubio Joseph Catrambone Josh Mitchell @@ -422,19 +448,19 @@ generous deed immortalized in the next stable release of Godot Engine. Karel Němec Kauzig Keedong Park + Keinan Powers Keith Bradner Kent Jofur Kevin McPhillips - Kevin Velasco Kiri Jolly Kjetil Haugland - Klagsam KsyTek Games Kuan Cheang kycho Kyle Appelgate Kyuppin Laurent Tréguier + LEMMiNO Leonardo Dimano Lin Chear Linus Lind Lundgren @@ -447,6 +473,7 @@ generous deed immortalized in the next stable release of Godot Engine. Marco Lardelli Mark Jad Mark Krenz + Markus Martin Markus Michael Egger Martin FIbik Martin Holas @@ -456,16 +483,16 @@ generous deed immortalized in the next stable release of Godot Engine. Marvin Mathieu Matt Edwards - Mauro Pellegrini + Matthew Booe Max Fiedler Maxime Blade Maxwell Megasploot Melissa Mears mewin + Michael Cullen Michael Haney Michał Skwarek - Mikael Olsson Mikayla Mike Birkhead Mike Cunningham @@ -484,12 +511,16 @@ generous deed immortalized in the next stable release of Godot Engine. Nick Allen Nick Macholl Niclas Eriksen + Nicolas Goll-Perrier Nicolás Montaña Nicolas SAN AGUSTIN NZ + '@oddgoo + OKV Oleg Reva Olivier Omar Delarosa + Oscar Domingo Oscar Norlander Pan Ip Parinya Teerakasemsuk @@ -502,16 +533,16 @@ generous deed immortalized in the next stable release of Godot Engine. Penguin Peter Philip Cohoe + Pierre-Nicolas Tollitte Piotr Góral Point08 + Preethi Vaidyanathan pwab Rad Cat Rafa Laguna - Ram Remi Rampin Rémi Verschelde Reneator - Ricardo Alcantara Richard Diss Richard Ivánek Robert Farr (Larington) @@ -522,7 +553,9 @@ generous deed immortalized in the next stable release of Godot Engine. Ronald Ho Hip (CrimsonZA) Ronan Ronny Mühle + Ross Squires Ryan Groom + Sam Caulfield Sam Edson Samuele Zolfanelli Scott D. Yelich @@ -531,15 +564,16 @@ generous deed immortalized in the next stable release of Godot Engine. Sebastian Michailidis Sebastian Vetter Sergio Mello-Grand + Shaher Shane Shane Sicienski Shane Spoor - Shiomi '- Duy Kevin Nguyen + Shiomi - Duy Kevin Nguyen Siim Raidma Simon Jonas Larsen + Simon Schoenenberger Simon Wenner Sintinium - SK smbe19 smo1704 soft circles @@ -547,7 +581,7 @@ generous deed immortalized in the next stable release of Godot Engine. Stefano Caronia Steve Cloete Svenne Krap - Taylor Fahlman + Tannen Helmers Terry tezuvholovdr TheVoiceInMyHead @@ -558,26 +592,30 @@ generous deed immortalized in the next stable release of Godot Engine. Tim Drumheller Tim Erskine Timothy B. MacDonald - Title Plinsut Tobbun Tobias Bradtke - Tom Glenn Toni Duran + Tony Zhao Torgeir Lilleskog Torsten Crass Travis O'Brien Trent Skinner + Triptych + Triumph263 . Troy Bonneau Tryggve Sollid Turgut Temucin Tyler Compton Tyler Stafos UltyX + Uther Valentí Gàmez Vaughan Ling Victor Vigilant Watch + Viktor Ismagilov Vincent Cloutier + Vitor Balbio Vladimir Savin waka nya Wayne Haak @@ -587,9 +625,9 @@ generous deed immortalized in the next stable release of Godot Engine. Wyatt Goodin Yegor Smirnov YiYin Gu - Yuri LaPointe Yuri Sizov Zgegnesh Hemomancer + ΒΑΣΙΛΗΣ ΓΕΩΡΓΑΚΟΠΟΥΛΟΣ 郝晨煜 ## Bronze donors diff --git a/README.md b/README.md index e962f90333a..ad0fe3079c0 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,29 @@ -[![Godot Engine logo](/logo.png)](https://godotengine.org) +# Godot Engine -## Godot Engine +

+ + Godot Engine logo + +

-Homepage: https://godotengine.org +## 2D and 3D cross-platform game engine -#### 2D and 3D cross-platform game engine +**[Godot Engine](https://godotengine.org) is a feature-packed, cross-platform +game engine to create 2D and 3D games from a unified interface.** It provides a +comprehensive set of common tools, so that users can focus on making games +without having to reinvent the wheel. Games can be exported in one click to a +number of platforms, including the major desktop platforms (Linux, macOS, +Windows), mobile platforms (Android, iOS), as well as Web-based platforms +(HTML5) and +[consoles](https://docs.godotengine.org/en/latest/tutorials/platform/consoles.html). -Godot Engine is a feature-packed, cross-platform game engine to create 2D and -3D games from a unified interface. It provides a comprehensive set of common -tools, so that users can focus on making games without having to reinvent the -wheel. Games can be exported in one click to a number of platforms, including -the major desktop platforms (Linux, Mac OSX, Windows) as well as mobile -(Android, iOS) and web-based (HTML5) platforms. - -#### Free, open source and community-driven +## Free, open source and community-driven Godot is completely free and open source under the very permissive MIT license. No strings attached, no royalties, nothing. The users' games are theirs, down to the last line of engine code. Godot's development is fully independent and community-driven, empowering users to help shape their engine to match their -expectations. It is supported by the Software Freedom Conservancy +expectations. It is supported by the [Software Freedom Conservancy](https://sfconservancy.org/) not-for-profit. Before being open sourced in February 2014, Godot had been developed by Juan @@ -28,43 +32,45 @@ years as an in-house engine, used to publish several work-for-hire titles. ![Screenshot of a 3D scene in Godot Engine](https://raw.githubusercontent.com/godotengine/godot-design/master/screenshots/editor_tps_demo_1920x1080.jpg) -### Getting the engine +## Getting the engine -#### Binary downloads +### Binary downloads Official binaries for the Godot editor and the export templates can be found [on the homepage](https://godotengine.org/download). -#### Compiling from source +### Compiling from source [See the official docs](https://docs.godotengine.org/en/latest/development/compiling/) for compilation instructions for every supported platform. -### Community and contributing +## Community and contributing Godot is not only an engine but an ever-growing community of users and engine developers. The main community channels are listed [on the homepage](https://godotengine.org/community). -To get in touch with the developers, the best way is to join the -[#godotengine IRC channel](https://webchat.freenode.net/?channels=godotengine) +To get in touch with the engine developers, the best way is to join the +[#godotengine-devel IRC channel](https://webchat.freenode.net/?channels=godotengine-devel) on Freenode. To get started contributing to the project, see the [contributing guide](CONTRIBUTING.md). -### Documentation and demos +## Documentation and demos The official documentation is hosted on [ReadTheDocs](https://docs.godotengine.org). It is maintained by the Godot community in its own [GitHub repository](https://github.com/godotengine/godot-docs). The [class reference](https://docs.godotengine.org/en/latest/classes/) -is also accessible from within the engine. +is also accessible from the Godot editor. The official demos are maintained in their own [GitHub repository](https://github.com/godotengine/godot-demo-projects) as well. -There are also a number of other learning resources provided by the community, -such as text and video tutorials, demos, etc. Consult the [community channels](https://godotengine.org/community) -for more info. +There are also a number of other +[learning resources](https://docs.godotengine.org/en/latest/community/tutorials.html) +provided by the community, such as text and video tutorials, demos, etc. +Consult the [community channels](https://godotengine.org/community) +for more information. [![Actions Build Status](https://github.com/godotengine/godot/workflows/Godot/badge.svg?branch=master)](https://github.com/godotengine/godot/actions) [![Code Triagers Badge](https://www.codetriage.com/godotengine/godot/badges/users.svg)](https://www.codetriage.com/godotengine/godot) diff --git a/SConstruct b/SConstruct index 207254713a2..3768ada10d2 100644 --- a/SConstruct +++ b/SConstruct @@ -298,9 +298,10 @@ if selected_platform in platform_list: from SCons import __version__ as scons_raw_version scons_ver = env._get_major_minor_revision(scons_raw_version) - if scons_ver >= (3, 1, 1): - env.Tool("compilation_db", toolpath=["misc/scons"]) - env.Alias("compiledb", env.CompilationDatabase("compile_commands.json")) + + if scons_ver >= (4, 0, 0): + env.Tool("compilation_db") + env.Alias("compiledb", env.CompilationDatabase()) if env["dev"]: env["verbose"] = True diff --git a/core/core_builders.py b/core/core_builders.py index b1742627647..7beaf1f5c1a 100644 --- a/core/core_builders.py +++ b/core/core_builders.py @@ -86,10 +86,21 @@ def make_authors_header(target, source, env): def make_donors_header(target, source, env): - sections = ["Platinum sponsors", "Gold sponsors", "Mini sponsors", "Gold donors", "Silver donors", "Bronze donors"] + sections = [ + "Platinum sponsors", + "Gold sponsors", + "Silver sponsors", + "Bronze sponsors", + "Mini sponsors", + "Gold donors", + "Silver donors", + "Bronze donors", + ] sections_id = [ - "DONORS_SPONSOR_PLAT", + "DONORS_SPONSOR_PLATINUM", "DONORS_SPONSOR_GOLD", + "DONORS_SPONSOR_SILVER", + "DONORS_SPONSOR_BRONZE", "DONORS_SPONSOR_MINI", "DONORS_GOLD", "DONORS_SILVER", diff --git a/core/engine.cpp b/core/engine.cpp index cea676f3ea4..a1e67bde5ea 100644 --- a/core/engine.cpp +++ b/core/engine.cpp @@ -163,8 +163,10 @@ Array Engine::get_copyright_info() const { Dictionary Engine::get_donor_info() const { Dictionary donors; - donors["platinum_sponsors"] = array_from_info(DONORS_SPONSOR_PLAT); + donors["platinum_sponsors"] = array_from_info(DONORS_SPONSOR_PLATINUM); donors["gold_sponsors"] = array_from_info(DONORS_SPONSOR_GOLD); + donors["silver_sponsors"] = array_from_info(DONORS_SPONSOR_SILVER); + donors["bronze_sponsors"] = array_from_info(DONORS_SPONSOR_BRONZE); donors["mini_sponsors"] = array_from_info(DONORS_SPONSOR_MINI); donors["gold_donors"] = array_from_info(DONORS_GOLD); donors["silver_donors"] = array_from_info(DONORS_SILVER); diff --git a/core/script_language.cpp b/core/script_language.cpp index 2e8ebd40715..ff96842d3bf 100644 --- a/core/script_language.cpp +++ b/core/script_language.cpp @@ -31,6 +31,7 @@ #include "script_language.h" #include "core/core_string_names.h" +#include "core/io/resource_loader.h" #include "core/os/file_access.h" #include "core/project_settings.h" @@ -167,7 +168,7 @@ void ScriptServer::init_languages() { for (int i = 0; i < script_classes.size(); i++) { Dictionary c = script_classes[i]; - if (!c.has("class") || !c.has("language") || !c.has("path") || !FileAccess::exists(c["path"]) || !c.has("base")) + if (!c.has("class") || !c.has("language") || !c.has("path") || !FileAccess::exists(ResourceLoader::path_remap(c["path"])) || !c.has("base")) continue; add_global_class(c["class"], c["base"], c["language"], c["path"]); } diff --git a/doc/classes/Array.xml b/doc/classes/Array.xml index f7c1d678a20..292c9ab0b97 100644 --- a/doc/classes/Array.xml +++ b/doc/classes/Array.xml @@ -99,7 +99,7 @@ - Returns the last element of the array, or [code]null[/code] if the array is empty. + Returns the last element of the array. Throws an error and returns [code]null[/code] if the array is empty. @@ -192,7 +192,7 @@ - Returns the first element of the array, or [code]null[/code] if the array is empty. + Returns the first element of the array. Throws an error and returns [code]null[/code] if the array is empty. diff --git a/doc/classes/BitMap.xml b/doc/classes/BitMap.xml index 28064e08e75..31ddaf10987 100644 --- a/doc/classes/BitMap.xml +++ b/doc/classes/BitMap.xml @@ -60,6 +60,7 @@ + Applies morphological dilation to the bitmap. The first argument is the dilation amount, Rect2 is the area where the dilation will be applied. diff --git a/doc/classes/Engine.xml b/doc/classes/Engine.xml index 54d637e46df..c74351db5e7 100644 --- a/doc/classes/Engine.xml +++ b/doc/classes/Engine.xml @@ -34,7 +34,7 @@ Returns a Dictionary of Arrays of donor names. - {[code]platinum_sponsors[/code], [code]gold_sponsors[/code], [code]mini_sponsors[/code], [code]gold_donors[/code], [code]silver_donors[/code], [code]bronze_donors[/code]} + {[code]platinum_sponsors[/code], [code]gold_sponsors[/code], [code]silver_sponsors[/code], [code]bronze_sponsors[/code], [code]mini_sponsors[/code], [code]gold_donors[/code], [code]silver_donors[/code], [code]bronze_donors[/code]} diff --git a/doc/classes/JSON.xml b/doc/classes/JSON.xml index fa519152922..0eb7a93e955 100644 --- a/doc/classes/JSON.xml +++ b/doc/classes/JSON.xml @@ -30,6 +30,28 @@ Converts a [Variant] var to JSON text and returns the result. Useful for serializing data to store or send over the network. [b]Note:[/b] The JSON specification does not define integer or float types, but only a [i]number[/i] type. Therefore, converting a Variant to JSON text will convert all numerical values to [float] types. + Use [code]indent[/code] parameter to pretty print the output. + [b]Example output:[/b] + [codeblock] + ## JSON.print(my_dictionary) + {"name":"my_dictionary","version":"1.0.0","entities":[{"name":"entity_0","value":"value_0"},{"name":"entity_1","value":"value_1"}]} + + ## JSON.print(my_dictionary, "\t") + { + "name": "my_dictionary", + "version": "1.0.0", + "entities": [ + { + "name": "entity_0", + "value": "value_0" + }, + { + "name": "entity_1", + "value": "value_1" + } + ] + } + [/codeblock] diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index 2f7b349ba58..2a8762cb606 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -925,6 +925,9 @@ Notification received every frame when the internal physics process flag is set (see [method set_physics_process_internal]). + + Notification received when the node is ready, just before [constant NOTIFICATION_READY] is received. Unlike the latter, it's sent every time the node enters tree, instead of only once. + Notification received from the OS when the mouse enters the game window. Implemented on desktop and web platforms. diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml index 6ea12c6965d..26f8d721bc8 100644 --- a/doc/classes/Vector2.xml +++ b/doc/classes/Vector2.xml @@ -33,7 +33,8 @@ - Returns this vector's angle with respect to the X axis, or [code](1, 0)[/code] vector, in radians. + Returns this vector's angle with respect to the positive X axis, or [code](1, 0)[/code] vector, in radians. + For example, [code]Vector2.RIGHT.angle()[/code] will return zero, [code]Vector2.DOWN.angle()[/code] will return [code]PI / 2[/code] (a quarter turn, or 90 degrees), and [code]Vector2(1, -1).angle()[/code] will return [code]-PI / 4[/code] (a negative eighth turn, or -45 degrees). Equivalent to the result of [method @GDScript.atan2] when called with the vector's [member y] and [member x] as parameters: [code]atan2(y, x)[/code]. diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp index 9a535c4f2eb..a82f19768cb 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -347,7 +347,7 @@ Error OS_Unix::execute(const String &p_path, const List &p_arguments, bo execvp(p_path.utf8().get_data(), &args[0]); // still alive? something failed.. fprintf(stderr, "**ERROR** OS_Unix::execute - Could not create child process while executing: %s\n", p_path.utf8().get_data()); - abort(); + raise(SIGKILL); } if (p_blocking) { diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp index ba653017ef8..6485fa8bd13 100644 --- a/editor/editor_about.cpp +++ b/editor/editor_about.cpp @@ -162,12 +162,15 @@ EditorAbout::EditorAbout() { List donor_sections; donor_sections.push_back(TTR("Platinum Sponsors")); donor_sections.push_back(TTR("Gold Sponsors")); + donor_sections.push_back(TTR("Silver Sponsors")); + donor_sections.push_back(TTR("Bronze Sponsors")); donor_sections.push_back(TTR("Mini Sponsors")); donor_sections.push_back(TTR("Gold Donors")); donor_sections.push_back(TTR("Silver Donors")); donor_sections.push_back(TTR("Bronze Donors")); - const char *const *donor_src[] = { DONORS_SPONSOR_PLAT, DONORS_SPONSOR_GOLD, - DONORS_SPONSOR_MINI, DONORS_GOLD, DONORS_SILVER, DONORS_BRONZE }; + const char *const *donor_src[] = { DONORS_SPONSOR_PLATINUM, DONORS_SPONSOR_GOLD, + DONORS_SPONSOR_SILVER, DONORS_SPONSOR_BRONZE, DONORS_SPONSOR_MINI, + DONORS_GOLD, DONORS_SILVER, DONORS_BRONZE }; tc->add_child(_populate_list(TTR("Donors"), donor_sections, donor_src, 3)); // License diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 36d602284ae..89ffb25bf7e 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -1885,6 +1885,10 @@ EditorPropertyTransform::EditorPropertyTransform() { ////////////// COLOR PICKER ////////////////////// void EditorPropertyColor::_color_changed(const Color &p_color) { + // Cancel the color change if the current color is identical to the new one. + if (get_edited_object()->get(get_edited_property()) == p_color) { + return; + } emit_changed(get_edited_property(), p_color, "", true); } diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 579ea389c64..32c9ca19989 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -1892,14 +1892,18 @@ void ScriptEditor::_update_script_names() { Vector disambiguated_script_names; Vector full_script_paths; for (int j = 0; j < sedata.size(); j++) { - disambiguated_script_names.push_back(sedata[j].name); + disambiguated_script_names.push_back(sedata[j].name.replace("(*)", "")); full_script_paths.push_back(sedata[j].tooltip); } EditorNode::disambiguate_filenames(full_script_paths, disambiguated_script_names); for (int j = 0; j < sedata.size(); j++) { - sedata.write[j].name = disambiguated_script_names[j]; + if (sedata[j].name.ends_with("(*)")) { + sedata.write[j].name = disambiguated_script_names[j] + "(*)"; + } else { + sedata.write[j].name = disambiguated_script_names[j]; + } } EditorHelp *eh = Object::cast_to(tab_container->get_child(i)); diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp index 95175639635..db46b884cb7 100644 --- a/editor/plugins/tile_map_editor_plugin.cpp +++ b/editor/plugins/tile_map_editor_plugin.cpp @@ -895,17 +895,17 @@ void TileMapEditor::_draw_cell(Control *p_viewport, int p_cell, const Point2i &p rect.position += tile_ofs; } - rect.position = p_xform.xform(rect.position); - rect.size *= sc; - Color modulate = node->get_tileset()->tile_get_modulate(p_cell); modulate.a = 0.5; + Transform2D old_transform = p_viewport->get_viewport_transform(); + p_viewport->draw_set_transform_matrix(p_xform); // Take into account TileMap transformation when displaying cell if (r.has_no_area()) { p_viewport->draw_texture_rect(t, rect, false, modulate, p_transpose); } else { p_viewport->draw_texture_rect_region(t, rect, r, modulate, p_transpose); } + p_viewport->draw_set_transform_matrix(old_transform); } void TileMapEditor::_draw_fill_preview(Control *p_viewport, int p_cell, const Point2i &p_point, bool p_flip_h, bool p_flip_v, bool p_transpose, const Point2i &p_autotile_coord, const Transform2D &p_xform) { diff --git a/misc/dist/linux/x-godot-project.xml b/misc/dist/linux/x-godot-project.xml index 0572e4e54ec..9f28bab2ae0 100644 --- a/misc/dist/linux/x-godot-project.xml +++ b/misc/dist/linux/x-godot-project.xml @@ -1,8 +1,8 @@ - - - Godot Engine project - - + + + Godot Engine project + + diff --git a/misc/scons/compilation_db.py b/misc/scons/compilation_db.py deleted file mode 100644 index 87db32adc96..00000000000 --- a/misc/scons/compilation_db.py +++ /dev/null @@ -1,177 +0,0 @@ -# Copyright 2015 MongoDB Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import json -import SCons -import itertools - -# Implements the ability for SCons to emit a compilation database for the MongoDB project. See -# http://clang.llvm.org/docs/JSONCompilationDatabase.html for details on what a compilation -# database is, and why you might want one. The only user visible entry point here is -# 'env.CompilationDatabase'. This method takes an optional 'target' to name the file that -# should hold the compilation database, otherwise, the file defaults to compile_commands.json, -# which is the name that most clang tools search for by default. - -# TODO: Is there a better way to do this than this global? Right now this exists so that the -# emitter we add can record all of the things it emits, so that the scanner for the top level -# compilation database can access the complete list, and also so that the writer has easy -# access to write all of the files. But it seems clunky. How can the emitter and the scanner -# communicate more gracefully? -__COMPILATION_DB_ENTRIES = [] - -# We make no effort to avoid rebuilding the entries. Someday, perhaps we could and even -# integrate with the cache, but there doesn't seem to be much call for it. -class __CompilationDbNode(SCons.Node.Python.Value): - def __init__(self, value): - SCons.Node.Python.Value.__init__(self, value) - self.Decider(changed_since_last_build_node) - - -def changed_since_last_build_node(child, target, prev_ni, node): - """ Dummy decider to force always building""" - return True - - -def makeEmitCompilationDbEntry(comstr): - """ - Effectively this creates a lambda function to capture: - * command line - * source - * target - :param comstr: unevaluated command line - :return: an emitter which has captured the above - """ - user_action = SCons.Action.Action(comstr) - - def EmitCompilationDbEntry(target, source, env): - """ - This emitter will be added to each c/c++ object build to capture the info needed - for clang tools - :param target: target node(s) - :param source: source node(s) - :param env: Environment for use building this node - :return: target(s), source(s) - """ - - dbtarget = __CompilationDbNode(source) - - entry = env.__COMPILATIONDB_Entry( - target=dbtarget, - source=[], - __COMPILATIONDB_UTARGET=target, - __COMPILATIONDB_USOURCE=source, - __COMPILATIONDB_UACTION=user_action, - __COMPILATIONDB_ENV=env, - ) - - # TODO: Technically, these next two lines should not be required: it should be fine to - # cache the entries. However, they don't seem to update properly. Since they are quick - # to re-generate disable caching and sidestep this problem. - env.AlwaysBuild(entry) - env.NoCache(entry) - - __COMPILATION_DB_ENTRIES.append(dbtarget) - - return target, source - - return EmitCompilationDbEntry - - -def CompilationDbEntryAction(target, source, env, **kw): - """ - Create a dictionary with evaluated command line, target, source - and store that info as an attribute on the target - (Which has been stored in __COMPILATION_DB_ENTRIES array - :param target: target node(s) - :param source: source node(s) - :param env: Environment for use building this node - :param kw: - :return: None - """ - - command = env["__COMPILATIONDB_UACTION"].strfunction( - target=env["__COMPILATIONDB_UTARGET"], source=env["__COMPILATIONDB_USOURCE"], env=env["__COMPILATIONDB_ENV"], - ) - - entry = { - "directory": env.Dir("#").abspath, - "command": command, - "file": str(env["__COMPILATIONDB_USOURCE"][0]), - } - - target[0].write(entry) - - -def WriteCompilationDb(target, source, env): - entries = [] - - for s in __COMPILATION_DB_ENTRIES: - entries.append(s.read()) - - with open(str(target[0]), "w") as target_file: - json.dump(entries, target_file, sort_keys=True, indent=4, separators=(",", ": ")) - - -def ScanCompilationDb(node, env, path): - return __COMPILATION_DB_ENTRIES - - -def generate(env, **kwargs): - - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - env["COMPILATIONDB_COMSTR"] = kwargs.get("COMPILATIONDB_COMSTR", "Building compilation database $TARGET") - - components_by_suffix = itertools.chain( - itertools.product( - env["CPPSUFFIXES"], - [ - (static_obj, SCons.Defaults.StaticObjectEmitter, "$CXXCOM"), - (shared_obj, SCons.Defaults.SharedObjectEmitter, "$SHCXXCOM"), - ], - ), - ) - - for entry in components_by_suffix: - suffix = entry[0] - builder, base_emitter, command = entry[1] - - # Ensure we have a valid entry - # used to auto ignore header files - if suffix in builder.emitter: - emitter = builder.emitter[suffix] - builder.emitter[suffix] = SCons.Builder.ListEmitter([emitter, makeEmitCompilationDbEntry(command),]) - - env["BUILDERS"]["__COMPILATIONDB_Entry"] = SCons.Builder.Builder( - action=SCons.Action.Action(CompilationDbEntryAction, None), - ) - - env["BUILDERS"]["__COMPILATIONDB_Database"] = SCons.Builder.Builder( - action=SCons.Action.Action(WriteCompilationDb, "$COMPILATIONDB_COMSTR"), - target_scanner=SCons.Scanner.Scanner(function=ScanCompilationDb, node_class=None), - ) - - def CompilationDatabase(env, target): - result = env.__COMPILATIONDB_Database(target=target, source=[]) - - env.AlwaysBuild(result) - env.NoCache(result) - - return result - - env.AddMethod(CompilationDatabase, "CompilationDatabase") - - -def exists(env): - return True diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.java b/platform/android/java/lib/src/org/godotengine/godot/Godot.java index afd063fbe55..0760d3130d7 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.java @@ -53,6 +53,8 @@ import android.content.SharedPreferences.Editor; import android.content.pm.ConfigurationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.graphics.Point; +import android.graphics.Rect; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; @@ -73,6 +75,7 @@ import android.view.Surface; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; +import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; import android.widget.Button; @@ -245,8 +248,6 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe public GodotView mView; private boolean godot_initialized = false; - private GodotEditText mEditText; - private SensorManager mSensorManager; private Sensor mAccelerometer; private Sensor mGravity; @@ -315,11 +316,29 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); setContentView(layout); + // GodotEditText layout + GodotEditText edittext = new GodotEditText(this); + edittext.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); + // ...add to FrameLayout + layout.addView(edittext); + mView = new GodotView(this, xrMode, use_gl3, use_32_bits, use_debug_opengl); layout.addView(mView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + edittext.setView(mView); + io.setEdit(edittext); - mEditText = new GodotEditText(this, mView); - io.setEdit(mEditText); + mView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + Point fullSize = new Point(); + getWindowManager().getDefaultDisplay().getSize(fullSize); + Rect gameSize = new Rect(); + mView.getWindowVisibleDisplayFrame(gameSize); + + final int keyboardHeight = fullSize.y - gameSize.bottom; + GodotLib.setVirtualKeyboardHeight(keyboardHeight); + } + }); final String[] current_command_line = command_line; mView.queueEvent(new Runnable() { @@ -552,7 +571,6 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe super.onCreate(icicle); Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); mClipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); pluginRegistry = GodotPluginRegistry.initializePluginRegistry(this); @@ -691,21 +709,8 @@ public abstract class Godot extends FragmentActivity implements SensorEventListe initializeGodot(); } - @Override - protected void onStart() { - super.onStart(); - - mView.post(new Runnable() { - @Override - public void run() { - mEditText.onInitView(); - } - }); - } - @Override protected void onDestroy() { - mEditText.onDestroyView(); for (int i = 0; i < singleton_count; i++) { singletons[i].onMainDestroy(); diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java index 2b560b1adc6..b76a494a586 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotEditText.java @@ -32,27 +32,16 @@ package org.godotengine.godot.input; import org.godotengine.godot.*; -import android.app.Activity; import android.content.Context; -import android.graphics.Point; -import android.graphics.Rect; import android.os.Handler; import android.os.Message; import android.text.InputFilter; import android.text.InputType; import android.util.AttributeSet; -import android.view.Gravity; import android.view.KeyEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewGroup.LayoutParams; -import android.view.ViewTreeObserver; -import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; -import android.widget.FrameLayout; -import android.widget.PopupWindow; import java.lang.ref.WeakReference; @@ -67,8 +56,6 @@ public class GodotEditText extends EditText { // Fields // =========================================================== private GodotView mView; - private View mKeyboardView; - private PopupWindow mKeyboardWindow; private GodotTextInputWrapper mInputWrapper; private EditHandler sHandler = new EditHandler(this); private String mOriginText; @@ -93,52 +80,24 @@ public class GodotEditText extends EditText { // =========================================================== // Constructors // =========================================================== - public GodotEditText(final Context context, final GodotView view) { + public GodotEditText(final Context context) { super(context); - - setPadding(0, 0, 0, 0); - setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE); - setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); - - mView = view; - mInputWrapper = new GodotTextInputWrapper(mView, this); - setOnEditorActionListener(mInputWrapper); - view.requestFocus(); - - // Create a popup window with an invisible layout for the virtual keyboard, - // so the view can be resized to get the vk height without resizing the main godot view. - final FrameLayout keyboardLayout = new FrameLayout(context); - keyboardLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - keyboardLayout.setVisibility(View.INVISIBLE); - keyboardLayout.addView(this); - mKeyboardView = keyboardLayout; - - mKeyboardWindow = new PopupWindow(keyboardLayout, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); - mKeyboardWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); - mKeyboardWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); - mKeyboardWindow.setFocusable(true); // for the text edit to work - mKeyboardWindow.setTouchable(false); // inputs need to go through - - keyboardLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - @Override - public void onGlobalLayout() { - Point fullSize = new Point(); - ((Activity)mView.getContext()).getWindowManager().getDefaultDisplay().getSize(fullSize); - Rect gameSize = new Rect(); - mKeyboardWindow.getContentView().getWindowVisibleDisplayFrame(gameSize); - - final int keyboardHeight = fullSize.y - gameSize.bottom; - GodotLib.setVirtualKeyboardHeight(keyboardHeight); - } - }); + this.initView(); } - public void onInitView() { - mKeyboardWindow.showAtLocation(mView, Gravity.NO_GRAVITY, 0, 0); + public GodotEditText(final Context context, final AttributeSet attrs) { + super(context, attrs); + this.initView(); } - public void onDestroyView() { - mKeyboardWindow.dismiss(); + public GodotEditText(final Context context, final AttributeSet attrs, final int defStyle) { + super(context, attrs, defStyle); + this.initView(); + } + + protected void initView() { + this.setPadding(0, 0, 0, 0); + this.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_DONE); } public boolean isMultiline() { @@ -170,7 +129,7 @@ public class GodotEditText extends EditText { edit.mInputWrapper.setOriginText(text); edit.addTextChangedListener(edit.mInputWrapper); - final InputMethodManager imm = (InputMethodManager)mKeyboardView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(edit, 0); } } break; @@ -179,7 +138,7 @@ public class GodotEditText extends EditText { GodotEditText edit = (GodotEditText)msg.obj; edit.removeTextChangedListener(mInputWrapper); - final InputMethodManager imm = (InputMethodManager)mKeyboardView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + final InputMethodManager imm = (InputMethodManager)mView.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(edit.getWindowToken(), 0); edit.mView.requestFocus(); } break; @@ -192,6 +151,17 @@ public class GodotEditText extends EditText { p_edit_text.setFilters(filters); } + // =========================================================== + // Getter & Setter + // =========================================================== + public void setView(final GodotView view) { + this.mView = view; + if (mInputWrapper == null) + mInputWrapper = new GodotTextInputWrapper(mView, this); + this.setOnEditorActionListener(mInputWrapper); + view.requestFocus(); + } + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== diff --git a/platform/android/logo.png b/platform/android/logo.png index df445f6a9c9..f44d360a25d 100644 Binary files a/platform/android/logo.png and b/platform/android/logo.png differ diff --git a/platform/iphone/logo.png b/platform/iphone/logo.png index 405b6f93ca1..966d8aa70a0 100644 Binary files a/platform/iphone/logo.png and b/platform/iphone/logo.png differ diff --git a/platform/osx/logo.png b/platform/osx/logo.png index 834bbf3ba6c..b5a660b1657 100644 Binary files a/platform/osx/logo.png and b/platform/osx/logo.png differ diff --git a/platform/windows/joypad_windows.cpp b/platform/windows/joypad_windows.cpp index 1abd2d162dd..74b1d72e49c 100644 --- a/platform/windows/joypad_windows.cpp +++ b/platform/windows/joypad_windows.cpp @@ -153,8 +153,8 @@ bool JoypadWindows::setup_dinput_joypad(const DIDEVICEINSTANCE *instance) { if (have_device(instance->guidInstance) || num == -1) return false; - d_joypads[joypad_count] = dinput_gamepad(); - dinput_gamepad *joy = &d_joypads[joypad_count]; + d_joypads[num] = dinput_gamepad(); + dinput_gamepad *joy = &d_joypads[num]; const DWORD devtype = (instance->dwDevType & 0xFF); @@ -178,7 +178,7 @@ bool JoypadWindows::setup_dinput_joypad(const DIDEVICEINSTANCE *instance) { WORD version = 0; sprintf_s(uid, "%04x%04x%04x%04x%04x%04x%04x%04x", type, 0, vendor, 0, product, 0, version, 0); - id_to_change = joypad_count; + id_to_change = num; slider_count = 0; joy->di_joy->SetDataFormat(&c_dfDIJoystick2); diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 88125087da9..e2acc5321b8 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -188,7 +188,7 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & if (p_mode != PROCESS_CACHE && align != ALIGN_FILL) wofs += line_ofs; - int begin = wofs; + int begin = margin; Ref cfont = _find_font(it); if (cfont.is_null()) diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 81c7b382c7f..e95d8616d85 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -2873,6 +2873,7 @@ void Node::_bind_methods() { BIND_CONSTANT(NOTIFICATION_PATH_CHANGED); BIND_CONSTANT(NOTIFICATION_INTERNAL_PROCESS); BIND_CONSTANT(NOTIFICATION_INTERNAL_PHYSICS_PROCESS); + BIND_CONSTANT(NOTIFICATION_POST_ENTER_TREE); BIND_CONSTANT(NOTIFICATION_WM_MOUSE_ENTER); BIND_CONSTANT(NOTIFICATION_WM_MOUSE_EXIT);